diff options
Diffstat (limited to 'poppler/PSOutputDev.cc')
-rw-r--r-- | poppler/PSOutputDev.cc | 406 |
1 files changed, 141 insertions, 265 deletions
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index c7a6057d..29499158 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -15,7 +15,7 @@ // // Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org> // Copyright (C) 2005, 2006 Kristian Høgsberg <krh@redhat.com> -// Copyright (C) 2006-2009, 2011-2013, 2015, 2016 Albert Astals Cid <aacid@kde.org> +// Copyright (C) 2006-2009, 2011-2013, 2015-2017 Albert Astals Cid <aacid@kde.org> // Copyright (C) 2006 Jeff Muizelaar <jeff@infidigm.net> // Copyright (C) 2007, 2008 Brad Hards <bradh@kde.org> // Copyright (C) 2008, 2009 Koji Otani <sho@bbr.jp> @@ -1533,7 +1533,6 @@ PSOutputDev::~PSOutputDev() { void PSOutputDev::writeHeader(const std::vector<int> &pages, PDFRectangle *mediaBox, PDFRectangle *cropBox, int pageRotate, char *psTitle) { - Object info, obj1; PSOutPaperSize *size; double x1, y1, x2, y2; int i; @@ -1550,13 +1549,14 @@ void PSOutputDev::writeHeader(const std::vector<int> &pages, break; } writePSFmt("%Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION); - xref->getDocInfo(&info); - if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) { - writePS("%%Creator: "); - writePSTextLine(obj1.getString()); + Object info = xref->getDocInfo(); + if (info.isDict()) { + Object obj1 = info.dictLookup("Creator"); + if (obj1.isString()) { + writePS("%%Creator: "); + writePSTextLine(obj1.getString()); + } } - obj1.free(); - info.free(); if(psTitle) { char *sanitizedTitle = strdup(psTitle); for (Guint i = 0; i < strlen(sanitizedTitle); ++i) { @@ -1677,9 +1677,7 @@ void PSOutputDev::writeDocSetup(PDFDoc *doc, Catalog *catalog, Dict *resDict; Annots *annots; Object *acroForm; - Object obj1, obj2, obj3; GooString *s; - int i; if (mode == psModeForm) { // swap the form and xpdf dicts @@ -1698,30 +1696,30 @@ void PSOutputDev::writeDocSetup(PDFDoc *doc, Catalog *catalog, setupResources(resDict); } annots = page->getAnnots(); - for (i = 0; i < annots->getNumAnnots(); ++i) { - if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { + for (int i = 0; i < annots->getNumAnnots(); ++i) { + Object obj1 = annots->getAnnot(i)->getAppearanceResDict(); + if (obj1.isDict()) { setupResources(obj1.getDict()); } - obj1.free(); } } if ((acroForm = catalog->getAcroForm()) && acroForm->isDict()) { - if (acroForm->dictLookup("DR", &obj1)->isDict()) { + Object obj1 = acroForm->dictLookup("DR"); + if (obj1.isDict()) { setupResources(obj1.getDict()); } - obj1.free(); - if (acroForm->dictLookup("Fields", &obj1)->isArray()) { - for (i = 0; i < obj1.arrayGetLength(); ++i) { - if (obj1.arrayGet(i, &obj2)->isDict()) { - if (obj2.dictLookup("DR", &obj3)->isDict()) { + obj1 = acroForm->dictLookup("Fields"); + if (obj1.isArray()) { + for (int i = 0; i < obj1.arrayGetLength(); ++i) { + Object obj2 = obj1.arrayGet(i); + if (obj2.isDict()) { + Object obj3 = obj2.dictLookup("DR"); + if (obj3.isDict()) { setupResources(obj3.getDict()); } - obj3.free(); } - obj2.free(); } } - obj1.free(); } if (mode != psModeForm) { if (mode != psModeEPS && !manualCtrl) { @@ -1795,24 +1793,22 @@ void PSOutputDev::writeTrailer() { } void PSOutputDev::setupResources(Dict *resDict) { - Object xObjDict, xObjRef, xObj, patDict, patRef, pat, resObj; - Ref ref0; GBool skip; - int i; setupFonts(resDict); setupImages(resDict); setupForms(resDict); //----- recursively scan XObjects - resDict->lookup("XObject", &xObjDict); + Object xObjDict = resDict->lookup("XObject"); if (xObjDict.isDict()) { - for (i = 0; i < xObjDict.dictGetLength(); ++i) { + for (int i = 0; i < xObjDict.dictGetLength(); ++i) { // avoid infinite recursion on XObjects skip = gFalse; - if ((xObjDict.dictGetValNF(i, &xObjRef)->isRef())) { - ref0 = xObjRef.getRef(); + Object xObjRef = xObjDict.dictGetValNF(i); + if (xObjRef.isRef()) { + Ref ref0 = xObjRef.getRef(); if (resourceIDs.find(ref0.num) != resourceIDs.end()) { skip = gTrue; } else { @@ -1822,32 +1818,28 @@ void PSOutputDev::setupResources(Dict *resDict) { if (!skip) { // process the XObject's resource dictionary - xObjDict.dictGetVal(i, &xObj); + Object xObj = xObjDict.dictGetVal(i); if (xObj.isStream()) { - xObj.streamGetDict()->lookup("Resources", &resObj); + Object resObj = xObj.streamGetDict()->lookup("Resources"); if (resObj.isDict()) { setupResources(resObj.getDict()); } - resObj.free(); } - xObj.free(); } - - xObjRef.free(); } } - xObjDict.free(); //----- recursively scan Patterns - resDict->lookup("Pattern", &patDict); + Object patDict = resDict->lookup("Pattern"); if (patDict.isDict()) { inType3Char = gTrue; - for (i = 0; i < patDict.dictGetLength(); ++i) { + for (int i = 0; i < patDict.dictGetLength(); ++i) { // avoid infinite recursion on Patterns skip = gFalse; - if ((patDict.dictGetValNF(i, &patRef)->isRef())) { - ref0 = patRef.getRef(); + Object patRef = patDict.dictGetValNF(i); + if (patRef.isRef()) { + Ref ref0 = patRef.getRef(); if (resourceIDs.find(ref0.num) != resourceIDs.end()) { skip = gTrue; } else { @@ -1857,40 +1849,33 @@ void PSOutputDev::setupResources(Dict *resDict) { if (!skip) { // process the Pattern's resource dictionary - patDict.dictGetVal(i, &pat); + Object pat = patDict.dictGetVal(i); if (pat.isStream()) { - pat.streamGetDict()->lookup("Resources", &resObj); + Object resObj = pat.streamGetDict()->lookup("Resources"); if (resObj.isDict()) { setupResources(resObj.getDict()); } - resObj.free(); } - pat.free(); } - - patRef.free(); } inType3Char = gFalse; } - patDict.free(); } void PSOutputDev::setupFonts(Dict *resDict) { - Object obj1, obj2; Ref r; GfxFontDict *gfxFontDict; GfxFont *font; int i; - gfxFontDict = NULL; - resDict->lookupNF("Font", &obj1); + gfxFontDict = nullptr; + Object obj1 = resDict->lookupNF("Font"); if (obj1.isRef()) { - obj1.fetch(xref, &obj2); + Object obj2 = obj1.fetch(xref); if (obj2.isDict()) { r = obj1.getRef(); gfxFontDict = new GfxFontDict(xref, &r, obj2.getDict()); } - obj2.free(); } else if (obj1.isDict()) { gfxFontDict = new GfxFontDict(xref, NULL, obj1.getDict()); } @@ -1902,7 +1887,6 @@ void PSOutputDev::setupFonts(Dict *resDict) { } delete gfxFontDict; } - obj1.free(); } void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { @@ -2136,14 +2120,12 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { static const char hexChar[17] = "0123456789abcdef"; - Object refObj, strObj, obj1, obj2, obj3; Dict *dict; long length1, length2, length3; - int c; + int c, i; int start[4]; GBool binMode; GBool writePadding = gTrue; - int i; // check if font is already embedded if (fontNames->lookupInt(psName)) { @@ -2152,9 +2134,9 @@ void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { fontNames->add(psName->copy(), 1); // get the font stream and info - refObj.initRef(id->num, id->gen); - refObj.fetch(xref, &strObj); - refObj.free(); + Object obj1, obj2, obj3; + Object refObj(id->num, id->gen); + Object strObj = refObj.fetch(xref); if (!strObj.isStream()) { error(errSyntaxError, -1, "Embedded font file object is not a stream"); goto err1; @@ -2164,23 +2146,17 @@ void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { "Embedded font stream is missing its dictionary"); goto err1; } - dict->lookup("Length1", &obj1); - dict->lookup("Length2", &obj2); - dict->lookup("Length3", &obj3); + obj1 = dict->lookup("Length1"); + obj2 = dict->lookup("Length2"); + obj3 = dict->lookup("Length3"); if (!obj1.isInt() || !obj2.isInt() || !obj3.isInt()) { error(errSyntaxError, -1, "Missing length fields in embedded font stream dictionary"); - obj1.free(); - obj2.free(); - obj3.free(); goto err1; } length1 = obj1.getInt(); length2 = obj2.getInt(); length3 = obj3.getInt(); - obj1.free(); - obj2.free(); - obj3.free(); // beginning comment writePSFmt("%%BeginResource: font {0:t}\n", psName); @@ -2324,7 +2300,6 @@ void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { err1: if (strObj.isStream()) strObj.streamClose(); - strObj.free(); } void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) { @@ -2796,7 +2771,6 @@ void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName, Dict *parentResDict) { Dict *resDict; Dict *charProcs; - Object charProc; Gfx *gfx; PDFRectangle box; double *m; @@ -2854,8 +2828,8 @@ void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName, writePS("/"); writePSName(charProcs->getKey(i)); writePS(" {\n"); - gfx->display(charProcs->getVal(i, &charProc)); - charProc.free(); + Object charProc = charProcs->getVal(i); + gfx->display(&charProc); if (t3String) { if (t3Cacheable) { buf = GooString::format("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} setcachedevice\n", @@ -2922,25 +2896,24 @@ GooString *PSOutputDev::makePSFontName(GfxFont *font, Ref *id) { } void PSOutputDev::setupImages(Dict *resDict) { - Object xObjDict, xObj, xObjRef, subtypeObj, maskObj, maskRef; Ref imgID; - int i, j; if (!(mode == psModeForm || inType3Char || preloadImagesForms)) { return; } //----- recursively scan XObjects - resDict->lookup("XObject", &xObjDict); + Object xObjDict = resDict->lookup("XObject"); if (xObjDict.isDict()) { - for (i = 0; i < xObjDict.dictGetLength(); ++i) { - xObjDict.dictGetValNF(i, &xObjRef); - xObjDict.dictGetVal(i, &xObj); + for (int i = 0; i < xObjDict.dictGetLength(); ++i) { + Object xObjRef = xObjDict.dictGetValNF(i); + Object xObj = xObjDict.dictGetVal(i); if (xObj.isStream()) { - xObj.streamGetDict()->lookup("Subtype", &subtypeObj); + Object subtypeObj = xObj.streamGetDict()->lookup("Subtype"); if (subtypeObj.isName("Image")) { if (xObjRef.isRef()) { imgID = xObjRef.getRef(); + int j; for (j = 0; j < imgIDLen; ++j) { if (imgIDs[j].num == imgID.num && imgIDs[j].gen == imgID.gen) { break; @@ -2957,24 +2930,21 @@ void PSOutputDev::setupImages(Dict *resDict) { } imgIDs[imgIDLen++] = imgID; setupImage(imgID, xObj.getStream(), gFalse); - if (level >= psLevel3 && - xObj.streamGetDict()->lookup("Mask", &maskObj)->isStream()) { - setupImage(imgID, maskObj.getStream(), gTrue); + if (level >= psLevel3) { + Object maskObj = xObj.streamGetDict()->lookup("Mask"); + if (maskObj.isStream()) { + setupImage(imgID, maskObj.getStream(), gTrue); + } } - maskObj.free(); } } else { error(errSyntaxError, -1, "Image in resource dict is not an indirect reference"); } } - subtypeObj.free(); } - xObj.free(); - xObjRef.free(); } } - xObjDict.free(); } void PSOutputDev::setupImage(Ref id, Stream *str, GBool mask) { @@ -3146,20 +3116,17 @@ void PSOutputDev::setupImage(Ref id, Stream *str, GBool mask) { } void PSOutputDev::setupForms(Dict *resDict) { - Object xObjDict, xObj, xObjRef, subtypeObj; - int i; - if (!preloadImagesForms) { return; } - resDict->lookup("XObject", &xObjDict); + Object xObjDict = resDict->lookup("XObject"); if (xObjDict.isDict()) { - for (i = 0; i < xObjDict.dictGetLength(); ++i) { - xObjDict.dictGetValNF(i, &xObjRef); - xObjDict.dictGetVal(i, &xObj); + for (int i = 0; i < xObjDict.dictGetLength(); ++i) { + Object xObjRef = xObjDict.dictGetValNF(i); + Object xObj = xObjDict.dictGetVal(i); if (xObj.isStream()) { - xObj.streamGetDict()->lookup("Subtype", &subtypeObj); + Object subtypeObj = xObj.streamGetDict()->lookup("Subtype"); if (subtypeObj.isName("Form")) { if (xObjRef.isRef()) { setupForm(xObjRef.getRef(), &xObj); @@ -3168,25 +3135,19 @@ void PSOutputDev::setupForms(Dict *resDict) { "Form in resource dict is not an indirect reference"); } } - subtypeObj.free(); } - xObj.free(); - xObjRef.free(); } } - xObjDict.free(); } void PSOutputDev::setupForm(Ref id, Object *strObj) { Dict *dict, *resDict; - Object matrixObj, bboxObj, resObj, obj1; double m[6], bbox[4]; PDFRectangle box; Gfx *gfx; - int i; // check if form is already defined - for (i = 0; i < formIDLen; ++i) { + for (int i = 0; i < formIDLen; ++i) { if (formIDs[i].num == id.num && formIDs[i].gen == id.gen) { return; } @@ -3206,36 +3167,31 @@ void PSOutputDev::setupForm(Ref id, Object *strObj) { dict = strObj->streamGetDict(); // get bounding box - dict->lookup("BBox", &bboxObj); + Object bboxObj = dict->lookup("BBox"); if (!bboxObj.isArray()) { - bboxObj.free(); error(errSyntaxError, -1, "Bad form bounding box"); return; } - for (i = 0; i < 4; ++i) { - bboxObj.arrayGet(i, &obj1); + for (int i = 0; i < 4; ++i) { + Object obj1 = bboxObj.arrayGet(i); bbox[i] = obj1.getNum(); - obj1.free(); } - bboxObj.free(); // get matrix - dict->lookup("Matrix", &matrixObj); + Object matrixObj = dict->lookup("Matrix"); if (matrixObj.isArray()) { - for (i = 0; i < 6; ++i) { - matrixObj.arrayGet(i, &obj1); + for (int i = 0; i < 6; ++i) { + Object obj1 = matrixObj.arrayGet(i); m[i] = obj1.getNum(); - obj1.free(); } } else { m[0] = 1; m[1] = 0; m[2] = 0; m[3] = 1; m[4] = 0; m[5] = 0; } - matrixObj.free(); // get resources - dict->lookup("Resources", &resObj); + Object resObj = dict->lookup("Resources"); resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL; writePSFmt("/f_{0:d}_{1:d} {{\n", id.num, id.gen); @@ -3253,8 +3209,6 @@ void PSOutputDev::setupForm(Ref id, Object *strObj) { writePS("Q\n"); writePS("} def\n"); - - resObj.free(); } GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, @@ -3276,7 +3230,6 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, GfxState *state; SplashBitmap *bitmap; Stream *str0, *str; - Object obj; Guchar *p; Guchar col[4]; double hDPI2, vDPI2; @@ -3594,9 +3547,8 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, case psLevel2Sep: case psLevel3: case psLevel3Sep: - obj.initNull(); p = bitmap->getDataPtr() + (h - 1) * bitmap->getRowSize(); - str0 = new MemStream((char *)p, 0, w * h * numComps, &obj); + str0 = new MemStream((char *)p, 0, w * h * numComps, Object(objNull)); // Check for a color image that uses only gray if (!getOptimizeColorSpace()) { isGray = gFalse; @@ -6880,138 +6832,111 @@ void PSOutputDev::dumpColorSpaceL2(GfxColorSpace *colorSpace, #if OPI_SUPPORT void PSOutputDev::opiBegin(GfxState *state, Dict *opiDict) { - Object dict; - if (generateOPI) { - opiDict->lookup("2.0", &dict); + Object dict = opiDict->lookup("2.0"); if (dict.isDict()) { opiBegin20(state, dict.getDict()); - dict.free(); } else { - dict.free(); - opiDict->lookup("1.3", &dict); + dict = opiDict->lookup("1.3"); if (dict.isDict()) { opiBegin13(state, dict.getDict()); } - dict.free(); } } } void PSOutputDev::opiBegin20(GfxState *state, Dict *dict) { - Object obj1, obj2, obj3, obj4; double width, height, left, right, top, bottom; int w, h; - int i; writePS("%%BeginOPI: 2.0\n"); writePS("%%Distilled\n"); - dict->lookup("F", &obj1); - if (getFileSpecName(&obj1, &obj2)) { + Object obj1 = dict->lookup("F"); + Object obj2 = getFileSpecName(&obj1); + if (obj2.isString()) { writePSFmt("%%ImageFileName: {0:t}\n", obj2.getString()); - obj2.free(); } - obj1.free(); - dict->lookup("MainImage", &obj1); + obj1 = dict->lookup("MainImage"); if (obj1.isString()) { writePSFmt("%%MainImage: {0:t}\n", obj1.getString()); } - obj1.free(); //~ ignoring 'Tags' entry //~ need to use writePSString() and deal with >255-char lines - dict->lookup("Size", &obj1); + obj1 = dict->lookup("Size"); if (obj1.isArray() && obj1.arrayGetLength() == 2) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); width = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); height = obj2.getNum(); - obj2.free(); writePSFmt("%%ImageDimensions: {0:.6g} {1:.6g}\n", width, height); } - obj1.free(); - dict->lookup("CropRect", &obj1); + obj1 = dict->lookup("CropRect"); if (obj1.isArray() && obj1.arrayGetLength() == 4) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); left = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); top = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2, &obj2); + obj2 = obj1.arrayGet(2); right = obj2.getNum(); - obj2.free(); - obj1.arrayGet(3, &obj2); + obj2 = obj1.arrayGet(3); bottom = obj2.getNum(); - obj2.free(); writePSFmt("%%ImageCropRect: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n", left, top, right, bottom); } - obj1.free(); - dict->lookup("Overprint", &obj1); + obj1 = dict->lookup("Overprint"); if (obj1.isBool()) { writePSFmt("%%ImageOverprint: {0:s}\n", obj1.getBool() ? "true" : "false"); } - obj1.free(); - dict->lookup("Inks", &obj1); + obj1 = dict->lookup("Inks"); if (obj1.isName()) { writePSFmt("%%ImageInks: {0:s}\n", obj1.getName()); } else if (obj1.isArray() && obj1.arrayGetLength() >= 1) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); if (obj2.isName()) { writePSFmt("%%ImageInks: {0:s} {1:d}", obj2.getName(), (obj1.arrayGetLength() - 1) / 2); - for (i = 1; i+1 < obj1.arrayGetLength(); i += 2) { - obj1.arrayGet(i, &obj3); - obj1.arrayGet(i+1, &obj4); + for (int i = 1; i+1 < obj1.arrayGetLength(); i += 2) { + Object obj3 = obj1.arrayGet(i); + Object obj4 = obj1.arrayGet(i+1); if (obj3.isString() && obj4.isNum()) { writePS(" "); writePSString(obj3.getString()); writePSFmt(" {0:.6g}", obj4.getNum()); } - obj3.free(); - obj4.free(); } writePS("\n"); } - obj2.free(); } - obj1.free(); writePS("gsave\n"); writePS("%%BeginIncludedImage\n"); - dict->lookup("IncludedImageDimensions", &obj1); + obj1 = dict->lookup("IncludedImageDimensions"); if (obj1.isArray() && obj1.arrayGetLength() == 2) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); w = obj2.getInt(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); h = obj2.getInt(); - obj2.free(); writePSFmt("%%IncludedImageDimensions: {0:d} {1:d}\n", w, h); } - obj1.free(); - dict->lookup("IncludedImageQuality", &obj1); + obj1 = dict->lookup("IncludedImageQuality"); if (obj1.isNum()) { writePSFmt("%%IncludedImageQuality: {0:.6g}\n", obj1.getNum()); } - obj1.free(); ++opi20Nest; } void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) { - Object obj1, obj2; int left, right, top, bottom, samples, bits, width, height; double c, m, y, k; double llx, lly, ulx, uly, urx, ury, lrx, lry; @@ -7023,86 +6948,68 @@ void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) { writePS("/opiMatrix2 matrix currentmatrix def\n"); writePS("opiMatrix setmatrix\n"); - dict->lookup("F", &obj1); - if (getFileSpecName(&obj1, &obj2)) { + Object obj1 = dict->lookup("F"); + Object obj2 = getFileSpecName(&obj1); + if (obj2.isString()) { writePSFmt("%ALDImageFileName: {0:t}\n", obj2.getString()); - obj2.free(); } - obj1.free(); - dict->lookup("CropRect", &obj1); + obj1 = dict->lookup("CropRect"); if (obj1.isArray() && obj1.arrayGetLength() == 4) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); left = obj2.getInt(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); top = obj2.getInt(); - obj2.free(); - obj1.arrayGet(2, &obj2); + obj2 = obj1.arrayGet(2); right = obj2.getInt(); - obj2.free(); - obj1.arrayGet(3, &obj2); + obj2 = obj1.arrayGet(3); bottom = obj2.getInt(); - obj2.free(); writePSFmt("%ALDImageCropRect: {0:d} {1:d} {2:d} {3:d}\n", left, top, right, bottom); } - obj1.free(); - dict->lookup("Color", &obj1); + obj1 = dict->lookup("Color"); if (obj1.isArray() && obj1.arrayGetLength() == 5) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); c = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); m = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2, &obj2); + obj2 = obj1.arrayGet(2); y = obj2.getNum(); - obj2.free(); - obj1.arrayGet(3, &obj2); + obj2 = obj1.arrayGet(3); k = obj2.getNum(); - obj2.free(); - obj1.arrayGet(4, &obj2); + obj2 = obj1.arrayGet(4); if (obj2.isString()) { writePSFmt("%ALDImageColor: {0:.4g} {1:.4g} {2:.4g} {3:.4g} ", c, m, y, k); writePSString(obj2.getString()); writePS("\n"); } - obj2.free(); } - obj1.free(); - dict->lookup("ColorType", &obj1); + obj1 = dict->lookup("ColorType"); if (obj1.isName()) { writePSFmt("%ALDImageColorType: {0:s}\n", obj1.getName()); } - obj1.free(); //~ ignores 'Comments' entry //~ need to handle multiple lines - dict->lookup("CropFixed", &obj1); + obj1 = dict->lookup("CropFixed"); if (obj1.isArray()) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); ulx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); uly = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2, &obj2); + obj2 = obj1.arrayGet(2); lrx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(3, &obj2); + obj2 = obj1.arrayGet(3); lry = obj2.getNum(); - obj2.free(); writePSFmt("%ALDImageCropFixed: {0:.6g} {1:.6g} {2:.6g} {3:.6g}\n", ulx, uly, lrx, lry); } - obj1.free(); - dict->lookup("GrayMap", &obj1); + obj1 = dict->lookup("GrayMap"); if (obj1.isArray()) { writePS("%ALDImageGrayMap:"); for (i = 0; i < obj1.arrayGetLength(); i += 16) { @@ -7110,116 +7017,90 @@ void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) { writePS("\n%%+"); } for (j = 0; j < 16 && i+j < obj1.arrayGetLength(); ++j) { - obj1.arrayGet(i+j, &obj2); + obj2 = obj1.arrayGet(i+j); writePSFmt(" {0:d}", obj2.getInt()); - obj2.free(); } } writePS("\n"); } - obj1.free(); - dict->lookup("ID", &obj1); + obj1 = dict->lookup("ID"); if (obj1.isString()) { writePSFmt("%ALDImageID: {0:t}\n", obj1.getString()); } - obj1.free(); - dict->lookup("ImageType", &obj1); + obj1 = dict->lookup("ImageType"); if (obj1.isArray() && obj1.arrayGetLength() == 2) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); samples = obj2.getInt(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); bits = obj2.getInt(); - obj2.free(); writePSFmt("%ALDImageType: {0:d} {1:d}\n", samples, bits); } - obj1.free(); - dict->lookup("Overprint", &obj1); + dict->lookup("Overprint"); if (obj1.isBool()) { writePSFmt("%ALDImageOverprint: {0:s}\n", obj1.getBool() ? "true" : "false"); } - obj1.free(); - dict->lookup("Position", &obj1); + obj1 = dict->lookup("Position"); if (obj1.isArray() && obj1.arrayGetLength() == 8) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); llx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); lly = obj2.getNum(); - obj2.free(); - obj1.arrayGet(2, &obj2); + obj2 = obj1.arrayGet(2); ulx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(3, &obj2); + obj2 = obj1.arrayGet(3); uly = obj2.getNum(); - obj2.free(); - obj1.arrayGet(4, &obj2); + obj2 = obj1.arrayGet(4); urx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(5, &obj2); + obj2 = obj1.arrayGet(5); ury = obj2.getNum(); - obj2.free(); - obj1.arrayGet(6, &obj2); + obj2 = obj1.arrayGet(6); lrx = obj2.getNum(); - obj2.free(); - obj1.arrayGet(7, &obj2); + obj2 = obj1.arrayGet(7); lry = obj2.getNum(); - obj2.free(); opiTransform(state, llx, lly, &tllx, &tlly); opiTransform(state, ulx, uly, &tulx, &tuly); opiTransform(state, urx, ury, &turx, &tury); opiTransform(state, lrx, lry, &tlrx, &tlry); writePSFmt("%ALDImagePosition: {0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} {6:.6g} {7:.6g}\n", tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry); - obj2.free(); } - obj1.free(); - dict->lookup("Resolution", &obj1); + obj1 = dict->lookup("Resolution"); if (obj1.isArray() && obj1.arrayGetLength() == 2) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); horiz = obj2.getNum(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); vert = obj2.getNum(); - obj2.free(); writePSFmt("%ALDImageResoution: {0:.6g} {1:.6g}\n", horiz, vert); - obj2.free(); } - obj1.free(); - dict->lookup("Size", &obj1); + obj1 = dict->lookup("Size"); if (obj1.isArray() && obj1.arrayGetLength() == 2) { - obj1.arrayGet(0, &obj2); + obj2 = obj1.arrayGet(0); width = obj2.getInt(); - obj2.free(); - obj1.arrayGet(1, &obj2); + obj2 = obj1.arrayGet(1); height = obj2.getInt(); - obj2.free(); writePSFmt("%ALDImageDimensions: {0:d} {1:d}\n", width, height); } - obj1.free(); //~ ignoring 'Tags' entry //~ need to use writePSString() and deal with >255-char lines - dict->lookup("Tint", &obj1); + obj1 = dict->lookup("Tint"); if (obj1.isNum()) { writePSFmt("%ALDImageTint: {0:.6g}\n", obj1.getNum()); } - obj1.free(); - dict->lookup("Transparency", &obj1); + obj1 = dict->lookup("Transparency"); if (obj1.isBool()) { writePSFmt("%ALDImageTransparency: {0:s}\n", obj1.getBool() ? "true" : "false"); } - obj1.free(); writePS("%%BeginObject: image\n"); writePS("opiMatrix2 setmatrix\n"); @@ -7253,25 +7134,20 @@ void PSOutputDev::opiTransform(GfxState *state, double x0, double y0, } void PSOutputDev::opiEnd(GfxState *state, Dict *opiDict) { - Object dict; - if (generateOPI) { - opiDict->lookup("2.0", &dict); + Object dict = opiDict->lookup("2.0"); if (dict.isDict()) { writePS("%%EndIncludedImage\n"); writePS("%%EndOPI\n"); writePS("grestore\n"); --opi20Nest; - dict.free(); } else { - dict.free(); - opiDict->lookup("1.3", &dict); + dict = opiDict->lookup("1.3"); if (dict.isDict()) { writePS("%%EndObject\n"); writePS("restore\n"); --opi13Nest; } - dict.free(); } } } |