summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-07-16 10:02:54 +0000
committerTor Andersson <tor@ghostscript.com>2010-07-16 10:02:54 +0000
commit8e2e75a198e93d27b35086e04e72e1c753e2f79e (patch)
treea3abec2c7bf22a91f263c070e8777e7f4ccb4aef
parenta224dcb17142455de6d6e36eb88c84bfd79528bf (diff)
downloadmupdf-8e2e75a198e93d27b35086e04e72e1c753e2f79e.tar.xz
Refactor pdf store presence to be optional and use function pointers.
-rw-r--r--apps/pdfdraw.c3
-rw-r--r--apps/pdfextract.c7
-rw-r--r--apps/pdfshow.c2
-rw-r--r--mupdf/mupdf.h24
-rw-r--r--mupdf/pdf_cmap_load.c4
-rw-r--r--mupdf/pdf_colorspace.c4
-rw-r--r--mupdf/pdf_font.c4
-rw-r--r--mupdf/pdf_function.c4
-rw-r--r--mupdf/pdf_image.c4
-rw-r--r--mupdf/pdf_page.c3
-rw-r--r--mupdf/pdf_pattern.c6
-rw-r--r--mupdf/pdf_shade.c4
-rw-r--r--mupdf/pdf_store.c306
-rw-r--r--mupdf/pdf_xobject.c6
-rw-r--r--mupdf/pdf_xref.c2
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)
{