specOf method

Future<UPdfAnnotationSpec?> specOf(
  1. int pageIndex,
  2. int objectNumber
)

Implementation

Future<UPdfAnnotationSpec?> specOf(int pageIndex, int objectNumber) async {
  final Object? annotation = await current(UPdfRef(objectNumber, 0));
  if (annotation is! UPdfDict) return null;
  final Object? rectObject = await document.resolve(annotation["Rect"]);
  final Rect rect = uPdfRectFromArray(rectObject is List<Object?> ? rectObject : null, fallback: Rect.zero);
  final Object? subtype = annotation["Subtype"];
  final String type = subtype is UPdfName ? subtype.value : "";
  final Object? contents = await document.resolve(annotation["Contents"]);
  final Object? author = await document.resolve(annotation["T"]);
  final Object? opacity = await document.resolve(annotation["CA"]);
  final Object? colorObject = await document.resolve(annotation["C"]);
  Color color = const Color(0xFFFFEB3B);
  if (colorObject is List<Object?> && colorObject.length >= 3) {
    final List<double> rgb = colorObject.whereType<num>().map((num value) => value.toDouble()).toList();
    if (rgb.length >= 3) color = Color.fromARGB(255, (rgb[0] * 255).round().clamp(0, 255), (rgb[1] * 255).round().clamp(0, 255), (rgb[2] * 255).round().clamp(0, 255));
  }
  final List<Rect> quads = <Rect>[];
  final Object? quadObject = await document.resolve(annotation["QuadPoints"]);
  if (quadObject is List<Object?>) {
    final List<double> numbers = quadObject.whereType<num>().map((num value) => value.toDouble()).toList();
    for (int i = 0; i + 7 < numbers.length; i += 8) {
      quads.add(Rect.fromLTRB(min(numbers[i], numbers[i + 2]), min(numbers[i + 1], numbers[i + 5]), max(numbers[i], numbers[i + 2]), max(numbers[i + 1], numbers[i + 5])));
    }
  }
  final List<List<Offset>> ink = <List<Offset>>[];
  final Object? inkObject = await document.resolve(annotation["InkList"]);
  if (inkObject is List<Object?>) {
    for (final Object? entry in inkObject) {
      final Object? path = await document.resolve(entry);
      if (path is! List<Object?>) continue;
      final List<double> numbers = path.whereType<num>().map((num value) => value.toDouble()).toList();
      final List<Offset> points = <Offset>[];
      for (int i = 0; i + 1 < numbers.length; i += 2) {
        points.add(Offset(numbers[i], numbers[i + 1]));
      }
      if (points.isNotEmpty) ink.add(points);
    }
  }
  return UPdfAnnotationSpec(
    style: _styleFromSubtype(type),
    rect: rect,
    quads: quads,
    inkPaths: ink,
    color: color,
    opacity: opacity is num ? opacity.toDouble() : 1,
    contents: contents is UPdfString ? contents.text : "",
    author: author is UPdfString ? author.text : "",
    rtl: contents is UPdfString && UDocText.isRtl(contents.text),
  );
}