destination method

Future<UDocDestination?> destination(
  1. Object? value, {
  2. int depth = 0,
})

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);
}