Add more class members to CPDF_NPageToOneExporter.
Instead of passing them around from method to method. Also rename
MakeXObject() to MakeXObjectFromPage() and update some comments.
Change-Id: I449e24cadee7f7fe823006f7f7814d7078fa2c5a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52110
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp
index e72d027..687e657 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -557,12 +557,12 @@
// transformation matrix.
void AddSubPage(const CPDF_Dictionary* pSrcPageDict,
const NupPageSettings& settings,
- ObjectNumberMap* pObjNumberMap,
- PageXObjectMap* pPageXObjectMap,
XObjectNameNumberMap* pXObjNameNumberMap,
ByteString* bsContent);
- uint32_t MakeXObject(const CPDF_Dictionary* pSrcPageDict,
- ObjectNumberMap* pObjNumberMap);
+
+ // Creates an XObject from |pSrcPageDict|.
+ // Returns the object number for the newly created XObject.
+ uint32_t MakeXObjectFromPage(const CPDF_Dictionary* pSrcPageDict);
void FinishPage(CPDF_Dictionary* pDestPageDict,
const ByteString& bsContent,
@@ -573,6 +573,15 @@
// Keeps track of created XObjects.
XObjectNameNumberMap 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.
+ PageXObjectMap m_SrcPageXObjectMap;
};
CPDF_NPageToOneExporter::CPDF_NPageToOneExporter(CPDF_Document* pDestPDFDoc,
@@ -594,15 +603,9 @@
if (!safe_numPagesPerSheet.IsValid())
return false;
+ m_ObjectNumberMap.clear();
+ m_SrcPageXObjectMap.clear();
size_t numPagesPerSheet = safe_numPagesPerSheet.ValueOrDie();
-
- // Mapping of source page object number and XObject object number.
- // Used to update refernece.
- ObjectNumberMap objectNumberMap;
- // Mapping of source page object number and XObject name of the entire doc.
- // If there are two pages that are identical and have the same object number,
- // we can reuse one created XObject.
- PageXObjectMap pageXObjectMap;
NupState nupState(destPageSize, numPagesOnXAxis, numPagesOnYAxis);
size_t curpage = 0;
@@ -629,8 +632,7 @@
auto srcPage = pdfium::MakeRetain<CPDF_Page>(src(), pSrcPageDict, true);
NupPageSettings settings =
nupState.CalculateNewPagePosition(srcPage->GetPageSize());
- AddSubPage(pSrcPageDict, settings, &objectNumberMap, &pageXObjectMap,
- &xObjNameNumberMap, &bsContent);
+ AddSubPage(pSrcPageDict, settings, &xObjNameNumberMap, &bsContent);
}
// Finish up the current page.
@@ -644,22 +646,19 @@
void CPDF_NPageToOneExporter::AddSubPage(
const CPDF_Dictionary* pSrcPageDict,
const NupPageSettings& settings,
- ObjectNumberMap* pObjNumberMap,
- PageXObjectMap* pPageXObjectMap,
XObjectNameNumberMap* pXObjNameNumberMap,
ByteString* bsContent) {
uint32_t dwPageObjnum = pSrcPageDict->GetObjNum();
ByteString bsXObjectName;
- const auto it = pPageXObjectMap->find(dwPageObjnum);
- if (it != pPageXObjectMap->end()) {
+ const auto it = m_SrcPageXObjectMap.find(dwPageObjnum);
+ if (it != m_SrcPageXObjectMap.end()) {
bsXObjectName = it->second;
} else {
++m_nObjectNumber;
// TODO(Xlou): A better name schema to avoid possible object name collision.
bsXObjectName = ByteString::Format("X%d", m_nObjectNumber);
- m_XObjectNameToNumberMap[bsXObjectName] =
- MakeXObject(pSrcPageDict, pObjNumberMap);
- (*pPageXObjectMap)[dwPageObjnum] = bsXObjectName;
+ m_XObjectNameToNumberMap[bsXObjectName] = MakeXObjectFromPage(pSrcPageDict);
+ m_SrcPageXObjectMap[dwPageObjnum] = bsXObjectName;
}
(*pXObjNameNumberMap)[bsXObjectName] =
m_XObjectNameToNumberMap[bsXObjectName];
@@ -676,9 +675,8 @@
*bsContent += ByteString(contentStream);
}
-uint32_t CPDF_NPageToOneExporter::MakeXObject(
- const CPDF_Dictionary* pSrcPageDict,
- ObjectNumberMap* pObjNumberMap) {
+uint32_t CPDF_NPageToOneExporter::MakeXObjectFromPage(
+ const CPDF_Dictionary* pSrcPageDict) {
ASSERT(pSrcPageDict);
const CPDF_Object* pSrcContentObj =
@@ -687,15 +685,15 @@
CPDF_Stream* pNewXObject = dest()->NewIndirect<CPDF_Stream>(
nullptr, 0, dest()->New<CPDF_Dictionary>());
CPDF_Dictionary* pNewXObjectDict = pNewXObject->GetDict();
- const ByteString bsResourceString = "Resources";
- if (!CopyInheritable(pNewXObjectDict, pSrcPageDict, bsResourceString)) {
+ static const char kResourceString[] = "Resources";
+ if (!CopyInheritable(pNewXObjectDict, pSrcPageDict, kResourceString)) {
// Use a default empty resources if it does not exist.
- pNewXObjectDict->SetNewFor<CPDF_Dictionary>(bsResourceString);
+ pNewXObjectDict->SetNewFor<CPDF_Dictionary>(kResourceString);
}
uint32_t dwSrcPageObj = pSrcPageDict->GetObjNum();
uint32_t dwNewXobjectObj = pNewXObjectDict->GetObjNum();
- (*pObjNumberMap)[dwSrcPageObj] = dwNewXobjectObj;
- UpdateReference(pNewXObjectDict, pObjNumberMap);
+ m_ObjectNumberMap[dwSrcPageObj] = dwNewXobjectObj;
+ UpdateReference(pNewXObjectDict, &m_ObjectNumberMap);
pNewXObjectDict->SetNewFor<CPDF_Name>("Type", "XObject");
pNewXObjectDict->SetNewFor<CPDF_Name>("Subtype", "Form");