poppler/Dict.cc | 11 +++++++++++ poppler/Dict.h | 2 ++ poppler/FontInfo.cc | 11 +++++------ 3 files changed, 18 insertions(+), 6 deletions(-)
New commits: commit 70845beb5ed8c9b20f3ff1b5054c58b35ebe4872 Author: Albert Astals Cid <[email protected]> Date: Fri Apr 5 16:46:29 2019 +0200 Introduce Dict::getVal(int i, Ref *returnRef) And use it in FontInfoScanner::scanFonts diff --git a/poppler/Dict.cc b/poppler/Dict.cc index 17c2f98e..524a8622 100644 --- a/poppler/Dict.cc +++ b/poppler/Dict.cc @@ -202,6 +202,17 @@ bool Dict::lookupInt(const char *key, const char *alt_key, int *value) const return false; } +Object Dict::getVal(int i, Ref *returnRef) const +{ + const DictEntry &entry = entries[i]; + if (entry.second.getType() == objRef) { + *returnRef = entry.second.getRef(); + } else { + *returnRef = Ref::INVALID(); + } + return entry.second.fetch(xref); +} + bool Dict::hasKey(const char *key) const { return find(key) != nullptr; } diff --git a/poppler/Dict.h b/poppler/Dict.h index 6c1424a5..287d5a3c 100644 --- a/poppler/Dict.h +++ b/poppler/Dict.h @@ -84,6 +84,8 @@ public: // Iterative accessors. const char *getKey(int i) const { return entries[i].first.c_str(); } Object getVal(int i) const { return entries[i].second.fetch(xref); } + // Same as above but if the returned object is a fetched Ref returns such Ref in returnRef, otherwise returnRef is Ref::INVALID() + Object getVal(int i, Ref *returnRef) const; const Object &getValNF(int i) const { return entries[i].second; } // Set the xref pointer. This is only used in one special case: the diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc index cd335771..b7e970d7 100644 --- a/poppler/FontInfo.cc +++ b/poppler/FontInfo.cc @@ -131,18 +131,17 @@ void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, std::vector<FontInfo Object objDict = resDict->lookup(resTypes[resType]); if (objDict.isDict()) { for (int i = 0; i < objDict.dictGetLength(); ++i) { - const Object &dictObjI = objDict.dictGetValNF(i); - if (dictObjI.isRef()) { + Ref obj2Ref; + const Object obj2 = objDict.getDict()->getVal(i, &obj2Ref); + if (obj2Ref != Ref::INVALID()) { // check for an already-seen object - const Ref r = dictObjI.getRef(); - if (visitedObjects.find(r.num) != visitedObjects.end()) { + if (visitedObjects.find(obj2Ref.num) != visitedObjects.end()) { continue; } - visitedObjects.insert(r.num); + visitedObjects.insert(obj2Ref.num); } - Object obj2 = dictObjI.fetch(xrefA); if (obj2.isStream()) { Ref resourcesRef; const Object resObj = obj2.streamGetDict()->lookup("Resources", &resourcesRef); _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
