From 66c961010db971fc7446294938b38843456308bb Mon Sep 17 00:00:00 2001 From: Sebastian Rasmussen Date: Tue, 10 Jan 2012 19:44:31 +0100 Subject: Automatically load page tree when accessing a page/page count. --- apps/pdfapp.c | 9 --------- apps/pdfclean.c | 3 --- apps/pdfdraw.c | 9 --------- apps/pdfinfo.c | 1 - apps/pdfshow.c | 3 --- pdf/mupdf.h | 1 - pdf/pdf_page.c | 53 ++++++++++++++++++++++++++++++++--------------------- 7 files changed, 32 insertions(+), 47 deletions(-) diff --git a/apps/pdfapp.c b/apps/pdfapp.c index f8c9c79e..053d120d 100644 --- a/apps/pdfapp.c +++ b/apps/pdfapp.c @@ -164,15 +164,6 @@ static void pdfapp_open_pdf(pdfapp_t *app, char *filename, int fd) * Start at first page */ - fz_try(ctx) - { - pdf_load_page_tree(app->xref); - } - fz_catch(ctx) - { - pdfapp_error(app, "cannot load page tree"); - } - app->pagecount = pdf_count_pages(app->xref); app->outline = pdf_load_outline(app->xref); diff --git a/apps/pdfclean.c b/apps/pdfclean.c index f0a33918..2e7aa732 100644 --- a/apps/pdfclean.c +++ b/apps/pdfclean.c @@ -290,9 +290,6 @@ static void retainpages(int argc, char **argv) { fz_obj *oldroot, *root, *pages, *kids, *countobj, *parent, *olddests; - /* Load the old page tree */ - pdf_load_page_tree(xref); - /* Keep only pages/type and (reduced) dest entries to avoid * references to unretained pages */ oldroot = fz_dict_gets(xref->trailer, "Root"); diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c index 91d09c6c..cc125a69 100644 --- a/apps/pdfdraw.c +++ b/apps/pdfdraw.c @@ -455,15 +455,6 @@ int main(int argc, char **argv) fz_throw(ctx, "cannot open document: %s", filename); } - fz_try(ctx) - { - pdf_load_page_tree(xref); - } - fz_catch(ctx) - { - fz_throw(ctx, "cannot load page tree: %s", filename); - } - if (showxml) printf("\n", filename); diff --git a/apps/pdfinfo.c b/apps/pdfinfo.c index 049e4617..054f0985 100644 --- a/apps/pdfinfo.c +++ b/apps/pdfinfo.c @@ -994,7 +994,6 @@ int main(int argc, char **argv) filename = argv[fz_optind]; printf("%s:\n", filename); xref = pdf_open_xref(ctx, filename, password); - pdf_load_page_tree(xref); pagecount = pdf_count_pages(xref); showglobalinfo(); diff --git a/apps/pdfshow.c b/apps/pdfshow.c index e10e5e08..300da9ca 100644 --- a/apps/pdfshow.c +++ b/apps/pdfshow.c @@ -46,9 +46,6 @@ static void showpagetree(void) if (!xref) fz_throw(ctx, "no file specified"); - if (!xref->page_len) - pdf_load_page_tree(xref); - count = pdf_count_pages(xref); for (i = 0; i < count; i++) { diff --git a/pdf/mupdf.h b/pdf/mupdf.h index cd3c1d82..d9a6b7c6 100644 --- a/pdf/mupdf.h +++ b/pdf/mupdf.h @@ -451,7 +451,6 @@ struct pdf_page_s pdf_annot *annots; }; -void pdf_load_page_tree(pdf_xref *xref); int pdf_find_page_number(pdf_xref *xref, fz_obj *pageobj); int pdf_count_pages(pdf_xref *xref); diff --git a/pdf/pdf_page.c b/pdf/pdf_page.c index 81e89e7f..e8b27ccc 100644 --- a/pdf/pdf_page.c +++ b/pdf/pdf_page.c @@ -9,22 +9,6 @@ struct info fz_obj *rotate; }; -int -pdf_count_pages(pdf_xref *xref) -{ - return xref->page_len; -} - -int -pdf_find_page_number(pdf_xref *xref, fz_obj *page) -{ - int i, num = fz_to_num(page); - for (i = 0; i < xref->page_len; i++) - if (num == fz_to_num(xref->page_refs[i])) - return i; - return -1; -} - static void put_marker_bool(fz_context *ctx, fz_obj *rdb, char *marker, int val) { @@ -116,14 +100,21 @@ pdf_load_page_tree_node(pdf_xref *xref, fz_obj *node, struct info info) fz_dict_unmark(node); } -void +static void pdf_load_page_tree(pdf_xref *xref) { - struct info info; fz_context *ctx = xref->ctx; - fz_obj *catalog = fz_dict_gets(xref->trailer, "Root"); - fz_obj *pages = fz_dict_gets(catalog, "Pages"); - fz_obj *count = fz_dict_gets(pages, "Count"); + fz_obj *catalog; + fz_obj *pages; + fz_obj *count; + struct info info; + + if (xref->page_len) + return; + + catalog = fz_dict_gets(xref->trailer, "Root"); + pages = fz_dict_gets(catalog, "Pages"); + count = fz_dict_gets(pages, "Count"); if (!fz_is_dict(pages)) fz_throw(ctx, "missing page tree"); @@ -143,6 +134,25 @@ pdf_load_page_tree(pdf_xref *xref) pdf_load_page_tree_node(xref, pages, info); } +int +pdf_count_pages(pdf_xref *xref) +{ + pdf_load_page_tree(xref); + return xref->page_len; +} + +int +pdf_find_page_number(pdf_xref *xref, fz_obj *page) +{ + int i, num = fz_to_num(page); + + pdf_load_page_tree(xref); + for (i = 0; i < xref->page_len; i++) + if (num == fz_to_num(xref->page_refs[i])) + return i; + return -1; +} + /* We need to know whether to install a page-level transparency group */ static int pdf_resources_use_blending(fz_context *ctx, fz_obj *rdb); @@ -303,6 +313,7 @@ pdf_load_page(pdf_xref *xref, int number) fz_rect mediabox, cropbox; fz_context *ctx = xref->ctx; + pdf_load_page_tree(xref); if (number < 0 || number >= xref->page_len) fz_throw(ctx, "cannot find page %d", number + 1); -- cgit v1.2.3