summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@hotmail.com>2009-07-09 02:03:19 +0200
committerSebastian Rasmussen <sebras@hotmail.com>2009-07-09 02:03:19 +0200
commit1ef9dff0e7ad7112025efe273ae855f6d2ad5f36 (patch)
tree08240b59b6ab17fc48ef16f1c5160ed447285498 /apps
parent60a1411f016d2fecce12abf715a10d7e7faf886f (diff)
downloadmupdf-1ef9dff0e7ad7112025efe273ae855f6d2ad5f36.tar.xz
Parse page tree on-demand instead of parsing the entire tree after reading xref.
Diffstat (limited to 'apps')
-rw-r--r--apps/common/pdfapp.c52
-rw-r--r--apps/common/pdftool.c16
-rw-r--r--apps/mozilla/moz_main.c46
-rw-r--r--apps/pdfapp.h2
-rw-r--r--apps/pdfdraw.c11
-rw-r--r--apps/pdfinfo.c17
-rw-r--r--apps/pdftool.h3
-rw-r--r--apps/unix/x11pdf.c3
8 files changed, 59 insertions, 91 deletions
diff --git a/apps/common/pdfapp.c b/apps/common/pdfapp.c
index 7b52b744..f4cea83f 100644
--- a/apps/common/pdfapp.c
+++ b/apps/common/pdfapp.c
@@ -114,14 +114,6 @@ void pdfapp_open(pdfapp_t *app, char *filename)
}
/*
- * Load page tree
- */
-
- error = pdf_loadpagetree(&app->pages, app->xref);
- if (error)
- pdfapp_error(app, error);
-
- /*
* Load meta information
* TODO: move this into mupdf library
*/
@@ -167,6 +159,7 @@ void pdfapp_open(pdfapp_t *app, char *filename)
* Start at first page
*/
+ app->pagecount = app->xref->pagecount;
app->shrinkwrap = 1;
if (app->pageno < 1)
app->pageno = 1;
@@ -183,10 +176,6 @@ void pdfapp_open(pdfapp_t *app, char *filename)
void pdfapp_close(pdfapp_t *app)
{
- if (app->pages)
- pdf_droppagetree(app->pages);
- app->pages = nil;
-
if (app->page)
pdf_droppage(app->page);
app->page = nil;
@@ -257,14 +246,16 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage)
pdf_droppage(app->page);
app->page = nil;
- obj = pdf_getpageobject(app->pages, app->pageno - 1);
+ error = pdf_getpageobject(app->xref, app->pageno, &obj);
+ if (error)
+ pdfapp_error(app, error);
error = pdf_loadpage(&app->page, app->xref, obj);
if (error)
pdfapp_error(app, error);
sprintf(buf, "%s - %d/%d", app->doctitle,
- app->pageno, pdf_getpagecount(app->pages));
+ app->pageno, app->xref->pagecount);
wintitle(app, buf);
}
@@ -321,24 +312,21 @@ static void pdfapp_gotouri(pdfapp_t *app, fz_obj *uri)
static void pdfapp_gotopage(pdfapp_t *app, fz_obj *obj)
{
- int oid = fz_tonum(obj);
- int i;
+ fz_error error;
+ int page;
- for (i = 0; i < pdf_getpagecount(app->pages); i++)
+ error = pdf_findpageobject(app->xref, obj, &page);
+ if (error)
+ pdfapp_error(app, error);
+
+ if (app->histlen + 1 == 256)
{
- if (fz_tonum(app->pages->pobj[i]) == oid)
- {
- if (app->histlen + 1 == 256)
- {
- memmove(app->hist, app->hist + 1, sizeof(int) * 255);
- app->histlen --;
- }
- app->hist[app->histlen++] = app->pageno;
- app->pageno = i + 1;
- pdfapp_showpage(app, 1, 1);
- return;
- }
+ memmove(app->hist, app->hist + 1, sizeof(int) * 255);
+ app->histlen --;
}
+ app->hist[app->histlen++] = app->pageno;
+ app->pageno = page;
+ pdfapp_showpage(app, 1, 1);
}
void pdfapp_onresize(pdfapp_t *app, int w, int h)
@@ -453,7 +441,7 @@ void pdfapp_onkey(pdfapp_t *app, int c)
break;
case 'G':
- app->pageno = pdf_getpagecount(app->pages);
+ app->pageno = app->xref->pagecount;
break;
case 'm':
@@ -494,8 +482,8 @@ void pdfapp_onkey(pdfapp_t *app, int c)
if (app->pageno < 1)
app->pageno = 1;
- if (app->pageno > pdf_getpagecount(app->pages))
- app->pageno = pdf_getpagecount(app->pages);
+ if (app->pageno > app->xref->pagecount)
+ app->pageno = app->xref->pagecount;
if (app->pageno != oldpage)
{
diff --git a/apps/common/pdftool.c b/apps/common/pdftool.c
index 3133a9d8..a607ba3d 100644
--- a/apps/common/pdftool.c
+++ b/apps/common/pdftool.c
@@ -2,7 +2,6 @@
char *basename = nil;
pdf_xref *xref = nil;
-pdf_pagetree *pagetree = nil;
static void (*cleanup)(void) = nil;
void closexref(void);
@@ -75,12 +74,6 @@ void closexref(void)
if (cleanup)
cleanup();
- if (pagetree)
- {
- pdf_droppagetree(pagetree);
- pagetree = nil;
- }
-
if (xref)
{
pdf_closexref(xref);
@@ -90,12 +83,3 @@ void closexref(void)
basename = nil;
}
-void loadpagetree(void)
-{
- fz_error error;
-
- error = pdf_loadpagetree(&pagetree, xref);
- if (error)
- die(error);
-}
-
diff --git a/apps/mozilla/moz_main.c b/apps/mozilla/moz_main.c
index b9cf0079..52deb38f 100644
--- a/apps/mozilla/moz_main.c
+++ b/apps/mozilla/moz_main.c
@@ -117,15 +117,7 @@ void pdfmoz_open(pdfmoz_t *moz, char *filename)
pdfmoz_warn(moz, "Invalid password.");
}
- /*
- * Load page tree
- */
-
- error = pdf_loadpagetree(&pages, moz->xref);
- if (error)
- pdfmoz_error(moz, error);
-
- moz->pagecount = pdf_getpagecount(pages);
+ moz->pagecount = moz->xrex->pagecount;
moz->pages = fz_malloc(sizeof(page_t) * moz->pagecount);
for (i = 0; i < moz->pagecount; i++)
@@ -288,28 +280,32 @@ void pdfmoz_gotouri(pdfmoz_t *moz, fz_obj *uri)
int pdfmoz_getpagenum(pdfmoz_t *moz, fz_obj *obj)
{
- int oid = fz_tonum(obj);
- int i;
- for (i = 0; i < moz->pagecount; i++)
- if (fz_tonum(moz->pages[i].obj) == oid)
- return i;
- return 0;
+ fz_error error;
+ int page;
+ int i, y = 0;
+
+ error = pdf_findpageobject(moz->xref, obj, &page);
+ if (error)
+ pdfmoz_error(moz, error);
+
+ return page;
}
void pdfmoz_gotopage(pdfmoz_t *moz, fz_obj *obj)
{
- int oid = fz_tonum(obj);
+ fz_error error;
+ int page;
int i, y = 0;
- for (i = 0; i < moz->pagecount; i++)
- {
- if (fz_tonum(moz->pages[i].obj) == oid)
- {
- SetScrollPos(moz->hwnd, SB_VERT, y, TRUE);
- InvalidateRect(moz->hwnd, NULL, FALSE);
- return;
- }
+
+ error = pdf_findpageobject(moz->xref, obj, &page);
+ if (error)
+ pdfmoz_error(moz, error);
+
+ for (i = 0; i < page; i++)
y += moz->pages[i].px;
- }
+
+ SetScrollPos(moz->hwnd, SB_VERT, y, TRUE);
+ InvalidateRect(moz->hwnd, NULL, FALSE);
}
void pdfmoz_onmouse(pdfmoz_t *moz, int x, int y, int click)
diff --git a/apps/pdfapp.h b/apps/pdfapp.h
index 0acccc2b..3b7852be 100644
--- a/apps/pdfapp.h
+++ b/apps/pdfapp.h
@@ -26,8 +26,8 @@ struct pdfapp_s
char *doctitle;
pdf_xref *xref;
pdf_outline *outline;
- pdf_pagetree *pages;
fz_renderer *rast;
+ int pagecount;
/* current view params */
float zoom;
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index ee4b4a05..14e85781 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -93,7 +93,9 @@ static void drawloadpage(int pagenum, struct benchmark *loadtimes)
gettime(&start);
}
- pageobj = pdf_getpageobject(pagetree, pagenum - 1);
+ error = pdf_getpageobject(xref, pagenum, &pageobj);
+ if (error)
+ die(error);
error = pdf_loadpage(&drawpage, xref, pageobj);
if (error)
die(error);
@@ -324,7 +326,7 @@ static void drawpages(char *pagelist)
if (strlen(dash) > 1)
epage = atoi(dash + 1);
else
- epage = pdf_getpagecount(pagetree);
+ epage = xref->pagecount;
}
if (spage > epage)
@@ -332,8 +334,8 @@ static void drawpages(char *pagelist)
if (spage < 1)
spage = 1;
- if (epage > pdf_getpagecount(pagetree))
- epage = pdf_getpagecount(pagetree);
+ if (epage > xref->pagecount)
+ epage = xref->pagecount;
printf("Drawing pages %d-%d...\n", spage, epage);
for (page = spage; page <= epage; page++)
@@ -412,7 +414,6 @@ int main(int argc, char **argv)
die(error);
openxref(argv[fz_optind], password, 0);
- loadpagetree();
state = NO_PAGES_DRAWN;
}
else
diff --git a/apps/pdfinfo.c b/apps/pdfinfo.c
index d09a45ca..176e26e6 100644
--- a/apps/pdfinfo.c
+++ b/apps/pdfinfo.c
@@ -658,7 +658,9 @@ gatherinfo(int show, int page)
fz_obj *shade;
fz_obj *pattern;
- pageobj = pdf_getpageobject(pagetree, page - 1);
+ error = pdf_getpageobject(xref, page, &pageobj);
+ if (error)
+ die(error);
if (!pageobj)
die(fz_throw("cannot retrieve info from page %d", page));
@@ -740,7 +742,7 @@ printglobalinfo(void)
fz_debugobj(cryptinfo->u.crypt.obj);
}
- printf("\nPages: %d\n\n", pdf_getpagecount(pagetree));
+ printf("\nPages: %d\n\n", xref->pagecount);
}
static void
@@ -977,7 +979,7 @@ showinfo(char *filename, int show, char *pagelist)
if (strlen(dash) > 1)
epage = atoi(dash + 1);
else
- epage = pdf_getpagecount(pagetree);
+ epage = xref->pagecount;
}
if (spage > epage)
@@ -985,10 +987,10 @@ showinfo(char *filename, int show, char *pagelist)
if (spage < 1)
spage = 1;
- if (epage > pdf_getpagecount(pagetree))
- epage = pdf_getpagecount(pagetree);
- if (spage > pdf_getpagecount(pagetree))
- spage = pdf_getpagecount(pagetree);
+ if (epage > xref->pagecount)
+ epage = xref->pagecount;
+ if (spage > xref->pagecount)
+ spage = xref->pagecount;
if (allpages)
printf("Retrieving info from pages %d-%d...\n", spage, epage);
@@ -1058,7 +1060,6 @@ int main(int argc, char **argv)
closexref();
filename = argv[fz_optind];
openxref(filename, password, 0);
- loadpagetree();
gatherglobalinfo();
state = NO_INFO_GATHERED;
}
diff --git a/apps/pdftool.h b/apps/pdftool.h
index 44e9e361..6eb75770 100644
--- a/apps/pdftool.h
+++ b/apps/pdftool.h
@@ -3,7 +3,7 @@
extern char *basename;
extern pdf_xref *xref;
-extern pdf_pagetree *pagetree;
+extern int pages;
void die(fz_error error);
void setcleanup(void (*cleanup)(void));
@@ -11,4 +11,3 @@ void setcleanup(void (*cleanup)(void));
void openxref(char *filename, char *password, int dieonbadpass);
void closexref(void);
-void loadpagetree(void);
diff --git a/apps/unix/x11pdf.c b/apps/unix/x11pdf.c
index e3bc4b72..3ae1d930 100644
--- a/apps/unix/x11pdf.c
+++ b/apps/unix/x11pdf.c
@@ -320,8 +320,7 @@ static void windrawpageno(pdfapp_t *app)
{
char s[100];
- int ret = snprintf(s, 100, "Page %d/%d", gapp.pageno,
- pdf_getpagecount(gapp.pages));
+ int ret = snprintf(s, 100, "Page %d/%d", gapp.pageno, gapp.pagecount);
if (ret >= 0)
{
isshowingpage = 1;