summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2009-06-30 02:23:57 +0200
committerTor Andersson <tor@ghostscript.com>2009-06-30 02:23:57 +0200
commit0f66fa12ec2b514459e5f456b016ef719f041fc0 (patch)
tree68d7a4ec805a27c61b0b544fab038831978b731e
parentd8706a2cd98b373f45efcbb6a1753551984dc43c (diff)
downloadmupdf-0f66fa12ec2b514459e5f456b016ef719f041fc0.tar.xz
Move dynamic objects (fz_obj) out of fitz and into mupdf conceptually. Make all fz_obj functions automatically and invisibly resolve indirect references before use.
-rw-r--r--apps/common/pdfapp.c16
-rw-r--r--apps/pdfclean.c25
-rw-r--r--apps/pdfdraw.c14
-rw-r--r--apps/pdfextract.c21
-rw-r--r--apps/pdfinfo.c223
-rw-r--r--apps/pdfshow.c14
-rw-r--r--fitz/filt_pipeline.c7
-rw-r--r--fitz/fitz_stream.h23
-rw-r--r--fitz/obj_array.c23
-rw-r--r--fitz/obj_dict.c16
-rw-r--r--fitz/obj_parse.c36
-rw-r--r--fitz/obj_print.c2
-rw-r--r--fitz/obj_simple.c139
-rw-r--r--mupdf/mupdf.h12
-rw-r--r--mupdf/pdf_annot.c23
-rw-r--r--mupdf/pdf_cmap_load.c9
-rw-r--r--mupdf/pdf_colorspace1.c39
-rw-r--r--mupdf/pdf_crypt.c2
-rw-r--r--mupdf/pdf_font.c65
-rw-r--r--mupdf/pdf_function.c68
-rw-r--r--mupdf/pdf_image.c51
-rw-r--r--mupdf/pdf_interpret.c11
-rw-r--r--mupdf/pdf_nametree.c52
-rw-r--r--mupdf/pdf_open.c10
-rw-r--r--mupdf/pdf_outline.c22
-rw-r--r--mupdf/pdf_page.c26
-rw-r--r--mupdf/pdf_pagetree.c31
-rw-r--r--mupdf/pdf_parse.c137
-rw-r--r--mupdf/pdf_pattern.c10
-rw-r--r--mupdf/pdf_repair.c11
-rw-r--r--mupdf/pdf_resources.c73
-rw-r--r--mupdf/pdf_shade.c17
-rw-r--r--mupdf/pdf_stream.c57
-rw-r--r--mupdf/pdf_type3.c46
-rw-r--r--mupdf/pdf_xobject.c29
-rw-r--r--mupdf/pdf_xref.c52
36 files changed, 320 insertions, 1092 deletions
diff --git a/apps/common/pdfapp.c b/apps/common/pdfapp.c
index aa5d0a31..26e9b90d 100644
--- a/apps/common/pdfapp.c
+++ b/apps/common/pdfapp.c
@@ -126,20 +126,14 @@ void pdfapp_open(pdfapp_t *app, char *filename)
*/
obj = fz_dictgets(app->xref->trailer, "Root");
- if (!obj)
+ app->xref->root = fz_resolveindirect(obj);
+ if (!app->xref->root)
pdfapp_error(app, fz_throw("syntaxerror: missing Root object"));
- error = pdf_loadindirect(&app->xref->root, app->xref, obj);
- if (error)
- pdfapp_error(app, error);
-
obj = fz_dictgets(app->xref->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&app->xref->info, app->xref, obj);
- if (error)
- pdfapp_warn(app, "Could not load PDF meta information.");
- }
+ app->xref->info = fz_resolveindirect(obj);
+ if (!app->xref->info)
+ pdfapp_warn(app, "Could not load PDF meta information.");
error = pdf_loadnametrees(app->xref);
if (error)
diff --git a/apps/pdfclean.c b/apps/pdfclean.c
index 5c8bd981..bfc94a36 100644
--- a/apps/pdfclean.c
+++ b/apps/pdfclean.c
@@ -61,20 +61,10 @@ void openxref(char *filename, char *password)
/* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */
obj = fz_dictgets(xref->trailer, "Root");
- if (!obj)
- die(error);
-
- error = pdf_loadindirect(&xref->root, xref, obj);
- if (error)
- die(error);
+ xref->root = fz_resolveindirect(obj);
obj = fz_dictgets(xref->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&xref->info, xref, obj);
- if (error)
- die(error);
- }
+ xref->info = fz_resolveindirect(obj);
}
/*
@@ -132,9 +122,7 @@ static fz_error sweepref(pdf_xref *xref, fz_obj *ref)
uselist[oid] = 1;
- error = pdf_loadindirect(&obj, xref, ref);
- if (error)
- return fz_rethrow(error, "cannot load indirect object");
+ obj = fz_resolveindirect(ref);
/* Bake in /Length in stream objects */
if (xref->table[oid].stmofs)
@@ -142,7 +130,7 @@ static fz_error sweepref(pdf_xref *xref, fz_obj *ref)
len = fz_dictgets(obj, "Length");
if (fz_isindirect(len))
{
- pdf_loadindirect(&len, xref, len);
+ len = fz_resolveindirect(len);
fz_dictputs(obj, "Length", len);
}
}
@@ -154,7 +142,6 @@ static fz_error sweepref(pdf_xref *xref, fz_obj *ref)
return error; /* too deeply nested for rethrow */
}
- fz_dropobj(obj);
return fz_okay;
}
@@ -323,7 +310,7 @@ void savexref(void)
if (doencrypt)
{
- fz_newindirect(&obj, xref->len, 0);
+ fz_newindirect(&obj, xref->len, 0, xref);
fz_dictputs(trailer, "Encrypt", obj);
fz_dropobj(obj);
}
@@ -405,7 +392,7 @@ int main(int argc, char **argv)
id = fz_dictgets(xref->trailer, "ID");
if (!id)
{
- error = fz_packobj(&id, "[(ABCDEFGHIJKLMNOP)(ABCDEFGHIJKLMNOP)]");
+ error = fz_packobj(&id, xref, "[(ABCDEFGHIJKLMNOP)(ABCDEFGHIJKLMNOP)]");
if (error)
die(error);
}
diff --git a/apps/pdfdraw.c b/apps/pdfdraw.c
index 13840ff6..a5bd6063 100644
--- a/apps/pdfdraw.c
+++ b/apps/pdfdraw.c
@@ -70,20 +70,10 @@ void openxref(char *filename, char *password)
/* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */
obj = fz_dictgets(xref->trailer, "Root");
- if (!obj)
- die(error);
-
- error = pdf_loadindirect(&xref->root, xref, obj);
- if (error)
- die(error);
+ xref->root = fz_resolveindirect(obj);
obj = fz_dictgets(xref->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&xref->info, xref, obj);
- if (error)
- die(error);
- }
+ xref->info = fz_resolveindirect(obj);
}
/*
diff --git a/apps/pdfextract.c b/apps/pdfextract.c
index c9489c89..b878621c 100644
--- a/apps/pdfextract.c
+++ b/apps/pdfextract.c
@@ -44,20 +44,10 @@ void openxref(char *filename, char *password)
/* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */
obj = fz_dictgets(xref->trailer, "Root");
- if (!obj)
- die(error);
-
- error = pdf_loadindirect(&xref->root, xref, obj);
- if (error)
- die(error);
+ xref->root = fz_resolveindirect(obj);
obj = fz_dictgets(xref->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&xref->info, xref, obj);
- if (error)
- die(error);
- }
+ xref->info = fz_resolveindirect(obj);
}
void closexref()
@@ -102,7 +92,7 @@ void saveimage(fz_obj *obj, int num, int gen)
int x;
int y;
- error = fz_newindirect(&ref, num, gen);
+ error = fz_newindirect(&ref, num, gen, xref);
if (error)
die(error);
@@ -227,13 +217,8 @@ void savefont(fz_obj *dict, int num, int gen)
obj = fz_dictgets(dict, "FontFile3");
if (obj)
{
-
stream = obj;
- error = pdf_resolve(&obj, xref);
- if (error)
- die(error);
-
obj = fz_dictgets(obj, "Subtype");
if (obj && !fz_isname(obj))
die(fz_throw("Invalid font descriptor subtype"));
diff --git a/apps/pdfinfo.c b/apps/pdfinfo.c
index e9f9a77d..215d5ddf 100644
--- a/apps/pdfinfo.c
+++ b/apps/pdfinfo.c
@@ -95,20 +95,10 @@ void opensrc(char *filename, char *password, int loadpages)
/* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */
obj = fz_dictgets(src->trailer, "Root");
- if (!obj)
- die(error);
-
- error = pdf_loadindirect(&src->root, src, obj);
- if (error)
- die(error);
+ src->root = fz_resolveindirect(obj);
obj = fz_dictgets(src->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&src->info, src, obj);
- if (error)
- die(error);
- }
+ src->info = fz_resolveindirect(obj);
error = pdf_loadnametrees(src);
if (error)
@@ -227,19 +217,12 @@ gatherglobalinfo()
fz_error
gatherdimensions(int page, fz_obj *pageref, fz_obj *pageobj)
{
- fz_error error;
fz_obj *ref;
fz_rect bbox;
fz_obj *obj;
int j;
obj = ref = fz_dictgets(pageobj, "MediaBox");
- if (obj)
- {
- error = pdf_resolve(&obj, src);
- if (error)
- return error;
- }
if (!fz_isarray(obj))
return fz_throw("cannot find page bounds (%d %d R)", fz_tonum(ref), fz_togen(ref));
@@ -290,43 +273,24 @@ gatherfonts(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
fontdict = ref = fz_dictgetval(dict, i);
- if (fontdict)
- {
- error = pdf_resolve(&fontdict, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect font dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(fontdict))
return fz_throw("not a font dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
subtype = fz_dictgets(fontdict, "Subtype");
- if (subtype)
- {
- error = pdf_resolve(&subtype, src);
- if (error)
- return fz_rethrow(error, "cannot find font dict subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isname(subtype))
return fz_throw("not a font dict subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
basefont = fz_dictgets(fontdict, "BaseFont");
if (basefont)
{
- error = pdf_resolve(&basefont, src);
- if (error)
- return fz_rethrow(error, "cannot find font dict basefont (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (!fz_isname(basefont))
return fz_throw("not a font dict basefont (%d %d R)", fz_tonum(ref), fz_togen(ref));
}
else
{
name = fz_dictgets(fontdict, "Name");
- if (name)
- error = pdf_resolve(&name, src);
- else
+ if (!name)
error = fz_newnull(&name);
- if (error)
- return fz_rethrow(error, "cannot find font dict name (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (!fz_isnull(name) && !fz_isname(name))
return fz_throw("not a font dict name (%d %d R)", fz_tonum(ref), fz_togen(ref));
}
@@ -380,35 +344,17 @@ gatherimages(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
imagedict = ref = fz_dictgetval(dict, i);
- if (imagedict)
- {
- error = pdf_resolve(&imagedict, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(imagedict))
return fz_throw("not an image dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
type = fz_dictgets(imagedict, "Subtype");
- if (type)
- {
- error = pdf_resolve(&type, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isname(type))
return fz_throw("not an image subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (strcmp(fz_toname(type), "Image"))
continue;
filter = fz_dictgets(imagedict, "Filter");
- if (filter)
- {
- error = pdf_resolve(&filter, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image filter (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
- else
+ if (!filter)
{
error = fz_newname(&filter, "Raw");
if (error)
@@ -418,53 +364,19 @@ gatherimages(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
return fz_throw("not an image filter (%d %d R)", fz_tonum(ref), fz_togen(ref));
mask = fz_dictgets(imagedict, "ImageMask");
- if (mask)
- {
- error = pdf_resolve(&mask, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image mask (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
altcs = nil;
cs = fz_dictgets(imagedict, "ColorSpace");
- if (cs)
- {
- error = pdf_resolve(&cs, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image colorspace (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (fz_isarray(cs))
{
fz_obj *cses = cs;
cs = fz_arrayget(cses, 0);
- if (cs)
- {
- error = pdf_resolve(&cs, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image colorspace name (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
-
if (fz_isname(cs) && (!strcmp(fz_toname(cs), "DeviceN") || !strcmp(fz_toname(cs), "Separation")))
{
altcs = fz_arrayget(cses, 2);
- if (altcs)
- {
- error = pdf_resolve(&altcs, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image alternate colorspace name (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
-
if (fz_isarray(altcs))
- {
altcs = fz_arrayget(altcs, 0);
- if (altcs)
- {
- error = pdf_resolve(&altcs, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image alternate colorspace name (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
- }
}
}
@@ -482,32 +394,14 @@ gatherimages(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
return fz_throw("not an image alternate colorspace (%d %d R)", fz_tonum(ref), fz_togen(ref));
width = fz_dictgets(imagedict, "Width");
- if (width)
- {
- error = pdf_resolve(&width, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image width (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(width))
return fz_throw("not an image width (%d %d R)", fz_tonum(ref), fz_togen(ref));
height = fz_dictgets(imagedict, "Height");
- if (height)
- {
- error = pdf_resolve(&height, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image height (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(height))
return fz_throw("not an image height (%d %d R)", fz_tonum(ref), fz_togen(ref));
bpc = fz_dictgets(imagedict, "BitsPerComponent");
- if (bpc)
- {
- error = pdf_resolve(&bpc, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image bits per component (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_tobool(mask) && !fz_isint(bpc))
return fz_throw("not an image bits per component (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (fz_tobool(mask) && fz_isint(bpc) && fz_toint(bpc) != 1)
@@ -554,7 +448,6 @@ gatherimages(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
fz_error
gatherforms(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
{
- fz_error error;
int i;
for (i = 0; i < fz_dictlen(dict); i++)
@@ -568,56 +461,26 @@ gatherforms(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
xobjdict = ref = fz_dictgetval(dict, i);
- if (xobjdict)
- {
- error = pdf_resolve(&xobjdict, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(xobjdict))
return fz_throw("not a xobject dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
type = fz_dictgets(xobjdict, "Subtype");
- if (type)
- {
- error = pdf_resolve(&type, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect xobject type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isname(type))
return fz_throw("not a xobject type (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (strcmp(fz_toname(type), "Form"))
return fz_okay;
subtype = fz_dictgets(xobjdict, "Subtype2");
- if (subtype)
- {
- error = pdf_resolve(&subtype, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect xobject subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (subtype && !fz_isname(subtype))
return fz_throw("not a xobject subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (strcmp(fz_toname(subtype), "PS"))
return fz_okay;
group = fz_dictgets(xobjdict, "Group");
- if (group)
- {
- error = pdf_resolve(&group, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect form xobject group dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (group && !fz_isdict(group))
return fz_throw("not a form xobject group dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
reference = fz_dictgets(xobjdict, "Ref");
- if (reference)
- {
- error = pdf_resolve(&reference, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect form xobject reference dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (reference && !fz_isdict(reference))
return fz_throw("not a form xobject reference dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
@@ -652,7 +515,6 @@ gatherforms(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
fz_error
gatherpsobjs(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
{
- fz_error error;
int i;
for (i = 0; i < fz_dictlen(dict); i++)
@@ -664,34 +526,16 @@ gatherpsobjs(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
xobjdict = ref = fz_dictgetval(dict, i);
- if (xobjdict)
- {
- error = pdf_resolve(&xobjdict, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect image dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(xobjdict))
return fz_throw("not a xobject dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
type = fz_dictgets(xobjdict, "Subtype");
- if (type)
- {
- error = pdf_resolve(&type, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect xobject type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isname(type))
return fz_throw("not a xobject type (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (strcmp(fz_toname(type), "Form"))
return fz_okay;
subtype = fz_dictgets(xobjdict, "Subtype2");
- if (subtype)
- {
- error = pdf_resolve(&subtype, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect xobject subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (subtype && !fz_isname(subtype))
return fz_throw("not a xobject subtype (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (strcmp(fz_toname(type), "PS") &&
@@ -727,7 +571,6 @@ gatherpsobjs(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
fz_error
gathershadings(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
{
- fz_error error;
int i;
for (i = 0; i < fz_dictlen(dict); i++)
@@ -738,22 +581,10 @@ gathershadings(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
shade = ref = fz_dictgetval(dict, i);
- if (shade)
- {
- error = pdf_resolve(&shade, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect shading dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(shade))
return fz_throw("not a shading dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
type = fz_dictgets(shade, "ShadingType");
- if (type)
- {
- error = pdf_resolve(&type, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect shading type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(type) || fz_toint(type) < 1 || fz_toint(type) > 7)
return fz_throw("not a shading type (%d %d R)", fz_tonum(ref), fz_togen(ref));
@@ -800,44 +631,20 @@ gatherpatterns(int page, fz_obj *pageref, fz_obj *pageobj, fz_obj *dict)
int k;
patterndict = ref = fz_dictgetval(dict, i);
- if (patterndict)
- {
- error = pdf_resolve(&patterndict, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect pattern dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isdict(patterndict))
return fz_throw("not a pattern dict (%d %d R)", fz_tonum(ref), fz_togen(ref));
type = fz_dictgets(patterndict, "PatternType");
- if (type)
- {
- error = pdf_resolve(&type, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect pattern type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(type) || fz_toint(type) < 1 || fz_toint(type) > 2)
return fz_throw("not a pattern type (%d %d R)", fz_tonum(ref), fz_togen(ref));
if (fz_toint(type) == 1)
{
paint = fz_dictgets(patterndict, "PaintType");
- if (paint)
- {
- error = pdf_resolve(&paint, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect pattern paint type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(paint) || fz_toint(paint) < 1 || fz_toint(paint) > 2)
return fz_throw("not a pattern paint type (%d %d R)", fz_tonum(ref), fz_togen(ref));
tiling = fz_dictgets(patterndict, "TilingType");
- if (tiling)
- {
- error = pdf_resolve(&tiling, src);
- if (error)
- return fz_rethrow(error, "cannot resolve indirect pattern tiling type (%d %d R)", fz_tonum(ref), fz_togen(ref));
- }
if (!fz_isint(tiling) || fz_toint(tiling) < 1 || fz_toint(tiling) > 3)
return fz_throw("not a pattern tiling type (%d %d R)", fz_tonum(ref), fz_togen(ref));
}
@@ -906,22 +713,12 @@ gatherinfo(int show, int page)
}
rsrc = fz_dictgets(pageobj, "Resources");
- if (rsrc)
- {
- error = pdf_resolve(&rsrc, src);
- if (error)
- die(fz_rethrow(error, "retrieving resources at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
- }
if (show & FONTS)
{
font = fz_dictgets(rsrc, "Font");
if (font)
{
- error = pdf_resolve(&font, src);
- if (error)
- die(fz_rethrow(error, "resolving font dict at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
-
error = gatherfonts(page, pageref, pageobj, font);
if (error)
die(fz_rethrow(error, "gathering fonts at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
@@ -933,10 +730,6 @@ gatherinfo(int show, int page)
xobj = fz_dictgets(rsrc, "XObject");
if (xobj)
{
- error = pdf_resolve(&xobj, src);
- if (error)
- die(fz_rethrow(error, "resolving xobject dict at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
-
error = gatherimages(page, pageref, pageobj, xobj);
if (error)
die(fz_rethrow(error, "gathering images at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
@@ -954,10 +747,6 @@ gatherinfo(int show, int page)
shade = fz_dictgets(rsrc, "Shading");
if (shade)
{
- error = pdf_resolve(&shade, src);
- if (error)
- die(fz_rethrow(error, "resolving shading dict at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
-
error = gathershadings(page, pageref, pageobj, shade);
if (error)
die(fz_rethrow(error, "gathering shadings at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
@@ -969,10 +758,6 @@ gatherinfo(int show, int page)
pattern = fz_dictgets(rsrc, "Pattern");
if (pattern)
{
- error = pdf_resolve(&pattern, src);
- if (error)
- die(fz_rethrow(error, "resolving pattern dict at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
-
error = gathershadings(page, pageref, pageobj, shade);
if (error)
die(fz_rethrow(error, "gathering shadings at page %d (%d %d R)", page, fz_tonum(pageref), fz_togen(pageref)));
diff --git a/apps/pdfshow.c b/apps/pdfshow.c
index ef301944..981d5b4b 100644
--- a/apps/pdfshow.c
+++ b/apps/pdfshow.c
@@ -44,20 +44,10 @@ void openxref(char *filename, char *password)
/* TODO: move into mupdf lib, see pdfapp_open in pdfapp.c */
obj = fz_dictgets(xref->trailer, "Root");
- if (!obj)
- die(error);
-
- error = pdf_loadindirect(&xref->root, xref, obj);
- if (error)
- die(error);
+ xref->root = fz_resolveindirect(obj);
obj = fz_dictgets(xref->trailer, "Info");
- if (obj)
- {
- error = pdf_loadindirect(&xref->info, xref, obj);
- if (error)
- die(error);
- }
+ xref->info = fz_resolveindirect(obj);
}
void closexref()
diff --git a/fitz/filt_pipeline.c b/fitz/filt_pipeline.c
index c43f5013..85dc1f82 100644
--- a/fitz/filt_pipeline.c
+++ b/fitz/filt_pipeline.c
@@ -44,9 +44,6 @@ fz_newpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail)
fz_error error;
FZ_NEWFILTER(fz_pipeline, p, pipeline);
- p->head = fz_keepfilter(head);
- p->tail = fz_keepfilter(tail);
- p->tailneedsin = 1;
error = fz_newbuffer(&p->buffer, FZ_BUFSIZE);
if (error)
@@ -55,6 +52,10 @@ fz_newpipeline(fz_filter **fp, fz_filter *head, fz_filter *tail)
return fz_rethrow(error, "cannot create buffer");
}
+ p->head = fz_keepfilter(head);
+ p->tail = fz_keepfilter(tail);
+ p->tailneedsin = 1;
+
return fz_okay;
}
diff --git a/fitz/fitz_stream.h b/fitz/fitz_stream.h
index 1e20f5f7..f1f3008a 100644
--- a/fitz/fitz_stream.h
+++ b/fitz/fitz_stream.h
@@ -4,6 +4,8 @@
* Used by the filter library and the mupdf parser.
*/
+typedef struct pdf_xref_s pdf_xref; /* this file is about to be merged with mupdf */
+
typedef struct fz_obj_s fz_obj;
typedef struct fz_keyval_s fz_keyval;
@@ -17,7 +19,7 @@ typedef enum fz_objkind_e
FZ_NAME,
FZ_ARRAY,
FZ_DICT,
- FZ_INDIRECT,
+ FZ_INDIRECT
} fz_objkind;
struct fz_keyval_s
@@ -28,8 +30,8 @@ struct fz_keyval_s
struct fz_obj_s
{
- unsigned short refs;
- char kind; /* fz_objkind takes 4 bytes :( */
+ int refs;
+ fz_objkind kind;
union
{
int b;
@@ -52,8 +54,10 @@ struct fz_obj_s
fz_keyval *items;
} d;
struct {
- int oid;
- int gid;
+ int num;
+ int gen;
+ pdf_xref *xref;
+ fz_obj *obj;
} r;
} u;
};
@@ -64,7 +68,7 @@ fz_error fz_newint(fz_obj **op, int i);
fz_error fz_newreal(fz_obj **op, float f);
fz_error fz_newname(fz_obj **op, char *str);
fz_error fz_newstring(fz_obj **op, char *str, int len);
-fz_error fz_newindirect(fz_obj **op, int oid, int gid);
+fz_error fz_newindirect(fz_obj **op, int num, int gen, pdf_xref *xref);
fz_error fz_newarray(fz_obj **op, int initialcap);
fz_error fz_newdict(fz_obj **op, int initialcap);
@@ -89,6 +93,8 @@ int fz_isindirect(fz_obj *obj);
int fz_objcmp(fz_obj *a, fz_obj *b);
+fz_obj *fz_resolveindirect(fz_obj *obj);
+
/* silent failure, no error reporting */
int fz_tobool(fz_obj *obj);
int fz_toint(fz_obj *obj);
@@ -122,9 +128,8 @@ int fz_sprintobj(char *s, int n, fz_obj *obj, int tight);
int fz_fprintobj(FILE *fp, fz_obj *obj, int tight);
void fz_debugobj(fz_obj *obj);
-fz_error fz_parseobj(fz_obj **objp, char *s);
-fz_error fz_packobj(fz_obj **objp, char *fmt, ...);
-fz_error fz_unpackobj(fz_obj *obj, char *fmt, ...);
+fz_error fz_parseobj(fz_obj **objp, pdf_xref *xref, char *s);
+fz_error fz_packobj(fz_obj **objp, pdf_xref *xref, char *fmt, ...);
char *fz_objkindstr(fz_obj *obj);
diff --git a/fitz/obj_array.c b/fitz/obj_array.c
index fcd0edc7..64062042 100644
--- a/fitz/obj_array.c
+++ b/fitz/obj_array.c
@@ -1,7 +1,7 @@
#include "fitz_base.h"
#include "fitz_stream.h"
-void fz_droparray(fz_obj *obj);
+void fz_freearray(fz_obj *obj);
fz_error
fz_newarray(fz_obj **op, int initialcap)
@@ -51,7 +51,7 @@ fz_copyarray(fz_obj **op, fz_obj *obj)
error = fz_arraypush(new, fz_arrayget(obj, i));
if (error)
{
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot add item to array");
}
}
@@ -85,7 +85,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
error = fz_deepcopyarray(&val, val);
if (error)
{
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot deep copy item");
}
@@ -93,7 +93,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
if (error)
{
fz_dropobj(val);
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot add copied item to array");
}
@@ -105,7 +105,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
error = fz_deepcopydict(&val, val);
if (error)
{
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot deep copy item");
}
@@ -113,7 +113,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
if (error)
{
fz_dropobj(val);
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot add copied item to array");
}
fz_dropobj(val);
@@ -124,7 +124,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
error = fz_arraypush(new, val);
if (error)
{
- fz_droparray(new);
+ fz_freearray(new);
return fz_rethrow(error, "cannot add copied item to array");
}
}
@@ -138,6 +138,7 @@ fz_deepcopyarray(fz_obj **op, fz_obj *obj)
int
fz_arraylen(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (!fz_isarray(obj))
return 0;
return obj->u.a.len;
@@ -146,6 +147,8 @@ fz_arraylen(fz_obj *obj)
fz_obj *
fz_arrayget(fz_obj *obj, int i)
{
+ obj = fz_resolveindirect(obj);
+
if (!fz_isarray(obj))
return nil;
@@ -158,6 +161,8 @@ fz_arrayget(fz_obj *obj, int i)
fz_error
fz_arrayput(fz_obj *obj, int i, fz_obj *item)
{
+ obj = fz_resolveindirect(obj);
+
if (!fz_isarray(obj))
return fz_throw("assert: not an array (%s)", fz_objkindstr(obj));
if (i < 0)
@@ -197,6 +202,8 @@ fz_arraypush(fz_obj *obj, fz_obj *item)
{
fz_error error;
+ obj = fz_resolveindirect(obj);
+
if (!fz_isarray(obj))
return fz_throw("assert: not an array (%s)", fz_objkindstr(obj));
@@ -214,7 +221,7 @@ fz_arraypush(fz_obj *obj, fz_obj *item)
}
void
-fz_droparray(fz_obj *obj)
+fz_freearray(fz_obj *obj)
{
int i;
diff --git a/fitz/obj_dict.c b/fitz/obj_dict.c
index 24f24e56..6dfc3a64 100644
--- a/fitz/obj_dict.c
+++ b/fitz/obj_dict.c
@@ -181,6 +181,7 @@ growdict(fz_obj *obj)
int
fz_dictlen(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (!fz_isdict(obj))
return 0;
return obj->u.d.len;
@@ -189,6 +190,8 @@ fz_dictlen(fz_obj *obj)
fz_obj *
fz_dictgetkey(fz_obj *obj, int i)
{
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return nil;
@@ -201,6 +204,8 @@ fz_dictgetkey(fz_obj *obj, int i)
fz_obj *
fz_dictgetval(fz_obj *obj, int i)
{
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return nil;
@@ -245,6 +250,8 @@ fz_dictgets(fz_obj *obj, char *key)
{
int i;
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return nil;
@@ -282,6 +289,8 @@ fz_dictput(fz_obj *obj, fz_obj *key, fz_obj *val)
char *s;
int i;
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return fz_throw("assert: not a dict (%s)", fz_objkindstr(obj));
@@ -342,6 +351,8 @@ fz_dictdels(fz_obj *obj, char *key)
{
int i;
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return fz_throw("assert: not a dict (%s)", fz_objkindstr(obj));
@@ -370,10 +381,12 @@ fz_dictdel(fz_obj *obj, fz_obj *key)
}
void
-fz_dropdict(fz_obj *obj)
+fz_freedict(fz_obj *obj)
{
int i;
+ obj = fz_resolveindirect(obj);
+
if (!fz_isdict(obj))
return;
@@ -391,6 +404,7 @@ fz_dropdict(fz_obj *obj)
void
fz_sortdict(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (!fz_isdict(obj))
return;
if (!obj->u.d.sorted)
diff --git a/fitz/obj_parse.c b/fitz/obj_parse.c
index 531137b1..cf7b29b9 100644
--- a/fitz/obj_parse.c
+++ b/fitz/obj_parse.c
@@ -3,6 +3,8 @@
struct vap { va_list ap; };
+static fz_error parseobj(fz_obj **obj, pdf_xref *xref, char **sp, struct vap *v);
+
static inline int iswhite(int ch)
{
return
@@ -30,8 +32,6 @@ static inline int isregular(int ch)
return !isdelim(ch) && !iswhite(ch) && ch != EOF;
}
-static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v);
-
static inline int fromhex(char ch)
{
if (ch >= '0' && ch <= '9')
@@ -106,7 +106,7 @@ static fz_error parsenumber(fz_obj **obj, char **sp)
return fz_okay;
}
-static fz_error parsedict(fz_obj **obj, char **sp, struct vap *v)
+static fz_error parsedict(fz_obj **obj, pdf_xref *xref, char **sp, struct vap *v)
{
fz_error error = fz_okay;
fz_obj *dict = nil;
@@ -153,7 +153,7 @@ static fz_error parsedict(fz_obj **obj, char **sp, struct vap *v)
skipwhite(&s);
- error = parseobj(&val, &s, v);
+ error = parseobj(&val, xref, &s, v);
if (error)
{
error = fz_rethrow(error, "cannot parse value");
@@ -184,7 +184,7 @@ cleanup:
return error; /* already rethrown */
}
-static fz_error parsearray(fz_obj **obj, char **sp, struct vap *v)
+static fz_error parsearray(fz_obj **obj, pdf_xref *xref, char **sp, struct vap *v)
{
fz_error error;
fz_obj *a;
@@ -207,7 +207,7 @@ static fz_error parsearray(fz_obj **obj, char **sp, struct vap *v)
break;
}
- error = parseobj(&o, &s, v);
+ error = parseobj(&o, xref, &s, v);
if (error)
{
fz_dropobj(a);
@@ -336,11 +336,11 @@ static fz_error parsehexstring(fz_obj **obj, char **sp)
return fz_okay;
}
-static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v)
+static fz_error parseobj(fz_obj **obj, pdf_xref *xref, char **sp, struct vap *v)
{
fz_error error;
char buf[32];
- int oid, gid, len;
+ int num, gen, len;
char *tmp;
char *s = *sp;
@@ -363,9 +363,9 @@ static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v)
case 'f': error = fz_newreal(obj, (float)va_arg(v->ap, double)); break;
case 'n': error = fz_newname(obj, va_arg(v->ap, char*)); break;
case 'r':
- oid = va_arg(v->ap, int);
- gid = va_arg(v->ap, int);
- error = fz_newindirect(obj, oid, gid);
+ num = va_arg(v->ap, int);
+ gen = va_arg(v->ap, int);
+ error = fz_newindirect(obj, num, gen, xref);
break;
case 's':
tmp = va_arg(v->ap, char*);
@@ -405,7 +405,7 @@ static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v)
{
if (s[1] == '<')
{
- error = parsedict(obj, &s, v);
+ error = parsedict(obj, xref, &s, v);
if (error)
error = fz_rethrow(error, "cannot parse dict");
}
@@ -419,7 +419,7 @@ static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v)
else if (*s == '[')
{
- error = parsearray(obj, &s, v);
+ error = parsearray(obj, xref, &s, v);
if (error)
error = fz_rethrow(error, "cannot parse array");
}
@@ -464,8 +464,7 @@ static fz_error parseobj(fz_obj **obj, char **sp, struct vap *v)
return error; /* already rethrown */
}
-fz_error
-fz_packobj(fz_obj **op, char *fmt, ...)
+fz_error fz_packobj(fz_obj **op, pdf_xref *xref, char *fmt, ...)
{
fz_error error;
struct vap v;
@@ -474,7 +473,7 @@ fz_packobj(fz_obj **op, char *fmt, ...)
va_start(ap, fmt);
va_copy(v.ap, ap);
- error = parseobj(op, &fmt, &v);
+ error = parseobj(op, xref, &fmt, &v);
va_end(ap);
@@ -483,9 +482,8 @@ fz_packobj(fz_obj **op, char *fmt, ...)
return fz_okay;
}
-fz_error
-fz_parseobj(fz_obj **op, char *str)
+fz_error fz_parseobj(fz_obj **op, pdf_xref *xref, char *str)
{
- return parseobj(op, &str, nil);
+ return parseobj(op, xref, &str, nil);
}
diff --git a/fitz/obj_print.c b/fitz/obj_print.c
index 58ab1268..7cbcf709 100644
--- a/fitz/obj_print.c
+++ b/fitz/obj_print.c
@@ -275,7 +275,7 @@ static void fmtobj(struct fmt *fmt, fz_obj *obj)
fmtdict(fmt, obj);
break;
case FZ_INDIRECT:
- sprintf(buf, "%d %d R", obj->u.r.oid, obj->u.r.gid);
+ sprintf(buf, "%d %d R", obj->u.r.num, obj->u.r.gen);
fmtputs(fmt, buf);
break;
default:
diff --git a/fitz/obj_simple.c b/fitz/obj_simple.c
index 031e55ee..bfc3ecb2 100644
--- a/fitz/obj_simple.c
+++ b/fitz/obj_simple.c
@@ -1,8 +1,8 @@
-#include "fitz_base.h"
-#include "fitz_stream.h"
+#include "fitz.h"
+#include "mupdf.h"
-extern void fz_droparray(fz_obj *array);
-extern void fz_dropdict(fz_obj *dict);
+extern void fz_freearray(fz_obj *array);
+extern void fz_freedict(fz_obj *dict);
#define NEWOBJ(KIND,SIZE) \
fz_obj *o; \
@@ -61,11 +61,13 @@ fz_newname(fz_obj **op, char *str)
}
fz_error
-fz_newindirect(fz_obj **op, int objid, int genid)
+fz_newindirect(fz_obj **op, int num, int gen, pdf_xref *xref)
{
NEWOBJ(FZ_INDIRECT, sizeof (fz_obj));
- o->u.r.oid = objid;
- o->u.r.gid = genid;
+ o->u.r.num = num;
+ o->u.r.gen = gen;
+ o->u.r.xref = xref;
+ o->u.r.obj = nil;
return fz_okay;
}
@@ -84,79 +86,90 @@ fz_dropobj(fz_obj *o)
if (--o->refs == 0)
{
if (o->kind == FZ_ARRAY)
- fz_droparray(o);
+ {
+ fz_freearray(o);
+ }
else if (o->kind == FZ_DICT)
- fz_dropdict(o);
+ {
+ fz_freedict(o);
+ }
+ else if (o->kind == FZ_INDIRECT)
+ {
+ if (o->u.r.obj)
+ fz_dropobj(o->u.r.obj);
+ fz_free(o);
+ }
else
+ {
fz_free(o);
+ }
}
}
-int
-fz_isnull(fz_obj *obj)
+int fz_isindirect(fz_obj *obj)
{
+ return obj ? obj->kind == FZ_INDIRECT : 0;
+}
+
+int fz_isnull(fz_obj *obj)
+{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_NULL : 0;
}
-int
-fz_isbool(fz_obj *obj)
+int fz_isbool(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_BOOL : 0;
}
-int
-fz_isint(fz_obj *obj)
+int fz_isint(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_INT : 0;
}
-int
-fz_isreal(fz_obj *obj)
+int fz_isreal(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_REAL : 0;
}
-int
-fz_isstring(fz_obj *obj)
+int fz_isstring(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_STRING : 0;
}
-int
-fz_isname(fz_obj *obj)
+int fz_isname(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_NAME : 0;
}
-int
-fz_isarray(fz_obj *obj)
+int fz_isarray(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_ARRAY : 0;
}
-int
-fz_isdict(fz_obj *obj)
+int fz_isdict(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
return obj ? obj->kind == FZ_DICT : 0;
}
-int
-fz_isindirect(fz_obj *obj)
-{
- return obj ? obj->kind == FZ_INDIRECT : 0;
-}
-
-int
-fz_tobool(fz_obj *obj)
+int fz_tobool(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isbool(obj))
return obj->u.b;
return 0;
}
-int
-fz_toint(fz_obj *obj)
+int fz_toint(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isint(obj))
return obj->u.i;
if (fz_isreal(obj))
@@ -164,9 +177,9 @@ fz_toint(fz_obj *obj)
return 0;
}
-float
-fz_toreal(fz_obj *obj)
+float fz_toreal(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isreal(obj))
return obj->u.f;
if (fz_isint(obj))
@@ -174,53 +187,63 @@ fz_toreal(fz_obj *obj)
return 0;
}
-char *
-fz_toname(fz_obj *obj)
+char *fz_toname(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isname(obj))
return obj->u.n;
return "";
}
-char *
-fz_tostrbuf(fz_obj *obj)
+char *fz_tostrbuf(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isstring(obj))
return obj->u.s.buf;
return "";
}
-int
-fz_tostrlen(fz_obj *obj)
+int fz_tostrlen(fz_obj *obj)
{
+ obj = fz_resolveindirect(obj);
if (fz_isstring(obj))
return obj->u.s.len;
return 0;
}
-int
-fz_tonum(fz_obj *obj)
+int fz_tonum(fz_obj *obj)
{
if (fz_isindirect(obj))
- return obj->u.r.oid;
+ return obj->u.r.num;
return 0;
}
-int
-fz_togen(fz_obj *obj)
+int fz_togen(fz_obj *obj)
{
if (fz_isindirect(obj))
- return obj->u.r.gid;
+ return obj->u.r.gen;
return 0;
}
-fz_error
-fz_newnamefromstring(fz_obj **op, fz_obj *str)
+fz_obj *fz_resolveindirect(fz_obj *ref)
{
- NEWOBJ(FZ_NAME, offsetof(fz_obj, u.n) + fz_tostrlen(str) + 1);
- memcpy(o->u.n, fz_tostrbuf(str), fz_tostrlen(str));
- o->u.n[fz_tostrlen(str)] = '\0';
- return fz_okay;
+ int error;
+
+ if (fz_isindirect(ref))
+ {
+ if (!ref->u.r.obj && ref->u.r.xref)
+ {
+ error = pdf_loadobject(&ref->u.r.obj, ref->u.r.xref, fz_tonum(ref), fz_togen(ref));
+ if (error)
+ {
+ fz_catch(error, "cannot resolve reference (%d %d R); ignoring error", fz_tonum(ref), fz_togen(ref));
+ ref->u.r.obj = fz_keepobj(ref);
+ }
+ }
+ return ref->u.r.obj;
+ }
+
+ return ref;
}
int
@@ -249,9 +272,9 @@ fz_objcmp(fz_obj *a, fz_obj *b)
return strcmp(a->u.n, b->u.n);
case FZ_INDIRECT:
- if (a->u.r.oid == b->u.r.oid)
- return a->u.r.gid - b->u.r.gid;
- return a->u.r.oid - b->u.r.oid;
+ if (a->u.r.num == b->u.r.num)
+ return a->u.r.gen - b->u.r.gen;
+ return a->u.r.num - b->u.r.num;
case FZ_ARRAY:
if (a->u.a.len != b->u.a.len)
diff --git a/mupdf/mupdf.h b/mupdf/mupdf.h
index bd19bf14..6e418afc 100644
--- a/mupdf/mupdf.h
+++ b/mupdf/mupdf.h
@@ -34,10 +34,10 @@ typedef enum pdf_token_e
fz_error pdf_lex(pdf_token_e *tok, fz_stream *f, char *buf, int n, int *len);
/* parse.c */
-fz_error pdf_parsearray(fz_obj **op, fz_stream *f, char *buf, int cap);
-fz_error pdf_parsedict(fz_obj **op, fz_stream *f, char *buf, int cap);
-fz_error pdf_parsestmobj(fz_obj **op, fz_stream *f, char *buf, int cap);
-fz_error pdf_parseindobj(fz_obj **op, fz_stream *f, char *buf, int cap, int *oid, int *gen, int *stmofs);
+fz_error pdf_parsearray(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
+fz_error pdf_parsedict(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
+fz_error pdf_parsestmobj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap);
+fz_error pdf_parseindobj(fz_obj **op, pdf_xref *xref, fz_stream *f, char *buf, int cap, int *oid, int *gen, int *stmofs);
fz_rect pdf_torect(fz_obj *array);
fz_matrix pdf_tomatrix(fz_obj *array);
@@ -101,7 +101,7 @@ void pdf_dropcrypt(pdf_crypt *crypt);
*/
typedef struct pdf_xrefentry_s pdf_xrefentry;
-typedef struct pdf_xref_s pdf_xref;
+/* typedef struct pdf_xref_s pdf_xref; -- already defined in fitz_stream.h */
struct pdf_xref_s
{
@@ -144,8 +144,6 @@ void pdf_closexref(pdf_xref *);
fz_error pdf_cacheobject(pdf_xref *, int oid, int gen);
fz_error pdf_loadobject(fz_obj **objp, pdf_xref *, int oid, int gen);
-fz_error pdf_loadindirect(fz_obj **objp, pdf_xref *, fz_obj *ref);
-fz_error pdf_resolve(fz_obj **reforobj, pdf_xref *);
int pdf_isstream(pdf_xref *xref, int oid, int gen);
fz_error pdf_buildinlinefilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj);
diff --git a/mupdf/pdf_annot.c b/mupdf/pdf_annot.c
index 8e1c9d8f..c29908b6 100644
--- a/mupdf/pdf_annot.c
+++ b/mupdf/pdf_annot.c
@@ -40,16 +40,12 @@ resolvedest(pdf_xref *xref, fz_obj *dest)
if (fz_isname(dest))
{
dest = fz_dictget(xref->dests, dest);
- if (dest)
- pdf_resolve(&dest, xref); /* XXX */
return resolvedest(xref, dest);
}
else if (fz_isstring(dest))
{
dest = fz_dictget(xref->dests, dest);
- if (dest)
- pdf_resolve(&dest, xref); /* XXX */
return resolvedest(xref, dest);
}
@@ -99,21 +95,13 @@ pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "Dest");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Dest");
dest = resolvedest(xref, obj);
pdf_logpage("dest (%d %d R)\n", fz_tonum(dest), fz_togen(dest));
- fz_dropobj(obj);
}
action = fz_dictgets(dict, "A");
if (action)
{
- error = pdf_resolve(&action, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /A");
-
obj = fz_dictgets(action, "S");
if (!strcmp(fz_toname(obj), "GoTo"))
{
@@ -127,8 +115,6 @@ pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict)
}
else
pdf_logpage("action ... ?\n");
-
- fz_dropobj(action);
}
pdf_logpage("}\n");
@@ -162,13 +148,6 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
for (i = 0; i < fz_arraylen(annots); i++)
{
obj = fz_arrayget(annots, i);
- error = pdf_resolve(&obj, xref);
- if (error)
- {
- if (link)
- pdf_droplink(link);
- return fz_rethrow(error, "cannot resolve annotation");
- }
subtype = fz_dictgets(obj, "Subtype");
if (!strcmp(fz_toname(subtype), "Link"))
@@ -176,7 +155,6 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
pdf_link *temp = nil;
error = pdf_loadlink(&temp, xref, obj);
- fz_dropobj(obj);
if (error)
{
if (link)
@@ -193,7 +171,6 @@ pdf_loadannots(pdf_comment **cp, pdf_link **lp, pdf_xref *xref, fz_obj *annots)
else
{
error = loadcomment(&comment, xref, obj);
- fz_dropobj(obj);
if (error)
{
if (link)
diff --git a/mupdf/pdf_cmap_load.c b/mupdf/pdf_cmap_load.c
index d8c3d8ec..ae6f8f7a 100644
--- a/mupdf/pdf_cmap_load.c
+++ b/mupdf/pdf_cmap_load.c
@@ -8,7 +8,7 @@ fz_error
pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmref)
{
fz_error error = fz_okay;
- fz_obj *stmobj = stmref;
+ fz_obj *stmobj;
fz_stream *file = nil;
pdf_cmap *cmap = nil;
pdf_cmap *usecmap;
@@ -23,9 +23,7 @@ pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmref)
pdf_logfont("load embedded cmap (%d %d R) {\n", fz_tonum(stmref), fz_togen(stmref));
- error = pdf_resolve(&stmobj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve cmap object");
+ stmobj = fz_resolveindirect(stmref);
error = pdf_openstream(&file, xref, fz_tonum(stmref), fz_togen(stmref));
if (error)
@@ -85,8 +83,6 @@ pdf_loadembeddedcmap(pdf_cmap **cmapp, pdf_xref *xref, fz_obj *stmref)
goto cleanup;
}
- fz_dropobj(stmobj);
-
*cmapp = cmap;
return fz_okay;
@@ -95,7 +91,6 @@ cleanup:
fz_dropstream(file);
if (cmap)
pdf_dropcmap(cmap);
- fz_dropobj(stmobj);
return error; /* already rethrown */
}
diff --git a/mupdf/pdf_colorspace1.c b/mupdf/pdf_colorspace1.c
index 0e6444a4..94966558 100644
--- a/mupdf/pdf_colorspace1.c
+++ b/mupdf/pdf_colorspace1.c
@@ -231,10 +231,6 @@ loadcalgray(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
struct calgray *cs;
fz_obj *tmp;
- error = pdf_resolve(&dict, xref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
-
cs = fz_malloc(sizeof(struct calgray));
if (!cs)
return fz_rethrow(-1, "out of memory: gray colorspace struct");
@@ -273,8 +269,6 @@ loadcalgray(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
if (fz_isreal(tmp))
cs->gamma = fz_toreal(tmp);
- fz_dropobj(dict);
-
*csp = (fz_colorspace*) cs;
return fz_okay;
}
@@ -287,10 +281,6 @@ loadcalrgb(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
fz_obj *tmp;
int i;
- error = pdf_resolve(&dict, xref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
-
cs = fz_malloc(sizeof(struct calrgb));
if (!cs)
return fz_rethrow(-1, "out of memory: RGB colorspace struct");
@@ -348,8 +338,6 @@ loadcalrgb(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
fz_invert3x3(cs->invmat, cs->matrix);
- fz_dropobj(dict);
-
*csp = (fz_colorspace*) cs;
return fz_okay;
}
@@ -361,10 +349,6 @@ loadlab(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
struct cielab *cs;
fz_obj *tmp;
- error = pdf_resolve(&dict, xref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
-
cs = fz_malloc(sizeof(struct cielab));
if (!cs)
return fz_rethrow(-1, "out of memory: L*a*b colorspace struct");
@@ -411,8 +395,6 @@ loadlab(fz_colorspace **csp, pdf_xref *xref, fz_obj *dict)
cs->range[3] = fz_toreal(fz_arrayget(tmp, 3));
}
- fz_dropobj(dict);
-
*csp = (fz_colorspace*) cs;
return fz_okay;
}
@@ -432,14 +414,10 @@ loadiccbased(fz_colorspace **csp, pdf_xref *xref, fz_obj *ref)
pdf_logrsrc("load ICCBased\n");
- error = pdf_loadindirect(&dict, xref, ref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
+ dict = fz_resolveindirect(ref);
n = fz_toint(fz_dictgets(dict, "N"));
- fz_dropobj(dict);
-
switch (n)
{
case 1: *csp = pdf_devicegray; return fz_okay;
@@ -509,12 +487,7 @@ loadseparation(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
pdf_logrsrc("n = %d\n", n);
- error = pdf_resolve(&baseobj, xref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
-
error = pdf_loadcolorspace(&base, xref, baseobj);
- fz_dropobj(baseobj);
if (error)
return fz_rethrow(error, "cannot load base colorspace");
fz_keepcolorspace(base);
@@ -587,12 +560,7 @@ loadindexed(fz_colorspace **csp, pdf_xref *xref, fz_obj *array)
pdf_logrsrc("load Indexed {\n");
- error = pdf_resolve(&baseobj, xref);
- if (error)
- return fz_rethrow(error, "cannot find colorspace");
-
error = pdf_loadcolorspace(&base, xref, baseobj);
- fz_dropobj(baseobj);
if (error)
return fz_rethrow(error, "cannot load base colorspace");
fz_keepcolorspace(base);
@@ -738,12 +706,7 @@ pdf_loadcolorspace(fz_colorspace **csp, pdf_xref *xref, fz_obj *obj)
return fz_okay;
}
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot find pattern");
-
error = pdf_loadcolorspace(csp, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load pattern");
}
diff --git a/mupdf/pdf_crypt.c b/mupdf/pdf_crypt.c
index e2f844c4..faf606d6 100644
--- a/mupdf/pdf_crypt.c
+++ b/mupdf/pdf_crypt.c
@@ -472,7 +472,7 @@ pdf_newencrypt(pdf_crypt **cp, char *userpw, char *ownerpw, int p, int n, fz_obj
createuser(crypt,
(unsigned char *) userpw, strlen(userpw));
- error = fz_packobj(&crypt->encrypt,
+ error = fz_packobj(&crypt->encrypt, nil,
"<< /Filter /Standard "
"/V %i /R %i "
"/O %# /U %# "
diff --git a/mupdf/pdf_font.c b/mupdf/pdf_font.c
index fd57e182..7ed646bb 100644
--- a/mupdf/pdf_font.c
+++ b/mupdf/pdf_font.c
@@ -329,10 +329,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
encoding = fz_dictgets(dict, "Encoding");
if (encoding && !(kind == TRUETYPE && symbolic))
{
- error = pdf_resolve(&encoding, xref);
- if (error)
- goto cleanup;
-
if (fz_isname(encoding))
pdf_loadencoding(estrings, fz_toname(encoding));
@@ -345,13 +341,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
pdf_loadencoding(estrings, fz_toname(base));
diff = fz_dictgets(encoding, "Differences");
- if (diff)
- {
- error = pdf_resolve(&diff, xref);
- if (error)
- goto cleanup;
- }
-
if (fz_isarray(diff))
{
n = fz_arraylen(diff);
@@ -430,8 +419,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
}
}
}
-
- fz_dropobj(encoding);
}
else
@@ -468,10 +455,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
{
int first, last;
- error = pdf_resolve(&widths, xref);
- if (error)
- goto cleanup;
-
first = fz_toint(fz_dictgets(dict, "FirstChar"));
last = fz_toint(fz_dictgets(dict, "LastChar"));
@@ -485,8 +468,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
if (error)
goto cleanup;
}
-
- fz_dropobj(widths);
}
else
{
@@ -510,8 +491,6 @@ loadsimplefont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *r
cleanup:
fz_free(etable);
- if (widths)
- fz_dropobj(widths);
fz_dropfont(fontdesc->font);
fz_free(fontdesc);
return fz_rethrow(error, "cannot load simple font");
@@ -551,10 +530,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
if (!cidinfo)
return fz_throw("cid font is missing info");
- error = pdf_resolve(&cidinfo, xref);
- if (error)
- return fz_rethrow(error, "cannot find CIDSystemInfo");
-
obj = fz_dictgets(cidinfo, "Registry");
tmplen = MIN(sizeof tmpstr - 1, fz_tostrlen(obj));
memcpy(tmpstr, fz_tostrbuf(obj), tmplen);
@@ -568,8 +543,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
memcpy(tmpstr, fz_tostrbuf(obj), tmplen);
tmpstr[tmplen] = '\0';
strlcat(collection, tmpstr, sizeof collection);
-
- fz_dropobj(cidinfo);
}
/*
@@ -727,10 +700,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
int c0, c1, w;
fz_obj *obj;
- error = pdf_resolve(&widths, xref);
- if (error)
- goto cleanup;
-
for (i = 0; i < fz_arraylen(widths); )
{
c0 = fz_toint(fz_arrayget(widths, i));
@@ -756,8 +725,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
i += 3;
}
}
-
- fz_dropobj(widths);
}
error = pdf_endhmtx(fontdesc);
@@ -788,10 +755,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
{
int c0, c1, w, x, y, k;
- error = pdf_resolve(&widths, xref);
- if (error)
- goto cleanup;
-
for (i = 0; i < fz_arraylen(widths); )
{
c0 = fz_toint(fz_arrayget(widths, i));
@@ -821,8 +784,6 @@ loadcidfont(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref,
i += 5;
}
}
-
- fz_dropobj(widths);
}
error = pdf_endvmtx(fontdesc);
@@ -856,17 +817,8 @@ loadtype0(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
dfonts = fz_dictgets(dict, "DescendantFonts");
if (!dfonts)
return fz_throw("cid font is missing descendant fonts");
- error = pdf_resolve(&dfonts, xref);
- if (error)
- return fz_rethrow(error, "cannot find DescendantFonts");
dfont = fz_arrayget(dfonts, 0);
- error = pdf_resolve(&dfont, xref);
- if (error)
- {
- fz_dropobj(dfonts);
- return fz_rethrow(error, "cannot find descendant font");
- }
subtype = fz_dictgets(dfont, "Subtype");
encoding = fz_dictgets(dict, "Encoding");
@@ -878,10 +830,6 @@ loadtype0(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
error = loadcidfont(fontdescp, xref, dfont, ref, encoding, tounicode);
else
error = fz_throw("syntaxerror: unknown cid font type");
-
- fz_dropobj(dfont);
- fz_dropobj(dfonts);
-
if (error)
return fz_rethrow(error, "cannot load descendant font");
@@ -900,10 +848,6 @@ pdf_loadfontdescriptor(pdf_fontdesc *fontdesc, pdf_xref *xref, fz_obj *dict, cha
fz_rect bbox;
char *fontname;
- error = pdf_resolve(&dict, xref);
- if (error)
- return fz_rethrow(error, "cannot find font descriptor");
-
pdf_logfont("load fontdescriptor {\n");
fontname = fz_toname(fz_dictgets(dict, "FontName"));
@@ -941,25 +885,20 @@ pdf_loadfontdescriptor(pdf_fontdesc *fontdesc, pdf_xref *xref, fz_obj *dict, cha
fz_catch(error, "ignored error when loading embedded font, attempting to load system font");
error = pdf_loadsystemfont(fontdesc, fontname, collection);
if (error)
- goto cleanup;
+ return fz_rethrow(error, "cannot load font descriptor");
}
}
else
{
error = pdf_loadsystemfont(fontdesc, fontname, collection);
if (error)
- goto cleanup;
+ return fz_rethrow(error, "cannot load font descriptor");
}
- fz_dropobj(dict);
-
pdf_logfont("}\n");
return fz_okay;
-cleanup:
- fz_dropobj(dict);
- return fz_rethrow(error, "cannot load font descriptor");
}
fz_error
diff --git a/mupdf/pdf_function.c b/mupdf/pdf_function.c
index 111cca4a..6926f572 100644
--- a/mupdf/pdf_function.c
+++ b/mupdf/pdf_function.c
@@ -1245,16 +1245,9 @@ loadstitchingfunc(pdf_function *func, pdf_xref *xref, fz_obj *dict)
return fz_throw("/Domain must be one dimension (%d)", func->m);
obj = fz_dictgets(dict, "Functions");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Functions");
- }
if (!fz_isarray(obj))
return fz_throw("stitching function has no input functions");
{
-
k = fz_arraylen(obj);
func->u.st.k = k;
@@ -1262,17 +1255,13 @@ loadstitchingfunc(pdf_function *func, pdf_xref *xref, fz_obj *dict)
func->u.st.funcs = fz_malloc(func->u.st.k * sizeof (pdf_function));
if (!func->u.st.funcs)
- {
- fz_dropobj(obj);
return fz_throw("out of memory");
- }
funcs = func->u.st.funcs;
func->u.st.bounds = fz_malloc((func->u.st.k - 1) * sizeof (float));
if (!func->u.st.bounds)
{
fz_free(func->u.st.funcs);
- fz_dropobj(obj);
return fz_throw("out of memory");
}
@@ -1281,7 +1270,6 @@ loadstitchingfunc(pdf_function *func, pdf_xref *xref, fz_obj *dict)
{
fz_free(func->u.st.funcs);
fz_free(func->u.st.bounds);
- fz_dropobj(obj);
return fz_throw("out of memory");
}
@@ -1290,95 +1278,51 @@ loadstitchingfunc(pdf_function *func, pdf_xref *xref, fz_obj *dict)
sub = fz_arrayget(obj, i);
error = pdf_loadfunction(&func->u.st.funcs[i], xref, sub);
if (error)
- {
- fz_dropobj(obj);
return fz_rethrow(error, "cannot load sub function %d", i);
- }
if (funcs[i]->m != 1 || funcs[i]->n != funcs[0]->n)
- {
- fz_dropobj(obj);
return fz_rethrow(error, "sub function %d /Domain or /Range mismatch", i);
- }
}
if (!func->n)
- {
func->n = funcs[0]->n;
- }
else if (func->n != funcs[0]->n)
- {
- fz_dropobj(obj);
return fz_rethrow(error, "sub function /Domain or /Range mismatch");
- }
-
- fz_dropobj(obj);
}
obj = fz_dictgets(dict, "Bounds");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Bounds");
- }
if (!fz_isarray(obj))
return fz_throw("stitching function has no bounds");
{
-
if (!fz_isarray(obj) || fz_arraylen(obj) != k - 1)
- {
- fz_dropobj(obj);
return fz_throw("malformed /Bounds (not array or wrong length)");
- }
for (i = 0; i < k-1; ++i)
{
num = fz_arrayget(obj, i);
if (!fz_isint(num) && !fz_isreal(num))
- {
- fz_dropobj(obj);
return fz_throw("malformed /Bounds (item not number)");
- }
func->u.st.bounds[i] = fz_toreal(num);
if (i && func->u.st.bounds[i-1] > func->u.st.bounds[i])
- {
- fz_dropobj(obj);
return fz_throw("malformed /Bounds (item not monotonic)");
- }
}
- if (k != 1 &&
- (func->domain[0][0] > func->u.st.bounds[0] ||
- func->domain[0][1] < func->u.st.bounds[k-2]))
+ if (k != 1 && (func->domain[0][0] > func->u.st.bounds[0] ||
+ func->domain[0][1] < func->u.st.bounds[k-2]))
fz_warn("malformed shading function bounds (domain mismatch), proceeding anyway.");
-
- fz_dropobj(obj);
}
obj = fz_dictgets(dict, "Encode");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Encode");
- }
if (!fz_isarray(obj))
return fz_throw("stitching function is missing encoding");
{
-
if (!fz_isarray(obj) || fz_arraylen(obj) != k * 2)
- {
- fz_dropobj(obj);
return fz_throw("malformed /Encode");
- }
for (i = 0; i < k; ++i)
{
func->u.st.encode[i*2+0] = fz_toreal(fz_arrayget(obj, i*2+0));
func->u.st.encode[i*2+1] = fz_toreal(fz_arrayget(obj, i*2+1));
}
-
- fz_dropobj(obj);
}
pdf_logrsrc("}\n");
@@ -1496,13 +1440,7 @@ pdf_loadfunction(pdf_function **funcp, pdf_xref *xref, fz_obj *ref)
memset(func, 0, sizeof(pdf_function));
func->refs = 1;
- dict = ref;
- error = pdf_resolve(&dict, xref);
- if (error)
- {
- fz_free(func);
- return fz_rethrow(error, "cannot resolve function object");
- }
+ dict = fz_resolveindirect(ref);
obj = fz_dictgets(dict, "FunctionType");
func->type = fz_toint(obj);
diff --git a/mupdf/pdf_image.c b/mupdf/pdf_image.c
index 83de575d..91b02dfe 100644
--- a/mupdf/pdf_image.c
+++ b/mupdf/pdf_image.c
@@ -71,7 +71,6 @@ pdf_loadinlineimage(pdf_image **imgp, pdf_xref *xref,
if (!img->super.cs)
{
- /* XXX danger! danger! does this resolve? */
error = pdf_loadcolorspace(&img->super.cs, xref, cs);
if (error)
return error;
@@ -244,42 +243,15 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
* Dimensions, BPC and ColorSpace
*/
- w = 0;
- obj = fz_dictgets(dict, "Width");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot parse image dictionary");
- w = fz_toint(obj);
- fz_dropobj(obj);
- }
+ w = fz_toint(fz_dictgets(dict, "Width"));
if (w == 0)
fz_warn("image width is zero or undefined");
- h = 0;
- obj = fz_dictgets(dict, "Height");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot parse image dictionary");
- h = fz_toint(obj);
- fz_dropobj(obj);
- }
+ h = fz_toint(fz_dictgets(dict, "Height"));
if (h == 0)
fz_warn("image height is zero or undefined");
- bpc = 0;
- obj = fz_dictgets(dict, "BitsPerComponent");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot parse image dictionary");
- bpc = fz_toint(obj);
- fz_dropobj(obj);
- }
+ bpc = fz_toint(fz_dictgets(dict, "BitsPerComponent"));
pdf_logimage("size %dx%d %d\n", w, h, bpc);
@@ -292,15 +264,9 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
fz_keepcolorspace(cs);
else
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return error;
-
error = pdf_loadcolorspace(&cs, xref, obj);
if (error)
return error;
-
- fz_dropobj(obj);
}
if (!strcmp(cs->name, "Indexed"))
@@ -352,9 +318,7 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
{
pdf_logimage("has soft mask\n");
- error = pdf_loadindirect(&sub, xref, obj);
- if (error)
- return error;
+ sub = fz_resolveindirect(obj);
error = pdf_loadimage(&mask, xref, sub, obj);
if (error)
@@ -366,16 +330,12 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
mask->super.cs = 0;
mask->super.n = 0;
mask->super.a = 1;
-
- fz_dropobj(sub);
}
obj = fz_dictgets(dict, "Mask");
if (fz_isindirect(obj))
{
- error = pdf_loadindirect(&sub, xref, obj);
- if (error)
- return error;
+ sub = fz_resolveindirect(obj);
if (fz_isarray(sub))
{
usecolorkey = 1;
@@ -388,7 +348,6 @@ pdf_loadimage(pdf_image **imgp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
if (error)
return error;
}
- fz_dropobj(sub);
}
else if (fz_isarray(obj))
{
diff --git a/mupdf/pdf_interpret.c b/mupdf/pdf_interpret.c
index 12367882..3c9cb133 100644
--- a/mupdf/pdf_interpret.c
+++ b/mupdf/pdf_interpret.c
@@ -366,20 +366,13 @@ runextgstate(pdf_gstate *gstate, pdf_xref *xref, fz_obj *extgstate)
else if (!strcmp(s, "SMask"))
{
- fz_error error = pdf_resolve(&val, xref);
- if (error)
- return error;
if (fz_isdict(val))
{
fz_obj *g = fz_dictgets(val, "G");
- error = pdf_resolve(&g, xref);
- if (error)
- return error;
/* TODO: we should do something here, like inserting a mask node for the S key in val */
/* TODO: how to deal with the non-recursive nature of pdf soft masks? */
puts("we encountered a soft mask");
}
- fz_dropobj(val);
}
else if (!strcmp(s, "TR"))
@@ -1308,7 +1301,7 @@ pdf_runcsi(pdf_csi *csi, pdf_xref *xref, fz_obj *rdb, fz_stream *file)
break;
case PDF_TODICT:
- error = pdf_parsedict(&csi->stack[csi->top], file, buf, sizeof buf);
+ error = pdf_parsedict(&csi->stack[csi->top], xref, file, buf, sizeof buf);
if (error) return fz_rethrow(error, "cannot parse dictionary");
csi->top ++;
break;
@@ -1360,7 +1353,7 @@ pdf_runcsi(pdf_csi *csi, pdf_xref *xref, fz_obj *rdb, fz_stream *file)
{
fz_obj *obj;
- error = pdf_parsedict(&obj, file, buf, sizeof buf);
+ error = pdf_parsedict(&obj, xref, file, buf, sizeof buf);
if (error)
return fz_rethrow(error, "cannot parse inline image dictionary");
diff --git a/mupdf/pdf_nametree.c b/mupdf/pdf_nametree.c
index 73900a8d..cc4511aa 100644
--- a/mupdf/pdf_nametree.c
+++ b/mupdf/pdf_nametree.c
@@ -11,20 +11,9 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
fz_obj *val;
int i, len;
- error = pdf_resolve(&node, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve name tree");
-
names = fz_dictgets(node, "Names");
if (names)
{
- error = pdf_resolve(&names, xref);
- if (error)
- {
- fz_dropobj(node);
- return fz_rethrow(error, "cannot resolve /Names");
- }
-
len = fz_arraylen(names) / 2;
for (i = 0; i < len; ++i)
@@ -32,57 +21,26 @@ loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node)
key = fz_arrayget(names, i * 2 + 0);
val = fz_arrayget(names, i * 2 + 1);
- error = pdf_resolve(&key, xref);
- if (error)
- {
- fz_dropobj(names);
- fz_dropobj(node);
- return fz_rethrow(error, "cannot resolve name tree key");
- }
-
error = fz_dictput(tree, key, val);
if (error)
- {
- fz_dropobj(key);
- fz_dropobj(names);
- fz_dropobj(node);
return fz_rethrow(error, "cannot insert name tree entry");
- }
fz_sortdict(tree);
-
- fz_dropobj(key);
}
-
- fz_dropobj(names);
}
kids = fz_dictgets(node, "Kids");
if (kids)
{
- error = pdf_resolve(&kids, xref);
- if (error)
- {
- fz_dropobj(node);
- return fz_rethrow(error, "cannot resolve /Kids");
- }
-
len = fz_arraylen(kids);
for (i = 0; i < len; ++i)
{
error = loadnametreenode(tree, xref, fz_arrayget(kids, i));
if (error)
- {
- fz_dropobj(kids);
- fz_dropobj(node);
return fz_rethrow(error, "cannot load name tree node");
- }
}
-
- fz_dropobj(kids);
}
- fz_dropobj(node);
return fz_okay;
}
@@ -120,9 +78,6 @@ pdf_loadnametrees(pdf_xref *xref)
dests = fz_dictgets(xref->root, "Dests");
if (dests)
{
- error = pdf_resolve(&dests, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Dests");
xref->dests = dests;
return fz_okay;
}
@@ -131,20 +86,13 @@ pdf_loadnametrees(pdf_xref *xref)
names = fz_dictgets(xref->root, "Names");
if (names)
{
- error = pdf_resolve(&names, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Names");
dests = fz_dictgets(names, "Dests");
if (dests)
{
error = pdf_loadnametree(&xref->dests, xref, dests);
if (error)
- {
- fz_dropobj(names);
return fz_rethrow(error, "cannot load name tree");
- }
}
- fz_dropobj(names);
}
return fz_okay;
diff --git a/mupdf/pdf_open.c b/mupdf/pdf_open.c
index b9bd883f..c5871597 100644
--- a/mupdf/pdf_open.c
+++ b/mupdf/pdf_open.c
@@ -143,7 +143,7 @@ readoldtrailer(pdf_xref *xref, char *buf, int cap)
if (tok != PDF_TODICT)
return fz_throw("expected trailer dictionary");
- error = pdf_parsedict(&xref->trailer, xref->file, buf, cap);
+ error = pdf_parsedict(&xref->trailer, xref, xref->file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse trailer");
return fz_okay;
@@ -156,7 +156,7 @@ readnewtrailer(pdf_xref *xref, char *buf, int cap)
pdf_logxref("load new xref format trailer\n");
- error = pdf_parseindobj(&xref->trailer, xref->file, buf, cap, nil, nil, nil);
+ error = pdf_parseindobj(&xref->trailer, xref, xref->file, buf, cap, nil, nil, nil);
if (error)
return fz_rethrow(error, "cannot parse trailer (compressed)");
return fz_okay;
@@ -297,7 +297,7 @@ readoldxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
if (tok != PDF_TODICT)
return fz_throw("expected trailer dictionary");
- error = pdf_parsedict(trailerp, xref->file, buf, cap);
+ error = pdf_parsedict(trailerp, xref, xref->file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse trailer");
return fz_okay;
@@ -363,7 +363,7 @@ readnewxref(fz_obj **trailerp, pdf_xref *xref, char *buf, int cap)
pdf_logxref("load new xref format\n");
- error = pdf_parseindobj(&trailer, xref->file, buf, cap, &oid, &gen, &stmofs);
+ error = pdf_parseindobj(&trailer, xref, xref->file, buf, cap, &oid, &gen, &stmofs);
if (error)
return fz_rethrow(error, "cannot parse compressed xref stream object");
@@ -606,7 +606,7 @@ pdf_loadobjstm(pdf_xref *xref, int oid, int gen, char *buf, int cap)
{
/* FIXME: seek to first + ofsbuf[i] */
- error = pdf_parsestmobj(&obj, stm, buf, cap);
+ error = pdf_parsestmobj(&obj, xref, stm, buf, cap);
if (error)
{
error = fz_rethrow(error, "cannot parse object %d in stream", i);
diff --git a/mupdf/pdf_outline.c b/mupdf/pdf_outline.c
index 9d848043..69ff8730 100644
--- a/mupdf/pdf_outline.c
+++ b/mupdf/pdf_outline.c
@@ -19,9 +19,6 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "Title");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Title");
error = pdf_toutf8(&node->title, obj);
if (error)
return fz_rethrow(error, "cannot convert Title to UTF-8");
@@ -38,11 +35,7 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "First");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /First");
error = loadoutline(&node->child, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load outline");
}
@@ -52,11 +45,7 @@ loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "Next");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Next");
error = loadoutline(&node->next, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load outline");
}
@@ -80,24 +69,13 @@ pdf_loadoutline(pdf_outline **nodep, pdf_xref *xref)
obj = fz_dictgets(xref->root, "Outlines");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Outlines");
-
first = fz_dictgets(obj, "First");
if (first)
{
- error = pdf_resolve(&first, xref);
- fz_dropobj(obj);
- if (error)
- return fz_rethrow(error, "cannot resolve /First");
error = loadoutline(&node, xref, first);
- fz_dropobj(first);
if (error)
return fz_rethrow(error, "cannot load outline");
}
- else
- fz_dropobj(obj);
}
pdf_logpage("}\n");
diff --git a/mupdf/pdf_page.c b/mupdf/pdf_page.c
index dd9d8b88..ac03d553 100644
--- a/mupdf/pdf_page.c
+++ b/mupdf/pdf_page.c
@@ -106,9 +106,7 @@ loadpagecontents(fz_tree **treep, pdf_xref *xref, fz_obj *rdb, fz_obj *ref)
if (fz_isindirect(ref))
{
- error = pdf_loadindirect(&obj, xref, ref);
- if (error)
- return fz_rethrow(error, "cannot load page contents (%d %d R)", fz_tonum(ref), fz_togen(ref));
+ obj = fz_resolveindirect(ref);
if (fz_isarray(obj))
{
@@ -120,8 +118,6 @@ loadpagecontents(fz_tree **treep, pdf_xref *xref, fz_obj *rdb, fz_obj *ref)
else
error = runone(csi, xref, rdb, ref);
- fz_dropobj(obj);
-
if (error)
{
pdf_dropcsi(csi);
@@ -175,12 +171,6 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "CropBox");
if (!obj)
obj = fz_dictgets(dict, "MediaBox");
- if (obj)
- {
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve page bounds");
- }
if (!fz_isarray(obj))
return fz_throw("cannot find page bounds");
bbox = pdf_torect(obj);
@@ -206,11 +196,7 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict)
obj = fz_dictgets(dict, "Annots");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve annotations");
error = pdf_loadannots(&comments, &links, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load annotations");
}
@@ -227,11 +213,7 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict)
if (error)
return fz_rethrow(error, "cannot create fake page resources");
}
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve page resources");
error = pdf_loadresources(&rdb, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load page resources");
@@ -243,18 +225,12 @@ pdf_loadpage(pdf_page **pagep, pdf_xref *xref, fz_obj *dict)
error = loadpagecontents(&tree, xref, rdb, obj);
if (error)
- {
- fz_dropobj(rdb);
return fz_rethrow(error, "cannot load page contents");
- }
pdf_logpage("optimize tree\n");
error = fz_optimizetree(tree);
if (error)
- {
- fz_dropobj(rdb);
return fz_rethrow(error, "cannot optimize page display tree");
- }
/*
* Create page object
diff --git a/mupdf/pdf_pagetree.c b/mupdf/pdf_pagetree.c
index 6fcf9ef9..a6aed675 100644
--- a/mupdf/pdf_pagetree.c
+++ b/mupdf/pdf_pagetree.c
@@ -46,7 +46,8 @@ loadpagetree(pdf_xref *xref, pdf_pagetree *pages,
if (strcmp(typestr, "Page") == 0)
{
- pdf_logpage("page %d (%d %d R)\n", *pagenum, ref->u.r.oid, ref->u.r.gid);
+ pdf_logpage("page %d (%d %d R)\n", *pagenum, fz_tonum(ref), fz_togen(ref));
+
(*pagenum)++;
if (inherit.resources && !fz_dictgets(obj, "Resources"))
@@ -109,39 +110,27 @@ loadpagetree(pdf_xref *xref, pdf_pagetree *pages,
if (inh) inherit.rotate = inh;
kids = fz_dictgets(obj, "Kids");
- if (kids)
- {
- error = pdf_resolve(&kids, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Kids");
- }
if (!fz_isarray(kids))
return fz_throw("page tree contains no pages");
- pdf_logpage("subtree %d pages (%d %d R) {\n",
- fz_arraylen(kids), ref->u.r.oid, ref->u.r.gid);
+ pdf_logpage("subtree %d pages (%d %d R) {\n", fz_arraylen(kids), fz_tonum(ref), fz_togen(ref));
for (i = 0; i < fz_arraylen(kids); i++)
{
kref = fz_arrayget(kids, i);
- error = pdf_loadindirect(&kobj, xref, kref);
- if (error) { fz_dropobj(kids); return fz_rethrow(error, "cannot load kid"); }
-
+ kobj = fz_resolveindirect(kref);
if (kobj == obj)
{
/* prevent infinite recursion possible in maliciously crafted PDFs */
- fz_dropobj(kids);
return fz_throw("corrupted pdf file");
}
error = loadpagetree(xref, pages, inherit, kobj, kref, pagenum);
- fz_dropobj(kobj);
- if (error) { fz_dropobj(kids); return fz_rethrow(error, "cannot load pagesubtree (%d %d R)", fz_tonum(kref), fz_togen(kref)); }
+ if (error)
+ return fz_rethrow(error, "cannot load pagesubtree (%d %d R)", fz_tonum(kref), fz_togen(kref));
}
- fz_dropobj(kids);
-
pdf_logpage("}\n");
}
@@ -183,12 +172,10 @@ pdf_loadpagetree(pdf_pagetree **pp, pdf_xref *xref)
trailer = xref->trailer;
ref = fz_dictgets(trailer, "Root");
- error = pdf_loadindirect(&catalog, xref, ref);
- if (error) { error = fz_rethrow(error, "cannot load Root object"); goto cleanup; }
+ catalog = fz_resolveindirect(ref);
treeref = fz_dictgets(catalog, "Pages");
- error = pdf_loadindirect(&pages, xref, treeref);
- if (error) { error = fz_rethrow(error, "cannot load Pages object"); goto cleanup; }
+ pages = fz_resolveindirect(treeref);
ref = fz_dictgets(pages, "Count");
count = fz_toint(ref);
@@ -196,7 +183,7 @@ pdf_loadpagetree(pdf_pagetree **pp, pdf_xref *xref)
p = fz_malloc(sizeof(pdf_pagetree));
if (!p) { error = fz_rethrow(-1, "out of memory: page tree struct"); goto cleanup; }
- pdf_logpage("load pagetree %d pages (%d %d R) ptr=%p {\n", count, treeref->u.r.oid, treeref->u.r.gid, p);
+ pdf_logpage("load pagetree %d pages (%d %d R) ptr=%p {\n", count, fz_tonum(treeref), fz_togen(treeref), p);
p->pref = nil;
p->pobj = nil;
diff --git a/mupdf/pdf_parse.c b/mupdf/pdf_parse.c
index 9ae916e8..016a638d 100644
--- a/mupdf/pdf_parse.c
+++ b/mupdf/pdf_parse.c
@@ -107,7 +107,7 @@ pdf_toucs2(unsigned short **dstp, fz_obj *src)
}
fz_error
-pdf_parsearray(fz_obj **op, fz_stream *file, char *buf, int cap)
+pdf_parsearray(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error = fz_okay;
fz_obj *ary = nil;
@@ -182,19 +182,21 @@ pdf_parsearray(fz_obj **op, fz_stream *file, char *buf, int cap)
case PDF_TR:
if (n != 2)
goto cleanup;
- error = fz_newindirect(&obj, a, b);
- if (error) goto cleanup;
+ error = fz_newindirect(&obj, a, b, xref);
+ if (error)
+ goto cleanup;
n = 0;
break;
- case PDF_TOARRAY: error = pdf_parsearray(&obj, file, buf, cap); break;
- case PDF_TODICT: error = pdf_parsedict(&obj, file, buf, cap); break;
- case PDF_TNAME: error = fz_newname(&obj, buf); break;
- case PDF_TREAL: error = fz_newreal(&obj, atof(buf)); break;
- case PDF_TSTRING: error = fz_newstring(&obj, buf, len); break;
- case PDF_TTRUE: error = fz_newbool(&obj, 1); break;
- case PDF_TFALSE: error = fz_newbool(&obj, 0); break;
- case PDF_TNULL: error = fz_newnull(&obj); break;
- default: goto cleanup;
+
+ case PDF_TOARRAY: error = pdf_parsearray(&obj, xref, file, buf, cap); break;
+ case PDF_TODICT: error = pdf_parsedict(&obj, xref, file, buf, cap); break;
+ case PDF_TNAME: error = fz_newname(&obj, buf); break;
+ case PDF_TREAL: error = fz_newreal(&obj, atof(buf)); break;
+ case PDF_TSTRING: error = fz_newstring(&obj, buf, len); break;
+ case PDF_TTRUE: error = fz_newbool(&obj, 1); break;
+ case PDF_TFALSE: error = fz_newbool(&obj, 0); break;
+ case PDF_TNULL: error = fz_newnull(&obj); break;
+ default: goto cleanup;
}
if (error)
goto cleanup;
@@ -218,7 +220,7 @@ cleanup:
}
fz_error
-pdf_parsedict(fz_obj **op, fz_stream *file, char *buf, int cap)
+pdf_parsedict(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error = fz_okay;
fz_obj *dict = nil;
@@ -268,25 +270,29 @@ skip:
switch (tok)
{
- case PDF_TOARRAY: error = pdf_parsearray(&val, file, buf, cap); break;
- case PDF_TODICT: error = pdf_parsedict(&val, file, buf, cap); break;
- case PDF_TNAME: error = fz_newname(&val, buf); break;
- case PDF_TREAL: error = fz_newreal(&val, atof(buf)); break;
- case PDF_TSTRING: error = fz_newstring(&val, buf, len); break;
- case PDF_TTRUE: error = fz_newbool(&val, 1); break;
- case PDF_TFALSE: error = fz_newbool(&val, 0); break;
- case PDF_TNULL: error = fz_newnull(&val); break;
+ case PDF_TOARRAY: error = pdf_parsearray(&val, xref, file, buf, cap); break;
+ case PDF_TODICT: error = pdf_parsedict(&val, xref, file, buf, cap); break;
+ case PDF_TNAME: error = fz_newname(&val, buf); break;
+ case PDF_TREAL: error = fz_newreal(&val, atof(buf)); break;
+ case PDF_TSTRING: error = fz_newstring(&val, buf, len); break;
+ case PDF_TTRUE: error = fz_newbool(&val, 1); break;
+ case PDF_TFALSE: error = fz_newbool(&val, 0); break;
+ case PDF_TNULL: error = fz_newnull(&val); break;
+
case PDF_TINT:
a = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
- if (error) goto cleanup;
+ if (error)
+ goto cleanup;
if (tok == PDF_TCDICT || tok == PDF_TNAME ||
(tok == PDF_TKEYWORD && !strcmp(buf, "ID")))
{
error = fz_newint(&val, a);
- if (error) goto cleanup;
+ if (error)
+ goto cleanup;
error = fz_dictput(dict, key, val);
- if (error) goto cleanup;
+ if (error)
+ goto cleanup;
fz_dropobj(val);
fz_dropobj(key);
key = val = nil;
@@ -296,15 +302,17 @@ skip:
{
b = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
- if (error) goto cleanup;
+ if (error)
+ goto cleanup;
if (tok == PDF_TR)
{
- error = fz_newindirect(&val, a, b);
+ error = fz_newindirect(&val, a, b, xref);
break;
}
}
error = fz_throw("invalid indirect reference in dict");
goto cleanup;
+
default:
error = fz_throw("unknown token in dict");
goto cleanup;
@@ -331,7 +339,7 @@ cleanup:
}
fz_error
-pdf_parsestmobj(fz_obj **op, fz_stream *file, char *buf, int cap)
+pdf_parsestmobj(fz_obj **op, pdf_xref *xref, fz_stream *file, char *buf, int cap)
{
fz_error error;
pdf_token_e tok;
@@ -343,15 +351,15 @@ pdf_parsestmobj(fz_obj **op, fz_stream *file, char *buf, int cap)
switch (tok)
{
- case PDF_TOARRAY: error = pdf_parsearray(op, file, buf, cap); break;
- case PDF_TODICT: error = pdf_parsedict(op, file, buf, cap); break;
- case PDF_TNAME: error = fz_newname(op, buf); break;
- case PDF_TREAL: error = fz_newreal(op, atof(buf)); break;
- case PDF_TSTRING: error = fz_newstring(op, buf, len); break;
- case PDF_TTRUE: error = fz_newbool(op, 1); break;
- case PDF_TFALSE: error = fz_newbool(op, 0); break;
- case PDF_TNULL: error = fz_newnull(op); break;
- case PDF_TINT: error = fz_newint(op, atoi(buf)); break;
+ case PDF_TOARRAY: error = pdf_parsearray(op, xref, file, buf, cap); break;
+ case PDF_TODICT: error = pdf_parsedict(op, xref, file, buf, cap); break;
+ case PDF_TNAME: error = fz_newname(op, buf); break;
+ case PDF_TREAL: error = fz_newreal(op, atof(buf)); break;
+ case PDF_TSTRING: error = fz_newstring(op, buf, len); break;
+ case PDF_TTRUE: error = fz_newbool(op, 1); break;
+ case PDF_TFALSE: error = fz_newbool(op, 0); break;
+ case PDF_TNULL: error = fz_newnull(op); break;
+ case PDF_TINT: error = fz_newint(op, atoi(buf)); break;
default: return fz_throw("unknown token in object stream");
}
@@ -361,12 +369,13 @@ pdf_parsestmobj(fz_obj **op, fz_stream *file, char *buf, int cap)
}
fz_error
-pdf_parseindobj(fz_obj **op, fz_stream *file, char *buf, int cap,
- int *ooid, int *ogid, int *ostmofs)
+pdf_parseindobj(fz_obj **op, pdf_xref *xref,
+ fz_stream *file, char *buf, int cap,
+ int *onum, int *ogen, int *ostmofs)
{
fz_error error = fz_okay;
fz_obj *obj = nil;
- int oid = 0, gid = 0, stmofs;
+ int num = 0, gen = 0, stmofs;
pdf_token_e tok;
int len;
int a, b;
@@ -374,12 +383,12 @@ pdf_parseindobj(fz_obj **op, fz_stream *file, char *buf, int cap,
error = pdf_lex(&tok, file, buf, cap, &len);
if (error || tok != PDF_TINT)
goto cleanup;
- oid = atoi(buf);
+ num = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error || tok != PDF_TINT)
goto cleanup;
- gid = atoi(buf);
+ gen = atoi(buf);
error = pdf_lex(&tok, file, buf, cap, &len);
if (error || tok != PDF_TOBJ)
@@ -391,30 +400,14 @@ pdf_parseindobj(fz_obj **op, fz_stream *file, char *buf, int cap,
switch (tok)
{
- case PDF_TOARRAY:
- error = pdf_parsearray(&obj, file, buf, cap);
- break;
- case PDF_TODICT:
- error = pdf_parsedict(&obj, file, buf, cap);
- break;
- case PDF_TNAME:
- error = fz_newname(&obj, buf);
- break;
- case PDF_TREAL:
- error = fz_newreal(&obj, atof(buf));
- break;
- case PDF_TSTRING:
- error = fz_newstring(&obj, buf, len);
- break;
- case PDF_TTRUE:
- error = fz_newbool(&obj, 1);
- break;
- case PDF_TFALSE:
- error = fz_newbool(&obj, 0);
- break;
- case PDF_TNULL:
- error = fz_newnull(&obj);
- break;
+ case PDF_TOARRAY: error = pdf_parsearray(&obj, xref, file, buf, cap); break;
+ case PDF_TODICT: error = pdf_parsedict(&obj, xref, file, buf, cap); break;
+ case PDF_TNAME: error = fz_newname(&obj, buf); break;
+ case PDF_TREAL: error = fz_newreal(&obj, atof(buf)); break;
+ case PDF_TSTRING: error = fz_newstring(&obj, buf, len); break;
+ case PDF_TTRUE: error = fz_newbool(&obj, 1); break;
+ case PDF_TFALSE: error = fz_newbool(&obj, 0); break;
+ case PDF_TNULL: error = fz_newnull(&obj); break;
case PDF_TINT:
a = atoi(buf);
@@ -436,7 +429,7 @@ pdf_parseindobj(fz_obj **op, fz_stream *file, char *buf, int cap,
goto cleanup;
if (tok == PDF_TR)
{
- error = fz_newindirect(&obj, a, b);
+ error = fz_newindirect(&obj, a, b, xref);
break;
}
}
@@ -464,7 +457,7 @@ skip:
{
c = fz_peekbyte(file);
if (c != '\n')
- fz_warn("line feed missing after stream begin marker (%d %d R)", oid, gid);
+ fz_warn("line feed missing after stream begin marker (%d %d R)", num, gen);
else
c = fz_readbyte(file);
}
@@ -479,12 +472,12 @@ skip:
}
else
{
- fz_warn("expected endobj or stream keyword (%d %d R)", oid, gid);
+ fz_warn("expected endobj or stream keyword (%d %d R)", num, gen);
stmofs = 0;
}
- if (ooid) *ooid = oid;
- if (ogid) *ogid = gid;
+ if (onum) *onum = num;
+ if (ogen) *ogen = gen;
if (ostmofs) *ostmofs = stmofs;
*op = obj;
return fz_okay;
@@ -493,7 +486,7 @@ cleanup:
if (obj)
fz_dropobj(obj);
if (error)
- return fz_rethrow(error, "cannot parse indirect object (%d %d R)", oid, gid);
- return fz_throw("cannot parse indirect object (%d %d R)", oid, gid);
+ return fz_rethrow(error, "cannot parse indirect object (%d %d R)", num, gen);
+ return fz_throw("cannot parse indirect object (%d %d R)", num, gen);
}
diff --git a/mupdf/pdf_pattern.c b/mupdf/pdf_pattern.c
index b105144c..1c1491b6 100644
--- a/mupdf/pdf_pattern.c
+++ b/mupdf/pdf_pattern.c
@@ -87,17 +87,7 @@ pdf_loadpattern(pdf_pattern **patp, pdf_xref *xref, fz_obj *dict, fz_obj *stmref
goto cleanup;
}
- error = pdf_resolve(&obj, xref);
- if (error)
- {
- error = fz_rethrow(error, "cannot resolve resource dictionary");
- goto cleanup;
- }
-
error = pdf_loadresources(&resources, xref, obj);
-
- fz_dropobj(obj);
-
if (error)
{
error = fz_rethrow(error, "cannot load resources");
diff --git a/mupdf/pdf_repair.c b/mupdf/pdf_repair.c
index e9740c4e..061ee3b1 100644
--- a/mupdf/pdf_repair.c
+++ b/mupdf/pdf_repair.c
@@ -14,9 +14,8 @@ struct entry
int stmlen;
};
-static fz_error
-parseobj(fz_stream *file, char *buf, int cap, int *stmofs, int *stmlen,
- int *isroot, int *isinfo)
+static fz_error parseobj(fz_stream *file, char *buf, int cap,
+ int *stmofs, int *stmlen, int *isroot, int *isinfo)
{
fz_error error;
fz_obj *dict = nil;
@@ -34,7 +33,7 @@ parseobj(fz_stream *file, char *buf, int cap, int *stmofs, int *stmlen,
error = pdf_lex(&tok, file, buf, cap, &len);
if (tok == PDF_TODICT)
{
- error = pdf_parsedict(&dict, file, buf, cap);
+ error = pdf_parsedict(&dict, nil, file, buf, cap);
if (error)
return fz_rethrow(error, "cannot parse object");
}
@@ -260,7 +259,7 @@ pdf_repairxref(pdf_xref *xref, char *filename)
goto cleanup;
}
- error = fz_packobj(&xref->trailer,
+ error = fz_packobj(&xref->trailer, xref,
"<< /Size %i /Root %r >>",
maxoid + 1, rootoid, rootgen);
if (error)
@@ -269,6 +268,8 @@ pdf_repairxref(pdf_xref *xref, char *filename)
goto cleanup;
}
+ printf("repair maxnum = %d\n", maxoid);
+
xref->len = maxoid + 1;
xref->cap = xref->len;
xref->table = fz_malloc(xref->cap * sizeof(pdf_xrefentry));
diff --git a/mupdf/pdf_resources.c b/mupdf/pdf_resources.c
index af3a0efd..75109490 100644
--- a/mupdf/pdf_resources.c
+++ b/mupdf/pdf_resources.c
@@ -55,11 +55,7 @@ preloadcolorspace(pdf_xref *xref, fz_obj *ref)
if (pdf_finditem(xref->store, PDF_KCOLORSPACE, ref))
return fz_okay;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve colorspace resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
error = pdf_loadcolorspace(&colorspace, xref, obj);
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load colorspace resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
@@ -82,17 +78,12 @@ preloadpattern(pdf_xref *xref, fz_obj *ref)
fz_obj *type;
fz_obj *obj = ref;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve pattern/shade resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
-
type = fz_dictgets(obj, "PatternType");
if (fz_toint(type) == 1)
{
error = pdf_loadpattern(&pattern, xref, obj, ref);
pdf_droppattern(pattern); /* we did this just to fill the store, no need to hold on to it */
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load pattern resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
return fz_okay;
@@ -102,7 +93,6 @@ preloadpattern(pdf_xref *xref, fz_obj *ref)
{
error = pdf_loadshade(&shade, xref, obj, ref);
fz_dropshade(shade); /* we did this just to fill the store, no need to hold on to it */
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load shade resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
return fz_okay;
@@ -110,7 +100,6 @@ preloadpattern(pdf_xref *xref, fz_obj *ref)
else
{
- fz_dropobj(obj);
return fz_throw("unknown pattern resource type");
}
}
@@ -120,15 +109,11 @@ preloadshading(pdf_xref *xref, fz_obj *ref)
{
fz_error error;
fz_shade *shade;
+ fz_obj *obj;
- fz_obj *obj = ref;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve shade resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
-
+ obj = fz_resolveindirect(ref);
error = pdf_loadshade(&shade, xref, obj, ref);
fz_dropshade(shade); /* we did this just to fill the store, no need to hold on to it */
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load shade resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
return fz_okay;
@@ -140,12 +125,10 @@ preloadxobject(pdf_xref *xref, fz_obj *ref)
fz_error error;
pdf_xobject *xobject;
pdf_image *image;
- fz_obj *obj = ref;
+ fz_obj *obj;
fz_obj *subtype;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve xobject/image resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
+ obj = fz_resolveindirect(ref);
subtype = fz_dictgets(obj, "Subtype");
@@ -153,7 +136,6 @@ preloadxobject(pdf_xref *xref, fz_obj *ref)
{
error = pdf_loadxobject(&xobject, xref, obj, ref);
pdf_dropxobject(xobject); /* we did this just to fill the store, no need to hold on to it */
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load xobject resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
return fz_okay;
@@ -163,7 +145,6 @@ preloadxobject(pdf_xref *xref, fz_obj *ref)
{
error = pdf_loadimage(&image, xref, obj, ref);
fz_dropimage((fz_image*)image); /* we did this just to fill the store, no need to hold on to it */
- fz_dropobj(obj);
if (error)
return fz_rethrow(error, "cannot load image resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
return fz_okay;
@@ -171,7 +152,6 @@ preloadxobject(pdf_xref *xref, fz_obj *ref)
else
{
- fz_dropobj(obj);
return fz_throw("unknown type '%s' for xobject resource (%d %d R)", fz_toname(subtype), fz_tonum(ref), fz_togen(ref));
}
}
@@ -181,10 +161,10 @@ preloadfont(pdf_xref *xref, fz_obj *ref)
{
fz_error error;
pdf_fontdesc *font;
- fz_obj *obj = ref;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve font resource (%d %d R)", fz_tonum(ref), fz_togen(ref));
+ fz_obj *obj;
+
+ obj = fz_resolveindirect(ref);
+
error = pdf_loadfont(&font, xref, obj, ref);
pdf_dropfont(font); /* we did this just to fill the store, no need to hold on to it */
if (error)
@@ -196,11 +176,10 @@ static fz_error
preloadmask(pdf_xref *xref, fz_obj *ref)
{
fz_error error;
- fz_obj *obj = ref;
+ fz_obj *obj;
fz_obj *grp;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve mask dictionary (%d %d R)", fz_tonum(ref), fz_togen(ref));
+
+ obj = fz_resolveindirect(ref);
if (fz_isdict(obj))
{
@@ -282,31 +261,13 @@ copyresolved(fz_obj **outp, pdf_xref *xref, fz_obj *dict)
{
key = fz_dictgetkey(dict, i);
val = fz_dictgetval(dict, i);
+ obj = fz_resolveindirect(val);
- if (fz_isindirect(val))
- {
- error = pdf_loadindirect(&obj, xref, val);
- if (error)
- {
- fz_dropobj(copy);
- return fz_rethrow(error, "cannot load object");
- }
- error = fz_dictput(copy, key, obj);
- fz_dropobj(obj);
- if (error)
- {
- fz_dropobj(copy);
- return fz_rethrow(error, "cannot save object");
- }
- }
- else
+ error = fz_dictput(copy, key, obj);
+ if (error)
{
- error = fz_dictput(copy, key, val);
- if (error)
- {
- fz_dropobj(copy);
- return fz_rethrow(error, "cannot copy object");
- }
+ fz_dropobj(copy);
+ return fz_rethrow(error, "cannot copy object");
}
}
@@ -339,7 +300,7 @@ pdf_loadresources(fz_obj **rdbp, pdf_xref *xref, fz_obj *orig)
pdf_logrsrc("load resources {\n");
/*
- * Resolve indirect objects
+ * Resolve indirect objects // XXX is this still necessary?
*/
error = copyresolved(&copy, xref, orig);
diff --git a/mupdf/pdf_shade.c b/mupdf/pdf_shade.c
index b52c84da..4fbc3143 100644
--- a/mupdf/pdf_shade.c
+++ b/mupdf/pdf_shade.c
@@ -111,10 +111,7 @@ pdf_loadshadefunction(fz_shade *shade, pdf_xref *xref, fz_obj *shading, float t0
if (!ref)
return fz_throw("shading function not found");
- obj = ref;
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "couldn't resolve shading function");
+ obj = fz_resolveindirect(ref);
shade->usefunction = 1;
@@ -128,8 +125,6 @@ pdf_loadshadefunction(fz_shade *shade, pdf_xref *xref, fz_obj *shading, float t0
else
error = fz_throw("invalid shading function");
- fz_dropobj(obj);
-
if (error)
return fz_rethrow(error, "couldn't load shading function");
@@ -184,13 +179,9 @@ loadshadedict(fz_shade **shadep, pdf_xref *xref, fz_obj *dict, fz_obj *ref, fz_m
fz_keepcolorspace(shade->cs);
else
{
- error = pdf_resolve(&obj, xref);
- if (error)
- return fz_rethrow(error, "couldn't resolve colorspace");
error = pdf_loadcolorspace(&shade->cs, xref, obj);
if (error)
return fz_rethrow(error, "could not load colorspace");
- fz_dropobj(obj);
}
}
@@ -304,12 +295,8 @@ pdf_loadshade(fz_shade **shadep, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
if (!obj)
return fz_throw("syntaxerror: missing shading dictionary");
- shd = obj;
- error = pdf_resolve(&shd, xref);
- if (error)
- return fz_rethrow(error, "could not resolve shading dictionary");
+ shd = fz_resolveindirect(obj);
error = loadshadedict(shadep, xref, shd, obj, mat);
- fz_dropobj(shd);
if (error)
return fz_rethrow(error, "could not load shading dictionary");
diff --git a/mupdf/pdf_stream.c b/mupdf/pdf_stream.c
index c87ca30b..afb44ec5 100644
--- a/mupdf/pdf_stream.c
+++ b/mupdf/pdf_stream.c
@@ -220,16 +220,9 @@ buildrawfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, int
int len;
stmlen = fz_dictgets(stmobj, "Length");
- if (stmlen)
- {
- error = pdf_resolve(&stmlen, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve stream /Length");
- }
if (!fz_isint(stmlen))
return fz_throw("corrupt stream length");
len = fz_toint(stmlen);
- fz_dropobj(stmlen);
error = fz_newnullfilter(&base, len);
if (error)
@@ -313,56 +306,37 @@ pdf_buildfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, in
if (filters)
{
- error = pdf_resolve(&filters, xref);
- if (error)
- {
- error = fz_rethrow(error, "cannot resolve stream /Filter");
- goto cleanup0;
- }
-
- if (params)
- {
- error = pdf_resolve(&params, xref);
- if (error)
- {
- error = fz_rethrow(error, "cannot resolve stream /DecodeParms");
- goto cleanup1;
- }
- }
-
if (fz_isname(filters))
{
error = buildonefilter(&tmp, xref, filters, params);
if (error)
{
- error = fz_rethrow(error, "cannot create filter");
- goto cleanup2;
+ fz_dropfilter(base);
+ return fz_rethrow(error, "cannot create filter");
}
error = fz_newpipeline(&pipe, base, tmp);
- fz_dropfilter(base);
- fz_dropfilter(tmp);
if (error)
{
- error = fz_rethrow(error, "cannot create filter pipeline");
- goto cleanup2;
+ fz_dropfilter(base);
+ fz_dropfilter(tmp);
+ return fz_rethrow(error, "cannot create filter pipeline");
}
+
+ fz_dropfilter(base);
+ fz_dropfilter(tmp);
}
else
{
error = buildfilterchain(&pipe, xref, base, filters, params);
if (error)
{
- error = fz_rethrow(error, "cannot create filter chain");
- goto cleanup2;
+ fz_dropfilter(base);
+ return fz_rethrow(error, "cannot create filter chain");
}
+ fz_dropfilter(base);
}
- if (params)
- fz_dropobj(params);
-
- fz_dropobj(filters);
-
*filterp = pipe;
}
else
@@ -371,15 +345,6 @@ pdf_buildfilter(fz_filter **filterp, pdf_xref *xref, fz_obj *stmobj, int oid, in
}
return fz_okay;
-
-cleanup2:
- if (params)
- fz_dropobj(params);
-cleanup1:
- fz_dropobj(filters);
-cleanup0:
- fz_dropfilter(base);
- return error; /* already rethrown */
}
/*
diff --git a/mupdf/pdf_type3.c b/mupdf/pdf_type3.c
index a18066a7..1416a0d9 100644
--- a/mupdf/pdf_type3.c
+++ b/mupdf/pdf_type3.c
@@ -103,15 +103,12 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
estrings[i] = nil;
encoding = fz_dictgets(dict, "Encoding");
- if (!encoding) {
+ if (!encoding)
+ {
error = fz_throw("syntaxerror: Type3 font missing Encoding");
goto cleanup;
}
- error = pdf_resolve(&encoding, xref);
- if (error)
- goto cleanup;
-
if (fz_isname(obj))
pdf_loadencoding(estrings, fz_toname(encoding));
@@ -141,8 +138,6 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
}
}
- fz_dropobj(encoding);
-
error = pdf_newidentitycmap(&fontdesc->encoding, 0, 1);
if (error)
goto cleanup;
@@ -162,15 +157,12 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
last = fz_toint(fz_dictgets(dict, "LastChar"));
widths = fz_dictgets(dict, "Widths");
- if (!widths) {
+ if (!widths)
+ {
error = fz_throw("syntaxerror: Type3 font missing Widths");
goto cleanup;
}
- error = pdf_resolve(&widths, xref);
- if (error)
- goto cleanup;
-
for (i = first; i <= last; i++)
{
float w = fz_toreal(fz_arrayget(widths, i - first));
@@ -178,14 +170,10 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
fontdesc->font->t3widths[i] = w * 0.001;
error = pdf_addhmtx(fontdesc, i, i, w);
- if (error) {
- fz_dropobj(widths);
+ if (error)
goto cleanup;
- }
}
- fz_dropobj(widths);
-
error = pdf_endhmtx(fontdesc);
if (error)
goto cleanup;
@@ -199,14 +187,7 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
obj = fz_dictgets(dict, "Resources");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- goto cleanup;
-
error = pdf_loadresources(&resources, xref, obj);
-
- fz_dropobj(obj);
-
if (error)
goto cleanup;
}
@@ -221,13 +202,9 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
if (!charprocs)
{
error = fz_throw("syntaxerror: Type3 font missing CharProcs");
- goto cleanup2;
+ goto cleanup;
}
- error = pdf_resolve(&charprocs, xref);
- if (error)
- goto cleanup2;
-
for (i = 0; i < 256; i++)
{
if (estrings[i])
@@ -238,29 +215,22 @@ pdf_loadtype3font(pdf_fontdesc **fontdescp, pdf_xref *xref, fz_obj *dict, fz_obj
pdf_logfont("load charproc %s {\n", estrings[i]);
error = loadcharproc(&fontdesc->font->t3procs[i], xref, resources, obj);
if (error)
- goto cleanup2;
+ goto cleanup;
error = fz_optimizetree(fontdesc->font->t3procs[i]);
if (error)
- goto cleanup2;
+ goto cleanup;
pdf_logfont("}\n");
}
}
}
- fz_dropobj(charprocs);
- if (resources)
- fz_dropobj(resources);
-
pdf_logfont("}\n");
*fontdescp = fontdesc;
return fz_okay;
-cleanup2:
- if (resources)
- fz_dropobj(resources);
cleanup:
fz_dropfont(fontdesc->font);
fz_free(fontdesc);
diff --git a/mupdf/pdf_xobject.c b/mupdf/pdf_xobject.c
index 7c425fc0..20d3251e 100644
--- a/mupdf/pdf_xobject.c
+++ b/mupdf/pdf_xobject.c
@@ -60,26 +60,12 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
{
fz_obj *attrs = obj;
- error = pdf_resolve(&attrs, xref);
- if (error)
- {
- fz_dropobj(attrs);
- error = fz_rethrow(error, "cannot resolve xobject group attributes");
- goto cleanup;
- }
-
- obj = fz_dictgets(attrs, "I");
- form->isolated = fz_tobool(obj);
- obj = fz_dictgets(attrs, "K");
- form->knockout = fz_tobool(obj);
+ form->isolated = fz_tobool(fz_dictgets(attrs, "I"));
+ form->knockout = fz_tobool(fz_dictgets(attrs, "K"));
obj = fz_dictgets(attrs, "S");
- if (!strcmp(fz_toname(obj), "Transparency"))
- {
+ if (fz_isname(obj) && !strcmp(fz_toname(obj), "Transparency"))
form->transparency = 1;
- }
-
- fz_dropobj(attrs);
}
pdf_logrsrc("isolated %d\n", form->isolated);
@@ -89,15 +75,7 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
obj = fz_dictgets(dict, "Resources");
if (obj)
{
- error = pdf_resolve(&obj, xref);
- if (error)
- {
- fz_dropobj(obj);
- error = fz_rethrow(error, "cannot resolve xobject resources");
- goto cleanup;
- }
error = pdf_loadresources(&form->resources, xref, obj);
- fz_dropobj(obj);
if (error)
{
error = fz_rethrow(error, "cannot load xobject resources");
@@ -118,6 +96,7 @@ pdf_loadxobject(pdf_xobject **formp, pdf_xref *xref, fz_obj *dict, fz_obj *ref)
*formp = form;
return fz_okay;
+
cleanup:
pdf_removeitem(xref->store, PDF_KXOBJECT, ref);
pdf_dropxobject(form);
diff --git a/mupdf/pdf_xref.c b/mupdf/pdf_xref.c
index d27ccfea..52b2b2d5 100644
--- a/mupdf/pdf_xref.c
+++ b/mupdf/pdf_xref.c
@@ -150,26 +150,10 @@ pdf_decryptxref(pdf_xref *xref)
if (encrypt && id)
{
- error = pdf_resolve(&encrypt, xref);
- if (error)
- return fz_rethrow(error, "cannot resolve /Encrypt object");
-
if (fz_isnull(encrypt))
- {
- fz_dropobj(encrypt);
return fz_okay;
- }
-
- error = pdf_resolve(&id, xref);
- if (error)
- {
- fz_dropobj(encrypt);
- return fz_rethrow(error, "cannot resolve /ID object");
- }
error = pdf_newdecrypt(&xref->crypt, encrypt, id);
- fz_dropobj(encrypt);
- fz_dropobj(id);
if (error)
return fz_rethrow(error, "cannot create decrypter");
}
@@ -191,7 +175,7 @@ pdf_cacheobject(pdf_xref *xref, int oid, int gen)
int roid, rgen;
if (oid < 0 || oid >= xref->len)
- return fz_throw("object out of range (%d %d R)", oid, gen);
+ return fz_throw("object out of range (%d %d R); xref size %d", oid, gen, xref->len);
x = &xref->table[oid];
@@ -212,7 +196,7 @@ pdf_cacheobject(pdf_xref *xref, int oid, int gen)
if (error)
return fz_rethrow(error, "cannot seek to object (%d %d R) offset %d", oid, gen, x->ofs);
- error = pdf_parseindobj(&x->obj, xref->file, buf, sizeof buf, &roid, &rgen, &x->stmofs);
+ error = pdf_parseindobj(&x->obj, xref, xref->file, buf, sizeof buf, &roid, &rgen, &x->stmofs);
if (error)
return fz_rethrow(error, "cannot parse object (%d %d R)", oid, gen);
@@ -250,35 +234,3 @@ pdf_loadobject(fz_obj **objp, pdf_xref *xref, int oid, int gen)
return fz_okay;
}
-fz_error
-pdf_loadindirect(fz_obj **objp, pdf_xref *xref, fz_obj *ref)
-{
- fz_error error;
-
- if (ref == nil)
- return fz_throw("assert: dereference null indirect reference");
-
- error = pdf_loadobject(objp, xref, fz_tonum(ref), fz_togen(ref));
- if (error)
- return fz_rethrow(error, "cannot load indirect object (%d %d R)", fz_tonum(ref), fz_togen(ref));
-
- return fz_okay;
-}
-
-fz_error
-pdf_resolve(fz_obj **objp, pdf_xref *xref)
-{
- fz_error error;
-
- if (fz_isindirect(*objp))
- {
- error = pdf_loadindirect(objp, xref, *objp);
- if (error)
- return fz_rethrow(error, "cannot load indirect object (%d %d R)", fz_tonum(*objp), fz_togen(*objp));
- return fz_okay;
- }
-
- fz_keepobj(*objp);
- return fz_okay;
-}
-