Use fewer maps to keep track of XObjects in CPDF_NPageToOneExporter.

Currently, there exists two XObjectNameNumberMaps:
- Local variable to keep track of objects on the current page.
- Member variable to keep track of all objects.

There is no need for the latter, so repurpose the member variable to
keep track of the objects on the current page. This removes the local
variable and methods no longer need a parameter to pass it around.

Change-Id: Ia5f00a0b7ca35ab5d383d2e4778c2f911cdf7926
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/52112
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 f9b5753..3d8e76c 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -549,30 +549,29 @@
  private:
   // Map page object number to XObject object name.
   using PageXObjectMap = std::map<uint32_t, ByteString>;
-  // Map XObject's object name to it's object number.
-  using XObjectNameNumberMap = std::map<ByteString, uint32_t>;
 
   // Creates an XObject from |pSrcPageDict|, or find an existing XObject that
   // represents |pSrcPageDict|. The transformation matrix is specified in
   // |settings|.
   // Returns the XObject reference surrounded by the transformation matrix.
   ByteString AddSubPage(const CPDF_Dictionary* pSrcPageDict,
-                        const NupPageSettings& settings,
-                        XObjectNameNumberMap* pXObjNameNumberMap);
+                        const NupPageSettings& settings);
 
   // 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,
-                  const XObjectNameNumberMap& xObjNameNumberMap);
+  // Adds |bsContent| as the Contents key in |pDestPageDict|.
+  // Adds the objects in |m_XObjectNameToNumberMap| to the XObject dictionary in
+  // |pDestPageDict|'s Resources dictionary.
+  void FinishPage(CPDF_Dictionary* pDestPageDict, const ByteString& bsContent);
 
   // Counter for giving new XObjects unique names.
   uint32_t m_nObjectNumber = 0;
 
-  // Keeps track of created XObjects.
-  XObjectNameNumberMap m_XObjectNameToNumberMap;
+  // Keeps track of created XObjects in the current page.
+  // 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.
@@ -613,6 +612,8 @@
                                    destPageSize.height);
   for (size_t outerPage = 0; outerPage < pageNums.size();
        outerPage += numPagesPerSheet) {
+    m_XObjectNameToNumberMap.clear();
+
     // Create a new page
     CPDF_Dictionary* pDestPageDict = dest()->CreateNewPage(curpage);
     if (!pDestPageDict)
@@ -622,8 +623,6 @@
     ByteString bsContent;
     size_t innerPageMax =
         std::min(outerPage + numPagesPerSheet, pageNums.size());
-    // Mapping of XObject name and XObject object number of one page.
-    XObjectNameNumberMap xObjNameNumberMap;
     for (size_t innerPage = outerPage; innerPage < innerPageMax; ++innerPage) {
       auto* pSrcPageDict = src()->GetPageDictionary(pageNums[innerPage] - 1);
       if (!pSrcPageDict)
@@ -632,11 +631,10 @@
       auto srcPage = pdfium::MakeRetain<CPDF_Page>(src(), pSrcPageDict, true);
       NupPageSettings settings =
           nupState.CalculateNewPagePosition(srcPage->GetPageSize());
-      bsContent += AddSubPage(pSrcPageDict, settings, &xObjNameNumberMap);
+      bsContent += AddSubPage(pSrcPageDict, settings);
     }
 
-    // Finish up the current page.
-    FinishPage(pDestPageDict, bsContent, xObjNameNumberMap);
+    FinishPage(pDestPageDict, bsContent);
     ++curpage;
   }
 
@@ -645,8 +643,7 @@
 
 ByteString CPDF_NPageToOneExporter::AddSubPage(
     const CPDF_Dictionary* pSrcPageDict,
-    const NupPageSettings& settings,
-    XObjectNameNumberMap* pXObjNameNumberMap) {
+    const NupPageSettings& settings) {
   uint32_t dwPageObjnum = pSrcPageDict->GetObjNum();
   ByteString bsXObjectName;
   const auto it = m_SrcPageXObjectMap.find(dwPageObjnum);
@@ -659,8 +656,6 @@
     m_XObjectNameToNumberMap[bsXObjectName] = MakeXObjectFromPage(pSrcPageDict);
     m_SrcPageXObjectMap[dwPageObjnum] = bsXObjectName;
   }
-  (*pXObjNameNumberMap)[bsXObjectName] =
-      m_XObjectNameToNumberMap[bsXObjectName];
 
   CFX_Matrix matrix;
   matrix.Scale(settings.scale, settings.scale);
@@ -723,10 +718,8 @@
   return pNewXObject->GetObjNum();
 }
 
-void CPDF_NPageToOneExporter::FinishPage(
-    CPDF_Dictionary* pDestPageDict,
-    const ByteString& bsContent,
-    const XObjectNameNumberMap& xObjNameNumberMap) {
+void CPDF_NPageToOneExporter::FinishPage(CPDF_Dictionary* pDestPageDict,
+                                         const ByteString& bsContent) {
   ASSERT(pDestPageDict);
 
   CPDF_Dictionary* pRes =
@@ -740,7 +733,7 @@
   if (!pPageXObject)
     pPageXObject = pRes->SetNewFor<CPDF_Dictionary>("XObject");
 
-  for (auto& it : xObjNameNumberMap)
+  for (auto& it : m_XObjectNameToNumberMap)
     pPageXObject->SetNewFor<CPDF_Reference>(it.first, dest(), it.second);
 
   auto pDict = dest()->New<CPDF_Dictionary>();