diff options
-rw-r--r-- | include/mupdf/pdf/annot.h | 2 | ||||
-rw-r--r-- | include/mupdf/pdf/page.h | 1 | ||||
-rw-r--r-- | source/pdf/pdf-annot.c | 18 | ||||
-rw-r--r-- | source/pdf/pdf-page.c | 3 |
4 files changed, 14 insertions, 10 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h index bf912ef9..417f5fe3 100644 --- a/include/mupdf/pdf/annot.h +++ b/include/mupdf/pdf/annot.h @@ -64,7 +64,7 @@ pdf_obj *pdf_load_name_tree(pdf_document *doc, char *which); fz_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm); -pdf_annot *pdf_load_annots(pdf_document *, pdf_obj *annots, pdf_page *page); +void pdf_load_annots(pdf_document *, pdf_page *page, pdf_obj *annots); void pdf_update_annot(pdf_document *, pdf_annot *annot); void pdf_free_annot(fz_context *ctx, pdf_annot *link); diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h index f0a8de0d..e6c4f9b2 100644 --- a/include/mupdf/pdf/page.h +++ b/include/mupdf/pdf/page.h @@ -84,6 +84,7 @@ struct pdf_page_s pdf_obj *contents; fz_link *links; pdf_annot *annots; + pdf_annot **annot_tailp; pdf_annot *changed_annots; pdf_annot *deleted_annots; pdf_annot *tmp_annots; diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index edab4cd5..c0436885 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -491,8 +491,8 @@ static const char *annot_type_str(fz_annot_type type) } } -pdf_annot * -pdf_load_annots(pdf_document *doc, pdf_obj *annots, pdf_page *page) +void +pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots) { pdf_annot *annot, *head, **itr; pdf_obj *obj, *ap, *as, *n, *rect; @@ -505,6 +505,7 @@ pdf_load_annots(pdf_document *doc, pdf_obj *annots, pdf_page *page) fz_var(keep_annot); head = NULL; + itr = &head; len = pdf_array_len(annots); /* @@ -515,7 +516,6 @@ pdf_load_annots(pdf_document *doc, pdf_obj *annots, pdf_page *page) */ fz_try(ctx) { - itr = &head; for (i = 0; i < len; i++) { obj = pdf_array_get(annots, i); @@ -617,7 +617,8 @@ pdf_load_annots(pdf_document *doc, pdf_obj *annots, pdf_page *page) } } - return head; + page->annots = head; + page->annot_tailp = itr; } void @@ -710,7 +711,6 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) { fz_context *ctx = doc->ctx; pdf_annot *annot = NULL; - pdf_annot **lastptr; pdf_obj *annot_obj = pdf_new_dict(doc, 0); pdf_obj *ind_obj = NULL; @@ -757,9 +757,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type) pdf_free_annot below actually frees a list. Put the new annot at the end of the list, so that it will be drawn last. */ - for (lastptr = &page->annots; *lastptr; lastptr = &(*lastptr)->next) - ; - *lastptr = annot; + *page->annot_tailp = annot; + page->annot_tailp = &annot->next; doc->dirty = 1; } @@ -800,6 +799,9 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot) return; *annotptr = annot->next; + /* If the removed annotation was the last in the list adjust the end pointer */ + if (*annotptr == NULL) + page->annot_tailp = annotptr; /* Stick it in the deleted list */ annot->next = page->deleted_annots; diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c index 29366d62..602564ce 100644 --- a/source/pdf/pdf-page.c +++ b/source/pdf/pdf-page.c @@ -365,6 +365,7 @@ pdf_load_page(pdf_document *doc, int number) page->transparency = 0; page->links = NULL; page->annots = NULL; + page->annot_tailp = &page->annots; page->deleted_annots = NULL; page->tmp_annots = NULL; page->me = pdf_keep_obj(pageobj); @@ -423,7 +424,7 @@ pdf_load_page(pdf_document *doc, int number) if (obj) { page->links = pdf_load_link_annots(doc, obj, &page->ctm); - page->annots = pdf_load_annots(doc, obj, page); + pdf_load_annots(doc, page, obj); } } fz_catch(ctx) |