summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-appearance.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/pdf-appearance.c')
-rw-r--r--source/pdf/pdf-appearance.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index f22c97c8..5982ca88 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -2527,3 +2527,54 @@ void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
pdf_clean_obj(ctx, obj);
}
}
+
+void
+pdf_update_annot(fz_context *ctx, pdf_annot *annot)
+{
+ pdf_document *doc = annot->page->doc;
+ pdf_obj *obj, *ap, *as, *n;
+
+ if (doc->update_appearance)
+ doc->update_appearance(ctx, doc, annot);
+
+ obj = annot->obj;
+
+ ap = pdf_dict_get(ctx, obj, PDF_NAME_AP);
+ as = pdf_dict_get(ctx, obj, PDF_NAME_AS);
+
+ if (pdf_is_dict(ctx, ap))
+ {
+ pdf_hotspot *hp = &doc->hotspot;
+
+ n = NULL;
+
+ if (hp->num == pdf_to_num(ctx, obj) && (hp->state & HOTSPOT_POINTER_DOWN))
+ {
+ n = pdf_dict_get(ctx, ap, PDF_NAME_D); /* down state */
+ }
+
+ if (n == NULL)
+ n = pdf_dict_get(ctx, ap, PDF_NAME_N); /* normal state */
+
+ /* lookup current state in sub-dictionary */
+ if (!pdf_is_stream(ctx, n))
+ n = pdf_dict_get(ctx, n, as);
+
+ pdf_drop_xobject(ctx, annot->ap);
+ annot->ap = NULL;
+
+ if (pdf_is_stream(ctx, n))
+ {
+ fz_try(ctx)
+ {
+ annot->ap = pdf_load_xobject(ctx, doc, n);
+ annot->ap_iteration = annot->ap->iteration;
+ }
+ fz_catch(ctx)
+ {
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "ignoring broken annotation");
+ }
+ }
+ }
+}