diff options
author | Sebastian Rasmussen <sebras@hotmail.com> | 2009-07-09 02:03:19 +0200 |
---|---|---|
committer | Sebastian Rasmussen <sebras@hotmail.com> | 2009-07-09 02:03:19 +0200 |
commit | 1ef9dff0e7ad7112025efe273ae855f6d2ad5f36 (patch) | |
tree | 08240b59b6ab17fc48ef16f1c5160ed447285498 /apps | |
parent | 60a1411f016d2fecce12abf715a10d7e7faf886f (diff) | |
download | mupdf-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.c | 52 | ||||
-rw-r--r-- | apps/common/pdftool.c | 16 | ||||
-rw-r--r-- | apps/mozilla/moz_main.c | 46 | ||||
-rw-r--r-- | apps/pdfapp.h | 2 | ||||
-rw-r--r-- | apps/pdfdraw.c | 11 | ||||
-rw-r--r-- | apps/pdfinfo.c | 17 | ||||
-rw-r--r-- | apps/pdftool.h | 3 | ||||
-rw-r--r-- | apps/unix/x11pdf.c | 3 |
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; |