From 8e2e75a198e93d27b35086e04e72e1c753e2f79e Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 16 Jul 2010 10:02:54 +0000 Subject: Refactor pdf store presence to be optional and use function pointers. --- apps/pdfdraw.c | 3 +- apps/pdfextract.c | 7 -- apps/pdfshow.c | 2 - mupdf/mupdf.h | 24 +--- mupdf/pdf_cmap_load.c | 4 +- mupdf/pdf_colorspace.c | 4 +- mupdf/pdf_font.c | 4 +- mupdf/pdf_function.c | 4 +- mupdf/pdf_image.c | 4 +- mupdf/pdf_page.c | 3 - mupdf/pdf_pattern.c | 6 +- mupdf/pdf_shade.c | 4 +- mupdf/pdf_store.c | 306 ++++++++++++++----------------------------------- mupdf/pdf_xobject.c | 6 +- mupdf/pdf_xref.c | 2 +- 15 files changed, 112 insertions(+), 271 deletions(-) diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c index f7314ff5..852aef3a 100644 --- a/apps/pdfdraw.c +++ b/apps/pdfdraw.c @@ -141,8 +141,7 @@ static void drawpage(pdf_xref *xref, int pagenum) fz_freedisplaylist(list); pdf_freepage(page); - pdf_agestoreditems(xref->store); - pdf_evictageditems(xref->store); + pdf_agestore(xref->store, 3); } static void drawrange(pdf_xref *xref, char *range) diff --git a/apps/pdfextract.c b/apps/pdfextract.c index cb0eabd2..1271d95a 100644 --- a/apps/pdfextract.c +++ b/apps/pdfextract.c @@ -46,9 +46,6 @@ static void saveimage(int num) ref = fz_newindirect(num, 0, xref); - /* Hack! ...normally installed by pdf_page... */ - xref->store = pdf_newstore(); - /* TODO: detect DCTD and save as jpeg */ error = pdf_loadimage(&img, xref, nil, ref); @@ -82,10 +79,6 @@ static void saveimage(int num) fz_droppixmap(pix); pdf_dropimage(img); - /* We never want to cache resources... */ - pdf_freestore(xref->store); - xref->store = nil; - fz_dropobj(ref); } diff --git a/apps/pdfshow.c b/apps/pdfshow.c index 6d4d2672..588a22ca 100644 --- a/apps/pdfshow.c +++ b/apps/pdfshow.c @@ -141,9 +141,7 @@ int main(int argc, char **argv) { char *password = NULL; /* don't throw errors if encrypted */ fz_error error; - fz_stream *file; char *filename; - int fd; int c; while ((c = fz_getopt(argc, argv, "p:bc")) != -1) diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h index 49c3065d..faf77409 100644 --- a/mupdf/mupdf.h +++ b/mupdf/mupdf.h @@ -134,7 +134,6 @@ struct pdf_xref_s fz_obj **pagerefs; struct pdf_store_s *store; - void (*freestore)(struct pdf_store_s *); char scratch[65536]; }; @@ -173,29 +172,14 @@ void pdf_debugxref(pdf_xref *); typedef struct pdf_store_s pdf_store; -typedef enum pdf_itemkind_e -{ - PDF_KCOLORSPACE, - PDF_KFUNCTION, - PDF_KXOBJECT, - PDF_KIMAGE, - PDF_KPATTERN, - PDF_KSHADING, - PDF_KCMAP, - PDF_KFONT, -} pdf_itemkind; - pdf_store * pdf_newstore(void); -void pdf_emptystore(pdf_store *store); void pdf_freestore(pdf_store *store); void pdf_debugstore(pdf_store *store); -void pdf_agestoreditems(pdf_store *store); -void pdf_evictageditems(pdf_store *store); - -void pdf_storeitem(pdf_store *store, pdf_itemkind tag, fz_obj *key, void *val); -void *pdf_finditem(pdf_store *store, pdf_itemkind tag, fz_obj *key); -void pdf_removeitem(pdf_store *store, pdf_itemkind tag, fz_obj *key); +void pdf_storeitem(pdf_store *store, void *keepfn, void *dropfn, fz_obj *key, void *val); +void *pdf_finditem(pdf_store *store, void *dropfn, fz_obj *key); +void pdf_removeitem(pdf_store *store, void *dropfn, fz_obj *key); +void pdf_agestore(pdf_store *store, int maxage); /* * Functions diff --git a/mupdf/pdf_cmap_load.c b/mupdf/pdf_cmap_load.c index 576daf21..37a9d3f2 100644 --- a/mupdf/pdf_cmap_load.c +++ b/mupdf/pdf_cmap_load.c @@ -14,7 +14,7 @@ pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmobj) fz_obj *wmode; fz_obj *obj; - if ((*cmapp = pdf_finditem(xref->store, PDF_KCMAP, stmobj))) + if ((*cmapp = pdf_finditem(xref->store, pdf_dropcmap, stmobj))) { pdf_keepcmap(*cmapp); return fz_okay; @@ -73,7 +73,7 @@ pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmobj) pdf_logfont("}\n"); - pdf_storeitem(xref->store, PDF_KCMAP, stmobj, cmap); + pdf_storeitem(xref->store, pdf_keepcmap, pdf_dropcmap, stmobj, cmap); *cmapp = cmap; return fz_okay; diff --git a/mupdf/pdf_colorspace.c b/mupdf/pdf_colorspace.c index 55ff1498..900ab366 100644 --- a/mupdf/pdf_colorspace.c +++ b/mupdf/pdf_colorspace.c @@ -414,7 +414,7 @@ pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj) { fz_error error; - if ((*csp = pdf_finditem(xref->store, PDF_KCOLORSPACE, obj))) + if ((*csp = pdf_finditem(xref->store, fz_dropcolorspace, obj))) { fz_keepcolorspace(*csp); return fz_okay; @@ -424,7 +424,7 @@ pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj) if (error) return fz_rethrow(error, "cannot load colorspace (%d %d R)", fz_tonum(obj), fz_togen(obj)); - pdf_storeitem(xref->store, PDF_KCOLORSPACE, obj, *csp); + pdf_storeitem(xref->store, fz_keepcolorspace, fz_dropcolorspace, obj, *csp); return fz_okay; } diff --git a/mupdf/pdf_font.c b/mupdf/pdf_font.c index 28a08005..8b986963 100644 --- a/mupdf/pdf_font.c +++ b/mupdf/pdf_font.c @@ -955,7 +955,7 @@ pdf_loadfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict fz_obj *dfonts; fz_obj *charprocs; - if ((*fontdescp = pdf_finditem(xref->store, PDF_KFONT, dict))) + if ((*fontdescp = pdf_finditem(xref->store, pdf_dropfont, dict))) { pdf_keepfont(*fontdescp); return fz_okay; @@ -997,7 +997,7 @@ pdf_loadfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict if ((*fontdescp)->font->ftsubstitute && !(*fontdescp)->tottfcmap) pdf_makewidthtable(*fontdescp); - pdf_storeitem(xref->store, PDF_KFONT, dict, *fontdescp); + pdf_storeitem(xref->store, pdf_keepfont, pdf_dropfont, dict, *fontdescp); return fz_okay; } diff --git a/mupdf/pdf_function.c b/mupdf/pdf_function.c index 2074fa6b..39d920dd 100644 --- a/mupdf/pdf_function.c +++ b/mupdf/pdf_function.c @@ -1436,7 +1436,7 @@ pdf_loadfunction(pdf_function **funcp, pdf_xref *xref, fz_obj *dict) fz_obj *obj; int i; - if ((*funcp = pdf_finditem(xref->store, PDF_KFUNCTION, dict))) + if ((*funcp = pdf_finditem(xref->store, pdf_dropfunction, dict))) { pdf_keepfunction(*funcp); return fz_okay; @@ -1533,7 +1533,7 @@ pdf_loadfunction(pdf_function **funcp, pdf_xref *xref, fz_obj *dict) pdf_logrsrc("}\n"); - pdf_storeitem(xref->store, PDF_KFUNCTION, dict, func); + pdf_storeitem(xref->store, pdf_keepfunction, pdf_dropfunction, dict, func); *funcp = func; return fz_okay; diff --git a/mupdf/pdf_image.c b/mupdf/pdf_image.c index 20df8b46..8950a338 100644 --- a/mupdf/pdf_image.c +++ b/mupdf/pdf_image.c @@ -204,7 +204,7 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) fz_error error; pdf_image *img; - if ((*imgp = pdf_finditem(xref->store, PDF_KIMAGE, dict))) + if ((*imgp = pdf_finditem(xref->store, pdf_dropimage, dict))) { pdf_keepimage(*imgp); return fz_okay; @@ -242,7 +242,7 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *rdb, fz_obj *dict) pdf_logimage("}\n"); - pdf_storeitem(xref->store, PDF_KIMAGE, dict, img); + pdf_storeitem(xref->store, pdf_keepimage, pdf_dropimage, dict, img); *imgp = img; return fz_okay; diff --git a/mupdf/pdf_page.c b/mupdf/pdf_page.c index dfd2f080..71087336 100644 --- a/mupdf/pdf_page.c +++ b/mupdf/pdf_page.c @@ -152,10 +152,7 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict) // TODO: move this to a more appropriate place /* Ensure that we have a store for resource objects */ if (!xref->store) - { xref->store = pdf_newstore(); - xref->freestore = pdf_freestore; - } page = fz_malloc(sizeof(pdf_page)); page->resources = nil; diff --git a/mupdf/pdf_pattern.c b/mupdf/pdf_pattern.c index d083c855..7d3a38d1 100644 --- a/mupdf/pdf_pattern.c +++ b/mupdf/pdf_pattern.c @@ -8,7 +8,7 @@ pdf_loadpattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict) pdf_pattern *pat; fz_obj *obj; - if ((*patp = pdf_finditem(xref->store, PDF_KPATTERN, dict))) + if ((*patp = pdf_finditem(xref->store, pdf_droppattern, dict))) { pdf_keeppattern(*patp); return fz_okay; @@ -22,7 +22,7 @@ pdf_loadpattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict) pat->contents = nil; /* Store pattern now, to avoid possible recursion if objects refer back to this one */ - pdf_storeitem(xref->store, PDF_KPATTERN, dict, pat); + pdf_storeitem(xref->store, pdf_keeppattern, pdf_droppattern, dict, pat); pat->ismask = fz_toint(fz_dictgets(dict, "PaintType")) == 2; pat->xstep = fz_toreal(fz_dictgets(dict, "XStep")); @@ -57,7 +57,7 @@ pdf_loadpattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict) error = pdf_loadstream(&pat->contents, xref, fz_tonum(dict), fz_togen(dict)); if (error) { - pdf_removeitem(xref->store, PDF_KPATTERN, dict); + pdf_removeitem(xref->store, pdf_droppattern, dict); pdf_droppattern(pat); return fz_rethrow(error, "cannot load pattern stream (%d %d R)", fz_tonum(dict), fz_togen(dict)); } diff --git a/mupdf/pdf_shade.c b/mupdf/pdf_shade.c index 6a04c369..1e196ce6 100644 --- a/mupdf/pdf_shade.c +++ b/mupdf/pdf_shade.c @@ -1297,7 +1297,7 @@ pdf_loadshading(fz_shade **shadep, pdf_xref *xref, fz_obj *dict) fz_matrix mat; fz_obj *obj; - if ((*shadep = pdf_finditem(xref->store, PDF_KSHADING, dict))) + if ((*shadep = pdf_finditem(xref->store, fz_dropshade, dict))) { fz_keepshade(*shadep); return fz_okay; @@ -1352,7 +1352,7 @@ pdf_loadshading(fz_shade **shadep, pdf_xref *xref, fz_obj *dict) return fz_rethrow(error, "cannot load shading dictionary (%d %d R)", fz_tonum(dict), fz_togen(dict)); } - pdf_storeitem(xref->store, PDF_KSHADING, dict, *shadep); + pdf_storeitem(xref->store, fz_keepshade, fz_dropshade, dict, *shadep); return fz_okay; } diff --git a/mupdf/pdf_store.c b/mupdf/pdf_store.c index 519ec9e8..66e8ec1a 100644 --- a/mupdf/pdf_store.c +++ b/mupdf/pdf_store.c @@ -5,7 +5,7 @@ typedef struct pdf_item_s pdf_item; struct pdf_item_s { - pdf_itemkind kind; + void *dropfunc; fz_obj *key; void *val; int age; @@ -14,7 +14,7 @@ struct pdf_item_s struct refkey { - pdf_itemkind kind; + void *dropfunc; int num; int gen; }; @@ -25,70 +25,6 @@ struct pdf_store_s pdf_item *root; /* linked list for everything else */ }; -static char *kindstr(pdf_itemkind kind) -{ - switch (kind) - { - case PDF_KCOLORSPACE: return "colorspace"; - case PDF_KFUNCTION: return "function"; - case PDF_KXOBJECT: return "xobject"; - case PDF_KIMAGE: return "image"; - case PDF_KPATTERN: return "pattern"; - case PDF_KSHADING: return "shading"; - case PDF_KCMAP: return "cmap"; - case PDF_KFONT: return "font"; - } - - return "unknown"; -} - -static int itemmaxage(pdf_itemkind kind) -{ - switch (kind) - { - case PDF_KCOLORSPACE: return 10; - case PDF_KFUNCTION: return 2; - case PDF_KXOBJECT: return 2; - case PDF_KIMAGE: return 10; - case PDF_KPATTERN: return 2; - case PDF_KSHADING: return 2; - case PDF_KCMAP: return 10; - case PDF_KFONT: return 10; - } - - return 0; -} - -static void keepitem(pdf_itemkind kind, void *val) -{ - switch (kind) - { - case PDF_KCOLORSPACE: fz_keepcolorspace(val); break; - case PDF_KFUNCTION: pdf_keepfunction(val); break; - case PDF_KXOBJECT: pdf_keepxobject(val); break; - case PDF_KIMAGE: pdf_keepimage(val); break; - case PDF_KPATTERN: pdf_keeppattern(val); break; - case PDF_KSHADING: fz_keepshade(val); break; - case PDF_KCMAP: pdf_keepcmap(val); break; - case PDF_KFONT: pdf_keepfont(val); break; - } -} - -static void dropitem(pdf_itemkind kind, void *val) -{ - switch (kind) - { - case PDF_KCOLORSPACE: fz_dropcolorspace(val); break; - case PDF_KFUNCTION: pdf_dropfunction(val); break; - case PDF_KXOBJECT: pdf_dropxobject(val); break; - case PDF_KIMAGE: pdf_dropimage(val); break; - case PDF_KPATTERN: pdf_droppattern(val); break; - case PDF_KSHADING: fz_dropshade(val); break; - case PDF_KCMAP: pdf_dropcmap(val); break; - case PDF_KFONT: pdf_dropfont(val); break; - } -} - pdf_store * pdf_newstore(void) { @@ -100,158 +36,54 @@ pdf_newstore(void) } void -pdf_emptystore(pdf_store *store) +pdf_storeitem(pdf_store *store, void *keepfunc, void *dropfunc, fz_obj *key, void *val) { pdf_item *item; - pdf_item *next; - struct refkey *key; - int i; - for (i = 0; i < fz_hashlen(store->hash); i++) - { - key = fz_hashgetkey(store->hash, i); - item = fz_hashgetval(store->hash, i); - if (item) - { - fz_dropobj(item->key); - dropitem(key->kind, item->val); - fz_free(item); - } - } - - fz_emptyhash(store->hash); - - for (item = store->root; item; item = next) - { - next = item->next; - fz_dropobj(item->key); - dropitem(item->kind, item->val); - fz_free(item); - } - - store->root = nil; -} - -void -pdf_freestore(pdf_store *store) -{ - pdf_emptystore(store); - fz_freehash(store->hash); - fz_free(store); -} - -static void evictitem(pdf_item *item) -{ - pdf_logrsrc("evicting item %s (%d %d R) at age %d\n", kindstr(item->kind), fz_tonum(item->key), fz_togen(item->key), item->age); - fz_dropobj(item->key); - dropitem(item->kind, item->val); - fz_free(item); -} - -void -pdf_evictageditems(pdf_store *store) -{ - pdf_item *item; - pdf_item *next; - pdf_item *prev; - struct refkey *key; - int i; - - for (i = 0; i < fz_hashlen(store->hash); i++) - { - key = fz_hashgetkey(store->hash, i); - item = fz_hashfind(store->hash, key); - if (item && item->age > itemmaxage(item->kind)) - { - fz_hashremove(store->hash, key); - evictitem(item); - } - } - - prev = nil; - for (item = store->root; item; item = next) - { - next = item->next; - if (item->age > itemmaxage(item->kind)) - { - if (!prev) - store->root = next; - else - prev->next = next; - evictitem(item); - } - else - prev = item; - } -} - -void -pdf_agestoreditems(pdf_store *store) -{ - pdf_item *item; - int i; - - for (i = 0; i < fz_hashlen(store->hash); i++) - { - item = fz_hashgetval(store->hash, i); - if (item) - item->age++; - } - - for (item = store->root; item; item = item->next) - item->age++; -} - -void -pdf_storeitem(pdf_store *store, pdf_itemkind kind, fz_obj *key, void *val) -{ - pdf_item *item; + if (!store) + return; item = fz_malloc(sizeof(pdf_item)); - item->kind = kind; + item->dropfunc = dropfunc; item->key = fz_keepobj(key); - item->val = val; + item->val = ((void*(*)(void*))keepfunc)(val); item->age = 0; item->next = nil; if (fz_isindirect(key)) { struct refkey refkey; - - pdf_logrsrc("store item %s (%d %d R) ptr=%p\n", kindstr(kind), fz_tonum(key), fz_togen(key), val); - - refkey.kind = kind; + pdf_logrsrc("store item (%d %d R) ptr=%p\n", fz_tonum(key), fz_togen(key), val); + refkey.dropfunc = dropfunc; refkey.num = fz_tonum(key); refkey.gen = fz_togen(key); - fz_hashinsert(store->hash, &refkey, item); } else { - pdf_logrsrc("store item %s (...) = %p\n", kindstr(kind), val); - + pdf_logrsrc("store item (...) = %p\n", val); item->next = store->root; store->root = item; } - - keepitem(kind, val); } void * -pdf_finditem(pdf_store *store, pdf_itemkind kind, fz_obj *key) +pdf_finditem(pdf_store *store, void *dropfunc, fz_obj *key) { - pdf_item *item; struct refkey refkey; + pdf_item *item; + + if (!store) + return nil; if (key == nil) return nil; if (fz_isindirect(key)) { - refkey.kind = kind; + refkey.dropfunc = dropfunc; refkey.num = fz_tonum(key); refkey.gen = fz_togen(key); - item = fz_hashfind(store->hash, &refkey); if (item) { @@ -259,14 +91,15 @@ pdf_finditem(pdf_store *store, pdf_itemkind kind, fz_obj *key) return item->val; } } - else { for (item = store->root; item; item = item->next) - if (item->kind == kind && !fz_objcmp(item->key, key)) { - item->age = 0; - return item->val; + if (item->dropfunc == dropfunc && !fz_objcmp(item->key, key)) + { + item->age = 0; + return item->val; + } } } @@ -274,71 +107,110 @@ pdf_finditem(pdf_store *store, pdf_itemkind kind, fz_obj *key) } void -pdf_removeitem(pdf_store *store, pdf_itemkind kind, fz_obj *key) +pdf_removeitem(pdf_store *store, void *dropfunc, fz_obj *key) { - pdf_item *item, *prev; struct refkey refkey; - - if (key == nil) - return; + pdf_item *item, *prev; if (fz_isindirect(key)) { - refkey.kind = kind; + refkey.dropfunc = dropfunc; refkey.num = fz_tonum(key); refkey.gen = fz_togen(key); - item = fz_hashfind(store->hash, &refkey); - if (!item) - return; - fz_hashremove(store->hash, &refkey); - - pdf_logrsrc("remove item %s (%d %d R) ptr=%p\n", kindstr(kind), fz_tonum(key), fz_togen(key), item->val); - - dropitem(kind, item->val); - fz_dropobj(item->key); - fz_free(item); + if (item) + { + fz_hashremove(store->hash, &refkey); + ((void(*)(void*))item->dropfunc)(item->val); + fz_dropobj(item->key); + fz_free(item); + } } - else { - prev = nil; + prev = NULL; for (item = store->root; item; item = item->next) { - if (item->kind == kind && !fz_objcmp(item->key, key)) + if (item->dropfunc == dropfunc && !fz_objcmp(item->key, key)) { if (!prev) store->root = item->next; else prev->next = item->next; - dropitem(kind, item->val); + ((void(*)(void*))item->dropfunc)(item->val); fz_dropobj(item->key); fz_free(item); - break; } - prev = item; + else + prev = item; } } } +void +pdf_agestore(pdf_store *store, int maxage) +{ + struct refkey *refkey; + pdf_item *item, *prev; + int i; + + for (i = 0; i < fz_hashlen(store->hash); i++) + { +again: + refkey = fz_hashgetkey(store->hash, i); + item = fz_hashgetval(store->hash, i); + if (item && ++item->age > maxage) + { + fz_hashremove(store->hash, refkey); + ((void(*)(void*))item->dropfunc)(item->val); + fz_dropobj(item->key); + fz_free(item); + goto again; /* items with same hash may move into place */ + } + } + + prev = NULL; + for (item = store->root; item; item = item->next) + { + if (++item->age > maxage) + { + if (!prev) + store->root = item->next; + else + prev->next = item->next; + ((void(*)(void*))item->dropfunc)(item->val); + fz_dropobj(item->key); + fz_free(item); + } + else + prev = item; + } +} + +void +pdf_freestore(pdf_store *store) +{ + pdf_agestore(store, 0); + fz_freehash(store->hash); + fz_free(store); +} + void pdf_debugstore(pdf_store *store) { pdf_item *item; pdf_item *next; - struct refkey *key; + struct refkey *refkey; int i; printf("-- resource store contents --\n"); for (i = 0; i < fz_hashlen(store->hash); i++) { - key = fz_hashgetkey(store->hash, i); + refkey = fz_hashgetkey(store->hash, i); item = fz_hashgetval(store->hash, i); - if (key && item) - { - printf("store[%d] (%d %d R) = %p\n", i, key->num, key->gen, item->val); - } + if (item) + printf("store[%d] (%d %d R) = %p\n", i, refkey->num, refkey->gen, item->val); } for (item = store->root; item; item = next) @@ -348,6 +220,4 @@ pdf_debugstore(pdf_store *store) fz_debugobj(item->key); printf(" = %p\n", item->val); } - - store->root = nil; } diff --git a/mupdf/pdf_xobject.c b/mupdf/pdf_xobject.c index 38310163..9a9fc212 100644 --- a/mupdf/pdf_xobject.c +++ b/mupdf/pdf_xobject.c @@ -8,7 +8,7 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict) pdf_xobject *form; fz_obj *obj; - if ((*formp = pdf_finditem(xref->store, PDF_KXOBJECT, dict))) + if ((*formp = pdf_finditem(xref->store, pdf_dropxobject, dict))) { pdf_keepxobject(*formp); return fz_okay; @@ -22,7 +22,7 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict) pdf_logrsrc("load xobject (%d %d R) ptr=%p {\n", fz_tonum(dict), fz_togen(dict), form); /* Store item immediately, to avoid possible recursion if objects refer back to this one */ - pdf_storeitem(xref->store, PDF_KXOBJECT, dict, form); + pdf_storeitem(xref->store, pdf_keepxobject, pdf_dropxobject, dict, form); obj = fz_dictgets(dict, "BBox"); form->bbox = pdf_torect(obj); @@ -70,7 +70,7 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict) error = pdf_loadstream(&form->contents, xref, fz_tonum(dict), fz_togen(dict)); if (error) { - pdf_removeitem(xref->store, PDF_KXOBJECT, dict); + pdf_removeitem(xref->store, pdf_dropxobject, dict); pdf_dropxobject(form); return fz_rethrow(error, "cannot load xobject content stream (%d %d R)", fz_tonum(dict), fz_togen(dict)); } diff --git a/mupdf/pdf_xref.c b/mupdf/pdf_xref.c index f19d5f8d..86b97daf 100644 --- a/mupdf/pdf_xref.c +++ b/mupdf/pdf_xref.c @@ -690,7 +690,7 @@ pdf_freexref(pdf_xref *xref) pdf_logxref("freexref %p\n", xref); if (xref->store) - xref->freestore(xref->store); + pdf_freestore(xref->store); if (xref->table) { -- cgit v1.2.3