destination method
Implementation
Future<UDocDestination?> destination(Object? value, {int depth = 0}) async {
if (depth > 8) return null;
final Object? resolved = await resolve(value);
if (resolved is UPdfString || resolved is UPdfName) {
final String name = resolved is UPdfString ? resolved.text : (resolved! as UPdfName).value;
final Object? named = await _lookupNamedDestination(name);
if (named == null) return null;
return destination(named, depth: depth + 1);
}
if (resolved is UPdfDict) return destination(resolved["D"], depth: depth + 1);
if (resolved is! List<Object?> || resolved.isEmpty) return null;
final Object? target = resolved.first;
int pageIndex = 0;
if (target is UPdfRef) {
final Map<int, int> map = await _pageIndexMap();
pageIndex = map[target.number] ?? 0;
} else if (target is num) {
pageIndex = target.toInt();
}
UDocFit fit = UDocFit.custom;
double? left;
double? top;
double? zoom;
if (resolved.length > 1) {
final Object? mode = resolved[1];
final String modeName = mode is UPdfName ? mode.value : "";
switch (modeName) {
case "XYZ":
left = resolved.length > 2 && resolved[2] is num ? (resolved[2]! as num).toDouble() : null;
top = resolved.length > 3 && resolved[3] is num ? (resolved[3]! as num).toDouble() : null;
zoom = resolved.length > 4 && resolved[4] is num ? (resolved[4]! as num).toDouble() : null;
break;
case "Fit":
fit = UDocFit.page;
break;
case "FitH":
case "FitBH":
fit = UDocFit.width;
top = resolved.length > 2 && resolved[2] is num ? (resolved[2]! as num).toDouble() : null;
break;
case "FitV":
case "FitBV":
fit = UDocFit.height;
left = resolved.length > 2 && resolved[2] is num ? (resolved[2]! as num).toDouble() : null;
break;
case "FitR":
fit = UDocFit.visible;
break;
default:
break;
}
}
return UDocDestination(pageIndex: pageIndex, left: left, top: top, zoom: zoom, fitMode: fit);
}