poppler/Annot.cc | 46 ++++++++++++++++++------------------ poppler/Catalog.cc | 6 ++-- poppler/Dict.cc | 9 +++---- poppler/Dict.h | 2 - poppler/FileSpec.cc | 4 +-- poppler/FontInfo.cc | 2 - poppler/Form.cc | 4 +-- poppler/Gfx.cc | 17 ++++++------- poppler/GfxFont.cc | 8 +++--- poppler/Link.cc | 6 ++-- poppler/Movie.cc | 4 +-- poppler/Object.h | 4 +-- poppler/OptionalContent.cc | 2 - poppler/Outline.cc | 10 +++---- poppler/PDFDoc.cc | 10 +++---- poppler/PSOutputDev.cc | 2 - poppler/Page.cc | 24 +++++++++--------- poppler/Stream.cc | 4 +-- poppler/StructElement.cc | 12 ++++----- poppler/StructTreeRoot.cc | 2 - poppler/XRef.cc | 21 +++++++--------- qt5/src/poppler-annotation-helper.h | 4 +-- utils/pdfunite.cc | 8 +++--- 23 files changed, 105 insertions(+), 106 deletions(-)
New commits: commit 49ecbd5933e5b182ffc211d281cdfdc499d0357e Author: Albert Astals Cid <[email protected]> Date: Wed Feb 27 15:44:01 2019 +0100 Change Dict::lookupNF return a const & Saves some copy() diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 467836d1..80e3a99b 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -891,22 +891,22 @@ Object AnnotAppearance::getAppearanceStream(AnnotAppearanceType type, const char // Obtain dictionary or stream associated to appearance type switch (type) { case appearRollover: - apData = appearDict.dictLookupNF("R"); + apData = appearDict.dictLookupNF("R").copy(); if (apData.isNull()) - apData = appearDict.dictLookupNF("N"); + apData = appearDict.dictLookupNF("N").copy(); break; case appearDown: - apData = appearDict.dictLookupNF("D"); + apData = appearDict.dictLookupNF("D").copy(); if (apData.isNull()) - apData = appearDict.dictLookupNF("N"); + apData = appearDict.dictLookupNF("N").copy(); break; case appearNormal: - apData = appearDict.dictLookupNF("N"); + apData = appearDict.dictLookupNF("N").copy(); break; } if (apData.isDict() && state) - return apData.dictLookupNF(state); + return apData.dictLookupNF(state).copy(); else if (apData.isRef()) return apData; @@ -914,7 +914,7 @@ Object AnnotAppearance::getAppearanceStream(AnnotAppearanceType type, const char } std::unique_ptr<GooString> AnnotAppearance::getStateKey(int i) { - Object obj1 = appearDict.dictLookupNF("N"); + const Object &obj1 = appearDict.dictLookupNF("N"); if (obj1.isDict()) return std::make_unique<GooString>(obj1.dictGetKey(i)); return nullptr; @@ -922,7 +922,7 @@ std::unique_ptr<GooString> AnnotAppearance::getStateKey(int i) { int AnnotAppearance::getNumStates() { int res = 0; - Object obj1 = appearDict.dictLookupNF("N"); + const Object &obj1 = appearDict.dictLookupNF("N"); if (obj1.isDict()) res = obj1.dictGetLength(); return res; @@ -956,17 +956,17 @@ bool AnnotAppearance::referencesStream(Ref refToStream) { bool found; // Scan each state's ref/subdictionary - obj1 = appearDict.dictLookupNF("N"); + obj1 = appearDict.dictLookupNF("N").copy(); found = referencesStream(&obj1, refToStream); if (found) return true; - obj1 = appearDict.dictLookupNF("R"); + obj1 = appearDict.dictLookupNF("R").copy(); found = referencesStream(&obj1, refToStream); if (found) return true; - obj1 = appearDict.dictLookupNF("D"); + obj1 = appearDict.dictLookupNF("D").copy(); found = referencesStream(&obj1, refToStream); return found; } @@ -1011,11 +1011,11 @@ void AnnotAppearance::removeStateStreams(Object *obj1) { void AnnotAppearance::removeAllStreams() { Object obj1; - obj1 = appearDict.dictLookupNF("N"); + obj1 = appearDict.dictLookupNF("N").copy(); removeStateStreams(&obj1); - obj1 = appearDict.dictLookupNF("R"); + obj1 = appearDict.dictLookupNF("R").copy(); removeStateStreams(&obj1); - obj1 = appearDict.dictLookupNF("D"); + obj1 = appearDict.dictLookupNF("D").copy(); removeStateStreams(&obj1); } @@ -1226,7 +1226,7 @@ void Annot::initialize(PDFDoc *docA, Dict *dict) { } // Note: This value is overwritten by Annots ctor - obj1 = dict->lookupNF("P"); + obj1 = dict->lookupNF("P").copy(); if (obj1.isRef()) { Ref ref = obj1.getRef(); @@ -1303,7 +1303,7 @@ void Annot::initialize(PDFDoc *docA, Dict *dict) { treeKey = 0; } - oc = dict->lookupNF("OC"); + oc = dict->lookupNF("OC").copy(); } void Annot::getRect(double *x1, double *y1, double *x2, double *y2) const { @@ -1866,7 +1866,7 @@ AnnotPopup::~AnnotPopup() { } void AnnotPopup::initialize(PDFDoc *docA, Dict *dict) { - parent = dict->lookupNF("Parent"); + parent = dict->lookupNF("Parent").copy(); if (!parent.isRef()) { parent.setToNull(); } @@ -1905,7 +1905,7 @@ AnnotMarkup::AnnotMarkup(PDFDoc *docA, Object &&dictObject, const Object *obj) : AnnotMarkup::~AnnotMarkup() = default; void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict) { - Object obj1, obj2; + Object obj1; obj1 = dict->lookup("T"); if (obj1.isString()) { @@ -1913,7 +1913,7 @@ void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict) { } Object popupObj = dict->lookup("Popup"); - obj2 = dict->lookupNF("Popup"); + const Object &obj2 = dict->lookupNF("Popup"); if (popupObj.isDict() && obj2.isRef()) { popup = std::make_unique<AnnotPopup>(docA, std::move(popupObj), &obj2); } @@ -1930,7 +1930,7 @@ void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict) { date.reset(obj1.getString()->copy()); } - obj1 = dict->lookupNF("IRT"); + obj1 = dict->lookupNF("IRT").copy(); if (obj1.isRef()) { inReplyTo = obj1.getRef(); } else { @@ -2825,7 +2825,7 @@ void AnnotFreeText::generateFreeTextAppearance() error(errSyntaxWarning, -1, "Font subdictionary is not a dictionary"); } else { // Get the font dictionary for the actual requested font - Object fontDictionary = fontResources.getDict()->lookupNF(da.getFontName().getName()); + Object fontDictionary = fontResources.getDict()->lookupNF(da.getFontName().getName()).copy(); // Resolve reference, if necessary Ref fontReference = {-1, -1}; @@ -3760,7 +3760,7 @@ void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) { action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI())); } - additionalActions = dict->lookupNF("AA"); + additionalActions = dict->lookupNF("AA").copy(); obj1 = dict->lookup("Parent"); if (obj1.isDict()) { @@ -5132,7 +5132,7 @@ void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) { } } - additionalActions = dict->lookupNF("AA"); + additionalActions = dict->lookupNF("AA").copy(); obj1 = dict->lookup("MK"); if (obj1.isDict()) { diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index ed11145d..e958ad12 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -120,7 +120,7 @@ Catalog::Catalog(PDFDoc *docA) { } // actions - additionalActions = catDict.dictLookupNF("AA"); + additionalActions = catDict.dictLookupNF("AA").copy(); // get the ViewerPreferences dictionary viewerPreferences = catDict.dictLookup("ViewerPreferences"); @@ -213,7 +213,7 @@ bool Catalog::cachePageTree(int page) Object catDict = xref->getCatalog(); if (catDict.isDict()) { - Object pagesDictRef = catDict.dictLookupNF("Pages"); + const Object &pagesDictRef = catDict.dictLookupNF("Pages"); if (pagesDictRef.isRef() && pagesDictRef.getRefNum() >= 0 && pagesDictRef.getRefNum() < xref->getNumObjects()) { @@ -732,7 +732,7 @@ int Catalog::getNumPages() // some PDF files actually use real numbers here ("/Count 9.0") if (!obj.isNum()) { if (pagesDict.dictIs("Page")) { - Object pageRootRef = catDict.dictLookupNF("Pages"); + const Object &pageRootRef = catDict.dictLookupNF("Pages"); error(errSyntaxError, -1, "Pages top-level is a single Page. The document is malformed, trying to recover..."); diff --git a/poppler/Dict.cc b/poppler/Dict.cc index 768d70b1..383f7fd4 100644 --- a/poppler/Dict.cc +++ b/poppler/Dict.cc @@ -16,7 +16,7 @@ // Copyright (C) 2005 Kristian Høgsberg <[email protected]> // Copyright (C) 2006 Krzysztof Kowalczyk <[email protected]> // Copyright (C) 2007-2008 Julien Rebetez <[email protected]> -// Copyright (C) 2008, 2010, 2013, 2014, 2017 Albert Astals Cid <[email protected]> +// Copyright (C) 2008, 2010, 2013, 2014, 2017, 2019 Albert Astals Cid <[email protected]> // Copyright (C) 2010 Paweł Wiejacha <[email protected]> // Copyright (C) 2012 Fabio D'Urso <[email protected]> // Copyright (C) 2013 Thomas Freitag <[email protected]> @@ -168,11 +168,12 @@ Object Dict::lookup(const char *key, int recursion) const { return Object(objNull); } -Object Dict::lookupNF(const char *key) const { +const Object &Dict::lookupNF(const char *key) const { if (const auto *entry = find(key)) { - return entry->second.copy(); + return entry->second; } - return Object(objNull); + static Object nullObj(objNull); + return nullObj; } bool Dict::lookupInt(const char *key, const char *alt_key, int *value) const diff --git a/poppler/Dict.h b/poppler/Dict.h index 0747d40e..db381310 100644 --- a/poppler/Dict.h +++ b/poppler/Dict.h @@ -76,7 +76,7 @@ public: // Look up an entry and return the value. Returns a null object // if <key> is not in the dictionary. Object lookup(const char *key, int recursion = 0) const; - Object lookupNF(const char *key) const; + const Object &lookupNF(const char *key) const; bool lookupInt(const char *key, const char *alt_key, int *value) const; // Iterative accessors. diff --git a/poppler/FileSpec.cc b/poppler/FileSpec.cc index 2087fe2c..463e5514 100644 --- a/poppler/FileSpec.cc +++ b/poppler/FileSpec.cc @@ -7,7 +7,7 @@ // // Copyright (C) 2008-2009 Carlos Garcia Campos <[email protected]> // Copyright (C) 2009 Kovid Goyal <[email protected]> -// Copyright (C) 2012, 2017, 2018 Albert Astals Cid <[email protected]> +// Copyright (C) 2012, 2017-2019 Albert Astals Cid <[email protected]> // Copyright (C) 2012 Hib Eris <[email protected]> // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich // Copyright (C) 2018 Adam Reichold <[email protected]> @@ -127,7 +127,7 @@ FileSpec::FileSpec(const Object *fileSpecA) if (fileSpec.isDict()) { obj1 = fileSpec.dictLookup("EF"); if (obj1.isDict()) { - fileStream = obj1.dictLookupNF("F"); + fileStream = obj1.dictLookupNF("F").copy(); if (!fileStream.isRef()) { ok = false; fileStream.setToNull(); diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc index 8467d650..161e5978 100644 --- a/poppler/FontInfo.cc +++ b/poppler/FontInfo.cc @@ -99,7 +99,7 @@ void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, GooList *fontsList) // scan the fonts in this resource dictionary gfxFontDict = nullptr; - Object fontObj = resDict->lookupNF("Font"); + const Object &fontObj = resDict->lookupNF("Font"); if (fontObj.isRef()) { Object obj2 = fontObj.fetch(xrefA); if (obj2.isDict()) { diff --git a/poppler/Form.cc b/poppler/Form.cc index 204bf4df..905e5c3e 100644 --- a/poppler/Form.cc +++ b/poppler/Form.cc @@ -648,7 +648,7 @@ FormField::FormField(PDFDoc *docA, Object &&aobj, const Ref aref, FormField *par const Ref ref = childRef.getRef(); if (usedParents->find(ref.num) == usedParents->end()) { // Field child: it could be a form field or a widget or composed dict - Object obj2 = childObj.dictLookupNF("Parent"); + Object obj2 = childObj.dictLookupNF("Parent").copy(); Object obj3 = childObj.dictLookup("Parent"); if (obj2.isRef() || obj3.isDict()) { // Child is a form field or composed dict @@ -1875,7 +1875,7 @@ static Object fieldLookup(Dict *field, const char *key, std::set<int> *usedParen if (!obj.isNull()) { return obj; } - Object parent = dict->lookupNF("Parent"); + const Object &parent = dict->lookupNF("Parent"); if (parent.isRef()) { const Ref ref = parent.getRef(); if (usedParents->find(ref.num) == usedParents->end()) { diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index c80786e7..4da19c14 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -317,7 +317,6 @@ static inline bool isSameGfxColor(const GfxColor &colorA, const GfxColor &colorB GfxResources::GfxResources(XRef *xrefA, Dict *resDictA, GfxResources *nextA) : gStateCache(2), xref(xrefA) { - Object obj1, obj2; Ref r; if (resDictA) { @@ -325,9 +324,9 @@ GfxResources::GfxResources(XRef *xrefA, Dict *resDictA, GfxResources *nextA) : // build font dictionary Dict *resDict = resDictA->copy(xref); fonts = nullptr; - obj1 = resDict->lookupNF("Font"); + const Object &obj1 = resDict->lookupNF("Font"); if (obj1.isRef()) { - obj2 = obj1.fetch(xref); + Object obj2 = obj1.fetch(xref); if (obj2.isDict()) { r = obj1.getRef(); fonts = new GfxFontDict(xref, &r, obj2.getDict()); @@ -414,7 +413,7 @@ Object GfxResources::lookupXObjectNF(const char *name) { for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->xObjDict.isDict()) { - Object obj = resPtr->xObjDict.dictLookupNF(name); + Object obj = resPtr->xObjDict.dictLookupNF(name).copy(); if (!obj.isNull()) return obj; } @@ -428,7 +427,7 @@ Object GfxResources::lookupMarkedContentNF(const char *name) { for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->propertiesDict.isDict()) { - Object obj = resPtr->propertiesDict.dictLookupNF(name); + Object obj = resPtr->propertiesDict.dictLookupNF(name).copy(); if (!obj.isNull()) return obj; } @@ -457,7 +456,7 @@ GfxPattern *GfxResources::lookupPattern(const char *name, OutputDev *out, GfxSta for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->patternDict.isDict()) { - Object obj = resPtr->patternDict.dictLookupNF(name); + Object obj = resPtr->patternDict.dictLookupNF(name).copy(); if (!obj.isNull()) { Ref patternRef = { -1, -1 }; if (obj.isRef()) { @@ -515,7 +514,7 @@ Object GfxResources::lookupGStateNF(const char *name) { for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->gStateDict.isDict()) { - Object obj = resPtr->gStateDict.dictLookupNF(name); + Object obj = resPtr->gStateDict.dictLookupNF(name).copy(); if (!obj.isNull()) { return obj; } @@ -4228,7 +4227,7 @@ void Gfx::doImage(Object *ref, Stream *str, bool inlineImg) { // check for optional content key if (ref) { - obj1 = dict->lookupNF("OC"); + obj1 = dict->lookupNF("OC").copy(); if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) { return; } @@ -4692,7 +4691,7 @@ void Gfx::doForm(Object *str) { // check for optional content key ocSaved = ocState; - obj1 = dict->lookupNF("OC"); + obj1 = dict->lookupNF("OC").copy(); if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) { if (out->needCharCount()) { ocState = false; diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc index 172d8375..44282d94 100644 --- a/poppler/GfxFont.cc +++ b/poppler/GfxFont.cc @@ -341,14 +341,14 @@ GfxFontType GfxFont::getFontType(XRef *xref, Dict *fontDict, Ref *embID) { Object fontDesc = fontDict2->lookup("FontDescriptor"); if (fontDesc.isDict()) { - Object obj3 = fontDesc.dictLookupNF("FontFile"); + Object obj3 = fontDesc.dictLookupNF("FontFile").copy(); if (obj3.isRef()) { *embID = obj3.getRef(); if (expectedType != fontType1) { err = true; } } - if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile2"), obj3.isRef())) { + if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile2").copy(), obj3.isRef())) { *embID = obj3.getRef(); if (isType0) { expectedType = fontCIDType2; @@ -356,7 +356,7 @@ GfxFontType GfxFont::getFontType(XRef *xref, Dict *fontDict, Ref *embID) { err = true; } } - if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile3"), obj3.isRef())) { + if (embID->num == -1 && (obj3 = fontDesc.dictLookupNF("FontFile3").copy(), obj3.isRef())) { *embID = obj3.getRef(); Object obj4 = obj3.fetch(xref); if (obj4.isStream()) { @@ -1684,7 +1684,7 @@ Object Gfx8BitFont::getCharProc(int code) { Object Gfx8BitFont::getCharProcNF(int code) { if (enc[code] && charProcs.isDict()) { - return charProcs.dictLookupNF(enc[code]); + return charProcs.dictLookupNF(enc[code]).copy(); } else { return Object(objNull); } diff --git a/poppler/Link.cc b/poppler/Link.cc index 32fc41cd..428e8b6f 100644 --- a/poppler/Link.cc +++ b/poppler/Link.cc @@ -163,7 +163,7 @@ LinkAction *LinkAction::parseAction(const Object *obj, const GooString *baseURI, // Prevent circles in the tree by checking the ref against used refs in // our current tree branch. - const Object nextRefObj = obj->dictLookupNF("Next"); + const Object &nextRefObj = obj->dictLookupNF("Next"); if (nextRefObj.isRef()) { const Ref ref = nextRefObj.getRef(); if (!seenNextActions->insert(ref.num).second) { @@ -637,7 +637,7 @@ LinkMovie::LinkMovie(const Object *obj) { annotRef.num = -1; annotTitle = nullptr; - Object tmp = obj->dictLookupNF("Annotation"); + Object tmp = obj->dictLookupNF("Annotation").copy(); if (tmp.isRef()) { annotRef = tmp.getRef(); } @@ -758,7 +758,7 @@ LinkRendition::LinkRendition(const Object *obj) { renditionObj.setToNull(); } - screenRef = obj->dictLookupNF("AN"); + screenRef = obj->dictLookupNF("AN").copy(); if (!screenRef.isRef() && operation >= 0 && operation <= 4) { error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field with op = {0:d}", operationCode); screenRef.setToNull(); diff --git a/poppler/Movie.cc b/poppler/Movie.cc index f4dfdf91..1a540237 100644 --- a/poppler/Movie.cc +++ b/poppler/Movie.cc @@ -6,7 +6,7 @@ // Hugo Mercier <hmercier31[at]gmail.com> (c) 2008 // Pino Toscano <[email protected]> (c) 2008 // Carlos Garcia Campos <[email protected]> (c) 2010 -// Albert Astals Cid <[email protected]> (c) 2010, 2017, 2018 +// Albert Astals Cid <[email protected]> (c) 2010, 2017-2019 // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -213,7 +213,7 @@ void Movie::parseMovie (const Object *movieDict) { // // movie poster // - poster = movieDict->dictLookupNF("Poster"); + poster = movieDict->dictLookupNF("Poster").copy(); if (!poster.isNull()) { if (poster.isRef() || poster.isStream()) { showPoster = true; diff --git a/poppler/Object.h b/poppler/Object.h index 4f07efa7..77a40cda 100644 --- a/poppler/Object.h +++ b/poppler/Object.h @@ -280,7 +280,7 @@ public: void dictRemove(const char *key); bool dictIs(const char *dictType) const; Object dictLookup(const char *key, int recursion = 0) const; - Object dictLookupNF(const char *key) const; + const Object &dictLookupNF(const char *key) const; const char *dictGetKey(int i) const; Object dictGetVal(int i) const; const Object &dictGetValNF(int i) const; @@ -368,7 +368,7 @@ inline bool Object::isDict(const char *dictType) const inline Object Object::dictLookup(const char *key, int recursion) const { OBJECT_TYPE_CHECK(objDict); return dict->lookup(key, recursion); } -inline Object Object::dictLookupNF(const char *key) const +inline const Object &Object::dictLookupNF(const char *key) const { OBJECT_TYPE_CHECK(objDict); return dict->lookupNF(key); } inline const char *Object::dictGetKey(int i) const diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc index f4906bf9..23acd019 100644 --- a/poppler/OptionalContent.cc +++ b/poppler/OptionalContent.cc @@ -163,7 +163,7 @@ bool OCGs::optContentIsVisible( Object *dictRef ) if (ve.isArray()) { result = evalOCVisibilityExpr(&ve, 0); } else { - Object ocg = dict->lookupNF("OCGs"); + const Object &ocg = dict->lookupNF("OCGs"); if (ocg.isArray()) { Object policy = dict->lookup("P"); if (policy.isName("AllOn")) { diff --git a/poppler/Outline.cc b/poppler/Outline.cc index b17ffdf9..1b7fb8d1 100644 --- a/poppler/Outline.cc +++ b/poppler/Outline.cc @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005 Marco Pesenti Gritti <[email protected]> -// Copyright (C) 2008, 2016-2018 Albert Astals Cid <[email protected]> +// Copyright (C) 2008, 2016-2019 Albert Astals Cid <[email protected]> // Copyright (C) 2009 Nick Jones <[email protected]> // Copyright (C) 2016 Jason Crain <[email protected]> // Copyright (C) 2017 Adrian Johnson <[email protected]> @@ -44,7 +44,7 @@ Outline::Outline(const Object *outlineObj, XRef *xref) { if (!outlineObj->isDict()) { return; } - Object first = outlineObj->dictLookupNF("First"); + const Object &first = outlineObj->dictLookupNF("First"); items = OutlineItem::readItemList(nullptr, &first, xref); } @@ -85,9 +85,9 @@ OutlineItem::OutlineItem(const Dict *dict, int refNumA, OutlineItem *parentA, XR } } - firstRef = dict->lookupNF("First"); - lastRef = dict->lookupNF("Last"); - nextRef = dict->lookupNF("Next"); + firstRef = dict->lookupNF("First").copy(); + lastRef = dict->lookupNF("Last").copy(); + nextRef = dict->lookupNF("Next").copy(); startsOpen = false; obj1 = dict->lookup("Count"); diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 65267116..75f169e8 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -925,7 +925,7 @@ int PDFDoc::savePageAs(const GooString *name, int pageNo) markPageObjects(infoDict, yRef, countRef, 0, refPage->num, rootNum + 2); if (trailerObj->isDict()) { Dict *trailerDict = trailerObj->getDict(); - Object ref = trailerDict->lookupNF("Info"); + const Object &ref = trailerDict->lookupNF("Info"); if (ref.isRef()) { yRef->add(ref.getRef().num, ref.getRef().gen, 0, true); if (getXRef()->getEntry(ref.getRef().num)->type == xrefEntryCompressed) { @@ -939,7 +939,7 @@ int PDFDoc::savePageAs(const GooString *name, int pageNo) Object catObj = getXRef()->getCatalog(); Dict *catDict = catObj.getDict(); Object pagesObj = catDict->lookup("Pages"); - Object afObj = catDict->lookupNF("AcroForm"); + Object afObj = catDict->lookupNF("AcroForm").copy(); if (!afObj.isNull()) { markAcroForm(&afObj, yRef, countRef, 0, refPage->num, rootNum + 2); } @@ -958,7 +958,7 @@ int PDFDoc::savePageAs(const GooString *name, int pageNo) } } markPageObjects(pageDict, yRef, countRef, 0, refPage->num, rootNum + 2); - Object annotsObj = pageDict->lookupNF("Annots"); + Object annotsObj = pageDict->lookupNF("Annots").copy(); if (!annotsObj.isNull()) { markAnnotations(&annotsObj, yRef, countRef, 0, refPage->num, rootNum + 2); } @@ -1550,7 +1550,7 @@ Object PDFDoc::createTrailerDict(int uxrefSize, bool incrUpdate, Goffset startxR bool hasEncrypt = false; if (!xRef->getTrailerDict()->isNone()) { - Object obj2 = xRef->getTrailerDict()->dictLookupNF("Encrypt"); + Object obj2 = xRef->getTrailerDict()->dictLookupNF("Encrypt").copy(); if (!obj2.isNull()) { trailerDict->set("Encrypt", std::move(obj2)); hasEncrypt = true; @@ -1807,7 +1807,7 @@ bool PDFDoc::markAnnotations(Object *annotsObj, XRef *xRef, XRef *countRef, unsi Dict *dict = obj1.getDict(); Object type = dict->lookup("Type"); if (type.isName() && strcmp(type.getName(), "Annot") == 0) { - Object obj2 = dict->lookupNF("P"); + const Object &obj2 = dict->lookupNF("P"); if (obj2.isRef()) { if (obj2.getRef().num == oldPageNum) { const Object &obj3 = array->getNF(i); diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 32f11fce..ee07a6f6 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -1854,7 +1854,7 @@ void PSOutputDev::setupFonts(Dict *resDict) { int i; gfxFontDict = nullptr; - Object obj1 = resDict->lookupNF("Font"); + const Object &obj1 = resDict->lookupNF("Font"); if (obj1.isRef()) { Object obj2 = obj1.fetch(xref); if (obj2.isDict()) { diff --git a/poppler/Page.cc b/poppler/Page.cc index 33c624f0..2cb75146 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -258,7 +258,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a attrs->clipBoxes(); // transtion - trans = pageObj.dictLookupNF("Trans"); + trans = pageObj.dictLookupNF("Trans").copy(); if (!(trans.isRef() || trans.isDict() || trans.isNull())) { error(errSyntaxError, -1, "Page transition object (page {0:d}) is wrong type ({1:s})", num, trans.getTypeName()); @@ -266,7 +266,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a } // duration - Object tmp = pageObj.dictLookupNF("Dur"); + const Object &tmp = pageObj.dictLookupNF("Dur"); if (!(tmp.isNum() || tmp.isNull())) { error(errSyntaxError, -1, "Page duration object (page {0:d}) is wrong type ({1:s})", num, tmp.getTypeName()); @@ -275,7 +275,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a } // annotations - annotsObj = pageObj.dictLookupNF("Annots"); + annotsObj = pageObj.dictLookupNF("Annots").copy(); if (!(annotsObj.isRef() || annotsObj.isArray() || annotsObj.isNull())) { error(errSyntaxError, -1, "Page annotations object (page {0:d}) is wrong type ({1:s})", num, annotsObj.getTypeName()); @@ -283,7 +283,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a } // contents - contents = pageObj.dictLookupNF("Contents"); + contents = pageObj.dictLookupNF("Contents").copy(); if (!(contents.isRef() || contents.isArray() || contents.isNull())) { error(errSyntaxError, -1, "Page contents object (page {0:d}) is wrong type ({1:s})", @@ -292,7 +292,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a } // thumb - thumb = pageObj.dictLookupNF("Thumb"); + thumb = pageObj.dictLookupNF("Thumb").copy(); if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) { error(errSyntaxError, -1, "Page thumb object (page {0:d}) is wrong type ({1:s})", num, thumb.getTypeName()); @@ -300,7 +300,7 @@ Page::Page(PDFDoc *docA, int numA, Object &&pageDict, Ref pageRefA, PageAttrs *a } // actions - actions = pageObj.dictLookupNF("AA"); + actions = pageObj.dictLookupNF("AA").copy(); if (!(actions.isDict() || actions.isNull())) { error(errSyntaxError, -1, "Page additional action object (page {0:d}) is wrong type ({1:s})", num, actions.getTypeName()); @@ -340,15 +340,15 @@ void Page::replaceXRef(XRef *xrefA) { Object obj1; Dict *pageDict = pageObj.getDict()->copy(xrefA); xref = xrefA; - trans = pageDict->lookupNF("Trans"); - annotsObj = pageDict->lookupNF("Annots"); - contents = pageDict->lookupNF("Contents"); + trans = pageDict->lookupNF("Trans").copy(); + annotsObj = pageDict->lookupNF("Annots").copy(); + contents = pageDict->lookupNF("Contents").copy(); if (contents.isArray()) { - obj1 = pageDict->lookupNF("Contents"); + obj1 = pageDict->lookupNF("Contents").copy(); contents = obj1.getArray()->copy(xrefA); } - thumb = pageDict->lookupNF("Thumb"); - actions = pageDict->lookupNF("AA"); + thumb = pageDict->lookupNF("Thumb").copy(); + actions = pageDict->lookupNF("AA").copy(); obj1 = pageDict->lookup("Resources"); if (obj1.isDict()) { attrs->replaceResource(std::move(obj1)); diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 6a6b46a2..33537b0e 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -14,7 +14,7 @@ // under GPL version 2 or later // // Copyright (C) 2005 Jeff Muizelaar <[email protected]> -// Copyright (C) 2006-2010, 2012-2014, 2016, 2017, 2018 Albert Astals Cid <[email protected]> +// Copyright (C) 2006-2010, 2012-2014, 2016-2019 Albert Astals Cid <[email protected]> // Copyright (C) 2007 Krzysztof Kowalczyk <[email protected]> // Copyright (C) 2008 Julien Rebetez <[email protected]> // Copyright (C) 2009 Carlos Garcia Campos <[email protected]> @@ -322,7 +322,7 @@ Stream *Stream::makeFilter(const char *name, Stream *str, Object *params, int re Object globals; if (params->isDict()) { XRef *xref = params->getDict()->getXRef(); - obj = params->dictLookupNF("JBIG2Globals"); + obj = params->dictLookupNF("JBIG2Globals").copy(); globals = obj.fetch(xref, recursion); } str = new JBIG2Stream(str, std::move(globals), &obj); diff --git a/poppler/StructElement.cc b/poppler/StructElement.cc index 3cde8c91..41491161 100644 --- a/poppler/StructElement.cc +++ b/poppler/StructElement.cc @@ -1045,7 +1045,7 @@ void StructElement::parse(Dict *element) } // Parent object reference (required). - s->parentRef = element->lookupNF("P"); + s->parentRef = element->lookupNF("P").copy(); if (!s->parentRef.isRef()) { error(errSyntaxError, -1, "P object is wrong type ({0:s})", obj.getTypeName()); return; @@ -1085,7 +1085,7 @@ void StructElement::parse(Dict *element) // is to be rendered in. Note: each element stores only the /Pg value // contained by it, and StructElement::getPageRef() may look in parent // elements to find the page where an element belongs. - pageRef = element->lookupNF("Pg"); + pageRef = element->lookupNF("Pg").copy(); // Revision number (optional). obj = element->lookup("R"); @@ -1201,17 +1201,17 @@ StructElement *StructElement::parseChild(const Object *ref, child = new StructElement(mcidObj.getInt(), treeRoot, this); - Object pageRefObj = childObj->dictLookupNF("Pg"); + Object pageRefObj = childObj->dictLookupNF("Pg").copy(); if (pageRefObj.isRef()) { child->pageRef = std::move(pageRefObj); } } else if (childObj->isDict("OBJR")) { - Object refObj = childObj->dictLookupNF("Obj"); + const Object &refObj = childObj->dictLookupNF("Obj"); if (refObj.isRef()) { child = new StructElement(refObj.getRef(), treeRoot, this); - Object pageRefObj = childObj->dictLookupNF("Pg"); + Object pageRefObj = childObj->dictLookupNF("Pg").copy(); if (pageRefObj.isRef()) { child->pageRef = std::move(pageRefObj); } @@ -1259,7 +1259,7 @@ void StructElement::parseChildren(Dict *element, std::set<int> &seen) parseChild(&ref, &obj, seen); } } else if (kids.isDict() || kids.isInt()) { - Object ref = element->lookupNF("K"); + const Object &ref = element->lookupNF("K"); parseChild(&ref, &kids, seen); } } diff --git a/poppler/StructTreeRoot.cc b/poppler/StructTreeRoot.cc index 99359b76..dc9eb56a 100644 --- a/poppler/StructTreeRoot.cc +++ b/poppler/StructTreeRoot.cc @@ -95,7 +95,7 @@ void StructTreeRoot::parse(Dict *root) StructElement *child = new StructElement(kids.getDict(), this, nullptr, seenElements); if (child->isOk()) { appendChild(child); - Object ref = root->lookupNF("K"); + const Object &ref = root->lookupNF("K"); if (ref.isRef()) parentTreeAdd(ref.getRef(), child); } else { diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 4679da96..d9b7a33b 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -291,7 +291,7 @@ XRef::XRef(BaseStream *strA, Goffset pos, Goffset mainXRefEntriesOffsetA, bool * } // set size to (at least) the size specified in trailer dict - obj = trailerDict.dictLookupNF("Size"); + obj = trailerDict.dictLookupNF("Size").copy(); if (!obj.isInt()) { error(errSyntaxWarning, -1, "No valid XRef size in trailer"); } else { @@ -306,7 +306,7 @@ XRef::XRef(BaseStream *strA, Goffset pos, Goffset mainXRefEntriesOffsetA, bool * } // get the root dictionary (catalog) object - obj = trailerDict.dictLookupNF("Root"); + obj = trailerDict.dictLookupNF("Root").copy(); if (obj.isRef()) { rootNum = obj.getRefNum(); rootGen = obj.getRefGen(); @@ -588,7 +588,7 @@ bool XRef::readXRefTable(Parser *parser, Goffset *pos, std::vector<Goffset> *fol } // get the 'Prev' pointer - obj2 = obj.getDict()->lookupNF("Prev"); + obj2 = obj.getDict()->lookupNF("Prev").copy(); if (obj2.isInt() || obj2.isInt64()) { if (obj2.isInt()) pos2 = obj2.getInt(); @@ -657,7 +657,7 @@ bool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) { ok = false; Dict *dict = xrefStr->getDict(); - obj = dict->lookupNF("Size"); + obj = dict->lookupNF("Size").copy(); if (!obj.isInt()) { return false; } @@ -672,7 +672,7 @@ bool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) { } } - obj = dict->lookupNF("W"); + obj = dict->lookupNF("W").copy(); if (!obj.isArray() || obj.arrayGetLength() < 3) { return false; } @@ -691,7 +691,7 @@ bool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) { } xrefStr->reset(); - Object idx = dict->lookupNF("Index"); + const Object &idx = dict->lookupNF("Index"); if (idx.isArray()) { for (int i = 0; i+1 < idx.arrayGetLength(); i += 2) { obj = idx.arrayGet(i); @@ -715,7 +715,7 @@ bool XRef::readXRefStream(Stream *xrefStr, Goffset *pos) { } } - obj = dict->lookupNF("Prev"); + obj = dict->lookupNF("Prev").copy(); if (obj.isInt() && obj.getInt() >= 0) { *pos = obj.getInt(); more = true; @@ -816,7 +816,6 @@ bool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) { // Existing data in XRef::entries may get corrupted if applied anyway. bool XRef::constructXRef(bool *wasReconstructed, bool needCatalogDict) { Parser *parser; - Object obj; char buf[256]; Goffset pos; int num, gen; @@ -872,7 +871,7 @@ bool XRef::constructXRef(bool *wasReconstructed, bool needCatalogDict) { false); Object newTrailerDict = parser->getObj(); if (newTrailerDict.isDict()) { - obj = newTrailerDict.dictLookupNF("Root"); + const Object &obj = newTrailerDict.dictLookupNF("Root"); if (obj.isRef() && (!gotRoot || !needCatalogDict) && rootNum != obj.getRefNum()) { rootNum = obj.getRefNum(); rootGen = obj.getRefGen(); @@ -1196,7 +1195,7 @@ Object XRef::getDocInfo() { // Added for the pdftex project. Object XRef::getDocInfoNF() { - return trailerDict.dictLookupNF("Info"); + return trailerDict.dictLookupNF("Info").copy(); } Object XRef::createDocInfoIfNoneExists() { @@ -1695,7 +1694,7 @@ void XRef::scanSpecialFlags() { void XRef::markUnencrypted() { // Mark objects referred from the Encrypt dict as Unencrypted - Object obj = trailerDict.dictLookupNF("Encrypt"); + const Object &obj = trailerDict.dictLookupNF("Encrypt"); if (obj.isRef()) { XRefEntry *e = getEntry(obj.getRefNum()); e->setFlag(XRefEntry::Unencrypted, true); diff --git a/qt5/src/poppler-annotation-helper.h b/qt5/src/poppler-annotation-helper.h index f7d2dece..d8193c65 100644 --- a/qt5/src/poppler-annotation-helper.h +++ b/qt5/src/poppler-annotation-helper.h @@ -1,5 +1,5 @@ /* poppler-annotation-helper.h: qt interface to poppler - * Copyright (C) 2006, 2008, 2017, 2018, Albert Astals Cid <[email protected]> + * Copyright (C) 2006, 2008, 2017-2019, Albert Astals Cid <[email protected]> * Copyright (C) 2008, Pino Toscano <[email protected]> * Copyright (C) 2012, Fabio D'Urso <[email protected]> * Copyright (C) 2018, Dileep Sankhla <[email protected]> @@ -139,7 +139,7 @@ void XPDFReader::lookupColor( Dict * dict, char * type, QColor & dest ) void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest ) { - Object refObj = dict->lookupNF( type ); + const Object &refObj = dict->lookupNF( type ); if ( refObj.isNull() ) return; if ( refObj.isRef() ) diff --git a/utils/pdfunite.cc b/utils/pdfunite.cc index 4505f875..b0142116 100644 --- a/utils/pdfunite.cc +++ b/utils/pdfunite.cc @@ -204,12 +204,12 @@ int main (int argc, char *argv[]) Object catObj = docs[0]->getXRef()->getCatalog(); Dict *catDict = catObj.getDict(); intents = catDict->lookup("OutputIntents"); - afObj = catDict->lookupNF("AcroForm"); + afObj = catDict->lookupNF("AcroForm").copy(); Ref *refPage = docs[0]->getCatalog()->getPageRef(1); if (!afObj.isNull() && refPage) { docs[0]->markAcroForm(&afObj, yRef, countRef, 0, refPage->num, refPage->num); } - ocObj = catDict->lookupNF("OCProperties"); + ocObj = catDict->lookupNF("OCProperties").copy(); if (!ocObj.isNull() && ocObj.isDict() && refPage) { docs[0]->markPageObjects(ocObj.getDict(), yRef, countRef, 0, refPage->num, refPage->num); } @@ -296,7 +296,7 @@ int main (int argc, char *argv[]) pages.push_back(std::move(page)); offsets.push_back(numOffset); docs[i]->markPageObjects(pageDict, yRef, countRef, numOffset, refPage->num, refPage->num); - Object annotsObj = pageDict->lookupNF("Annots"); + Object annotsObj = pageDict->lookupNF("Annots").copy(); if (!annotsObj.isNull()) { docs[i]->markAnnotations(&annotsObj, yRef, countRef, numOffset, refPage->num, refPage->num); } @@ -313,7 +313,7 @@ int main (int argc, char *argv[]) Object pageForm = pageCatDict->lookup("AcroForm"); if (i > 0 && !pageForm.isNull() && pageForm.isDict()) { if (afObj.isNull()) { - afObj = pageCatDict->lookupNF("AcroForm"); + afObj = pageCatDict->lookupNF("AcroForm").copy(); } else if (afObj.isDict()) { doMergeFormDict(afObj.getDict(), pageForm.getDict(), numOffset); } _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
