specOf method
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),
);
}