diff options
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(©, 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(¶ms, 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; -} - |