summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-page.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-10-12 13:58:00 +0200
committerTor Andersson <tor.andersson@artifex.com>2017-10-12 15:18:07 +0200
commit2ba9166cfb7590e3422d691418353de027276c17 (patch)
tree2cb360770c5fa15dc412b33409d64f6962832cf9 /source/pdf/pdf-page.c
parent595e923e6ef87d86c1455665a2ffbececf2f44ed (diff)
downloadmupdf-2ba9166cfb7590e3422d691418353de027276c17.tar.xz
Don't cache page count in pdf_document.
Make sure any changes to the page tree are always reflected immediately. The rev_page_map lookup cache exists when we load the outlines in order to resolve links faster, so we don't need to worry about that one. The linear_page_refs stuff is more troublesome, so don't mix editing a PDF with progressive loading!
Diffstat (limited to 'source/pdf/pdf-page.c')
-rw-r--r--source/pdf/pdf-page.c21
1 files changed, 8 insertions, 13 deletions
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index de12fb71..90f77f1e 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -8,9 +8,7 @@
int
pdf_count_pages(fz_context *ctx, pdf_document *doc)
{
- if (doc->page_count == 0)
- doc->page_count = pdf_to_int(ctx, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages/Count"));
- return doc->page_count;
+ return pdf_to_int(ctx, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages/Count"));
}
static int
@@ -28,7 +26,7 @@ pdf_load_page_tree_imp(fz_context *ctx, pdf_document *doc, pdf_obj *node, int id
{
for (i = 0; i < n; ++i)
{
- if (idx >= doc->page_count)
+ if (idx >= doc->rev_page_count)
fz_throw(ctx, FZ_ERROR_GENERIC, "too many kids in page tree");
doc->rev_page_map[idx].page = idx;
doc->rev_page_map[idx].object = pdf_to_num(ctx, pdf_array_get(ctx, kids, i));
@@ -52,7 +50,7 @@ pdf_load_page_tree_imp(fz_context *ctx, pdf_document *doc, pdf_obj *node, int id
}
else if (pdf_name_eq(ctx, type, PDF_NAME_Page))
{
- if (idx >= doc->page_count)
+ if (idx >= doc->rev_page_count)
fz_throw(ctx, FZ_ERROR_GENERIC, "too many kids in page tree");
doc->rev_page_map[idx].page = idx;
doc->rev_page_map[idx].object = pdf_to_num(ctx, node);
@@ -78,10 +76,10 @@ pdf_load_page_tree(fz_context *ctx, pdf_document *doc)
{
if (!doc->rev_page_map)
{
- int n = pdf_count_pages(ctx, doc);
- doc->rev_page_map = fz_malloc_array(ctx, n, sizeof *doc->rev_page_map);
+ doc->rev_page_count = pdf_count_pages(ctx, doc);
+ doc->rev_page_map = fz_malloc_array(ctx, doc->rev_page_count, sizeof *doc->rev_page_map);
pdf_load_page_tree_imp(ctx, doc, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages"), 0);
- qsort(doc->rev_page_map, n, sizeof *doc->rev_page_map, cmp_rev_page_map);
+ qsort(doc->rev_page_map, doc->rev_page_count, sizeof *doc->rev_page_map, cmp_rev_page_map);
}
}
@@ -90,6 +88,7 @@ pdf_drop_page_tree(fz_context *ctx, pdf_document *doc)
{
fz_free(ctx, doc->rev_page_map);
doc->rev_page_map = NULL;
+ doc->rev_page_count = 0;
}
enum
@@ -285,7 +284,7 @@ static int
pdf_lookup_page_number_fast(fz_context *ctx, pdf_document *doc, int needle)
{
int l = 0;
- int r = doc->page_count - 1;
+ int r = doc->rev_page_count - 1;
while (l <= r)
{
int m = (l + r) >> 1;
@@ -1020,8 +1019,6 @@ pdf_delete_page(fz_context *ctx, pdf_document *doc, int at)
pdf_dict_put_drop(ctx, parent, PDF_NAME_Count, pdf_new_int(ctx, doc, count - 1));
parent = pdf_dict_get(ctx, parent, PDF_NAME_Parent);
}
-
- doc->page_count = 0; /* invalidate cached value */
}
void
@@ -1117,6 +1114,4 @@ pdf_insert_page(fz_context *ctx, pdf_document *doc, int at, pdf_obj *page_ref)
pdf_dict_put_drop(ctx, parent, PDF_NAME_Count, pdf_new_int(ctx, doc, count + 1));
parent = pdf_dict_get(ctx, parent, PDF_NAME_Parent);
}
-
- doc->page_count = 0; /* invalidate cached value */
}