Consolidate ObjectNumberMaps in CPDF_PageOrganizer subclasses.
Use the same map in both subclasses, so there is no need to pass it
around between CPDF_PageOrganizer methods.
Change-Id: I12360343db71bd6ffd88fa975bec52e9f4a94775
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52021
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp
index 40d3cb3..a7f35aa 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -271,16 +271,13 @@
class CPDF_PageOrganizer {
protected:
- // Map source page object number to XObject object number.
- using ObjectNumberMap = std::map<uint32_t, uint32_t>;
-
CPDF_PageOrganizer(CPDF_Document* pDestPDFDoc, CPDF_Document* pSrcPDFDoc);
~CPDF_PageOrganizer();
// Must be called after construction before doing anything else.
bool PDFDocInit();
- bool UpdateReference(CPDF_Object* pObj, ObjectNumberMap* pObjNumberMap);
+ bool UpdateReference(CPDF_Object* pObj);
CPDF_Document* dest() { return m_pDestPDFDoc.Get(); }
const CPDF_Document* dest() const { return m_pDestPDFDoc.Get(); }
@@ -288,11 +285,18 @@
CPDF_Document* src() { return m_pSrcPDFDoc.Get(); }
const CPDF_Document* src() const { return m_pSrcPDFDoc.Get(); }
+ void AddObjectMapping(uint32_t dwOldPageObj, uint32_t dwNewPageObj) {
+ m_ObjectNumberMap[dwOldPageObj] = dwNewPageObj;
+ }
+
private:
- uint32_t GetNewObjId(ObjectNumberMap* pObjNumberMap, CPDF_Reference* pRef);
+ uint32_t GetNewObjId(CPDF_Reference* pRef);
UnownedPtr<CPDF_Document> const m_pDestPDFDoc;
UnownedPtr<CPDF_Document> const m_pSrcPDFDoc;
+
+ // Mapping of source object number to destination object number.
+ std::map<uint32_t, uint32_t> m_ObjectNumberMap;
};
CPDF_PageOrganizer::CPDF_PageOrganizer(CPDF_Document* pDestPDFDoc,
@@ -340,12 +344,11 @@
return true;
}
-bool CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj,
- ObjectNumberMap* pObjNumberMap) {
+bool CPDF_PageOrganizer::UpdateReference(CPDF_Object* pObj) {
switch (pObj->GetType()) {
case CPDF_Object::kReference: {
CPDF_Reference* pReference = pObj->AsReference();
- uint32_t newobjnum = GetNewObjId(pObjNumberMap, pReference);
+ uint32_t newobjnum = GetNewObjId(pReference);
if (newobjnum == 0)
return false;
pReference->SetRef(dest(), newobjnum);
@@ -363,7 +366,7 @@
CPDF_Object* pNextObj = it->second.get();
if (!pNextObj)
return false;
- if (!UpdateReference(pNextObj, pObjNumberMap))
+ if (!UpdateReference(pNextObj))
bad_keys.push_back(key);
}
}
@@ -377,7 +380,7 @@
CPDF_Object* pNextObj = pArray->GetObjectAt(i);
if (!pNextObj)
return false;
- if (!UpdateReference(pNextObj, pObjNumberMap))
+ if (!UpdateReference(pNextObj))
return false;
}
break;
@@ -387,7 +390,7 @@
CPDF_Dictionary* pDict = pStream->GetDict();
if (!pDict)
return false;
- if (!UpdateReference(pDict, pObjNumberMap))
+ if (!UpdateReference(pDict))
return false;
break;
}
@@ -398,15 +401,14 @@
return true;
}
-uint32_t CPDF_PageOrganizer::GetNewObjId(ObjectNumberMap* pObjNumberMap,
- CPDF_Reference* pRef) {
+uint32_t CPDF_PageOrganizer::GetNewObjId(CPDF_Reference* pRef) {
if (!pRef)
return 0;
uint32_t dwObjnum = pRef->GetRefObjNum();
uint32_t dwNewObjNum = 0;
- const auto it = pObjNumberMap->find(dwObjnum);
- if (it != pObjNumberMap->end())
+ const auto it = m_ObjectNumberMap.find(dwObjnum);
+ if (it != m_ObjectNumberMap.end())
dwNewObjNum = it->second;
if (dwNewObjNum)
return dwNewObjNum;
@@ -427,8 +429,8 @@
}
CPDF_Object* pUnownedClone = dest()->AddIndirectObject(std::move(pClone));
dwNewObjNum = pUnownedClone->GetObjNum();
- (*pObjNumberMap)[dwObjnum] = dwNewObjNum;
- if (!UpdateReference(pUnownedClone, pObjNumberMap))
+ AddObjectMapping(dwObjnum, dwNewObjNum);
+ if (!UpdateReference(pUnownedClone))
return 0;
return dwNewObjNum;
@@ -460,7 +462,6 @@
return false;
int curpage = nIndex;
- auto pObjNumberMap = pdfium::MakeUnique<ObjectNumberMap>();
for (size_t i = 0; i < pageNums.size(); ++i) {
CPDF_Dictionary* pDestPageDict = dest()->CreateNewPage(curpage);
auto* pSrcPageDict = src()->GetPageDictionary(pageNums[i] - 1);
@@ -517,8 +518,8 @@
// Update the reference
uint32_t dwOldPageObj = pSrcPageDict->GetObjNum();
uint32_t dwNewPageObj = pDestPageDict->GetObjNum();
- (*pObjNumberMap)[dwOldPageObj] = dwNewPageObj;
- UpdateReference(pDestPageDict, pObjNumberMap.get());
+ AddObjectMapping(dwOldPageObj, dwNewPageObj);
+ UpdateReference(pDestPageDict);
++curpage;
}
@@ -573,10 +574,6 @@
// Map XObject's object name to it's object number.
std::map<ByteString, uint32_t> m_XObjectNameToNumberMap;
- // Mapping of source page object number and XObject object number.
- // The XObject is created from the source page.
- ObjectNumberMap m_ObjectNumberMap;
-
// Mapping of source page object number and XObject name of the entire doc.
// If there are multiple source pages that reference the same object number,
// they can also share the same created XObject.
@@ -679,8 +676,8 @@
}
uint32_t dwSrcPageObj = pSrcPageDict->GetObjNum();
uint32_t dwNewXobjectObj = pNewXObjectDict->GetObjNum();
- m_ObjectNumberMap[dwSrcPageObj] = dwNewXobjectObj;
- UpdateReference(pNewXObjectDict, &m_ObjectNumberMap);
+ AddObjectMapping(dwSrcPageObj, dwNewXobjectObj);
+ UpdateReference(pNewXObjectDict);
pNewXObjectDict->SetNewFor<CPDF_Name>("Type", "XObject");
pNewXObjectDict->SetNewFor<CPDF_Name>("Subtype", "Form");