summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2012-01-10 19:44:31 +0100
committerSebastian Rasmussen <sebras@gmail.com>2012-01-10 19:59:33 +0100
commit66c961010db971fc7446294938b38843456308bb (patch)
tree7c369b6cd6af029b3a381edcc98173ca94081a81
parent0230a0417212172c391483d054364fb081c79168 (diff)
downloadmupdf-66c961010db971fc7446294938b38843456308bb.tar.xz
Automatically load page tree when accessing a page/page count.
-rw-r--r--apps/pdfapp.c9
-rw-r--r--apps/pdfclean.c3
-rw-r--r--apps/pdfdraw.c9
-rw-r--r--apps/pdfinfo.c1
-rw-r--r--apps/pdfshow.c3
-rw-r--r--pdf/mupdf.h1
-rw-r--r--pdf/pdf_page.c53
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("<document name=\"%s\">\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);