summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mupdf/pdf/annot.h2
-rw-r--r--include/mupdf/pdf/page.h1
-rw-r--r--source/pdf/pdf-annot.c18
-rw-r--r--source/pdf/pdf-page.c3
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)