Avoid small mallocs for CPDF_Font::FormFactoryIface.

CPDF_DocPageData lives long enough to perform this role.

Change-Id: Ia5f58fb6aa0a5dd75811e946e19aaee4cfb7e341
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58151
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index 4e2e7bd..baac1d3 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -306,10 +306,9 @@
 }
 
 // static
-std::unique_ptr<CPDF_Font> CPDF_Font::Create(
-    CPDF_Document* pDoc,
-    CPDF_Dictionary* pFontDict,
-    std::unique_ptr<FormFactoryIface> pFactory) {
+std::unique_ptr<CPDF_Font> CPDF_Font::Create(CPDF_Document* pDoc,
+                                             CPDF_Dictionary* pFontDict,
+                                             FormFactoryIface* pFactory) {
   ByteString type = pFontDict->GetStringFor("Subtype");
   std::unique_ptr<CPDF_Font> pFont;
   if (type == "TrueType") {
@@ -326,8 +325,7 @@
     if (!pFont)
       pFont = pdfium::MakeUnique<CPDF_TrueTypeFont>(pDoc, pFontDict);
   } else if (type == "Type3") {
-    pFont = pdfium::MakeUnique<CPDF_Type3Font>(pDoc, pFontDict,
-                                               std::move(pFactory));
+    pFont = pdfium::MakeUnique<CPDF_Type3Font>(pDoc, pFontDict, pFactory);
   } else if (type == "Type0") {
     pFont = pdfium::MakeUnique<CPDF_CIDFont>(pDoc, pFontDict);
   } else {
diff --git a/core/fpdfapi/font/cpdf_font.h b/core/fpdfapi/font/cpdf_font.h
index ecaedcf..1a1d361 100644
--- a/core/fpdfapi/font/cpdf_font.h
+++ b/core/fpdfapi/font/cpdf_font.h
@@ -56,10 +56,9 @@
   };
 
   // |pFactory| only required for Type3 fonts.
-  static std::unique_ptr<CPDF_Font> Create(
-      CPDF_Document* pDoc,
-      CPDF_Dictionary* pFontDict,
-      std::unique_ptr<FormFactoryIface> pFactory);
+  static std::unique_ptr<CPDF_Font> Create(CPDF_Document* pDoc,
+                                           CPDF_Dictionary* pFontDict,
+                                           FormFactoryIface* pFactory);
 
   static CPDF_Font* GetStockFont(CPDF_Document* pDoc, ByteStringView fontname);
   static const uint32_t kInvalidCharCode = static_cast<uint32_t>(-1);
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index e559a5b..9983f8a 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -25,9 +25,8 @@
 
 CPDF_Type3Font::CPDF_Type3Font(CPDF_Document* pDocument,
                                CPDF_Dictionary* pFontDict,
-                               std::unique_ptr<FormFactoryIface> pFormFactory)
-    : CPDF_SimpleFont(pDocument, pFontDict),
-      m_pFormFactory(std::move(pFormFactory)) {
+                               FormFactoryIface* pFormFactory)
+    : CPDF_SimpleFont(pDocument, pFontDict), m_pFormFactory(pFormFactory) {
   ASSERT(GetDocument());
   memset(m_CharWidthL, 0, sizeof(m_CharWidthL));
 }
diff --git a/core/fpdfapi/font/cpdf_type3font.h b/core/fpdfapi/font/cpdf_type3font.h
index fde66d0..68e0e92 100644
--- a/core/fpdfapi/font/cpdf_type3font.h
+++ b/core/fpdfapi/font/cpdf_type3font.h
@@ -13,6 +13,7 @@
 #include "core/fpdfapi/font/cpdf_simplefont.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/unowned_ptr.h"
 
 class CPDF_Dictionary;
 class CPDF_Document;
@@ -23,7 +24,7 @@
  public:
   CPDF_Type3Font(CPDF_Document* pDocument,
                  CPDF_Dictionary* pFontDict,
-                 std::unique_ptr<FormFactoryIface> pFormFactory);
+                 FormFactoryIface* pFormFactory);
   ~CPDF_Type3Font() override;
 
   // CPDF_Font:
@@ -51,7 +52,7 @@
   // The depth char loading is in, to avoid recurive calling LoadChar().
   int m_CharLoadingDepth = 0;
   CFX_Matrix m_FontMatrix;
-  std::unique_ptr<FormFactoryIface> m_pFormFactory;
+  UnownedPtr<FormFactoryIface> const m_pFormFactory;
   RetainPtr<CPDF_Dictionary> m_pCharProcs;
   RetainPtr<CPDF_Dictionary> m_pPageResources;
   RetainPtr<CPDF_Dictionary> m_pFontResources;
diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp
index 55aacf8..978de5c 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.cpp
+++ b/core/fpdfapi/page/cpdf_docpagedata.cpp
@@ -155,16 +155,6 @@
   return pFontDesc;
 }
 
-class FormFactory : public CPDF_Font::FormFactoryIface {
-  std::unique_ptr<CPDF_Font::FormIface> CreateForm(
-      CPDF_Document* pDocument,
-      CPDF_Dictionary* pPageResources,
-      CPDF_Stream* pFormStream) override {
-    return pdfium::MakeUnique<CPDF_Form>(pDocument, pPageResources,
-                                         pFormStream);
-  }
-};
-
 }  // namespace
 
 // static
@@ -241,8 +231,8 @@
       return pFontData->AddRef();
     }
   }
-  std::unique_ptr<CPDF_Font> pFont = CPDF_Font::Create(
-      GetDocument(), pFontDict, pdfium::MakeUnique<FormFactory>());
+  std::unique_ptr<CPDF_Font> pFont =
+      CPDF_Font::Create(GetDocument(), pFontDict, this);
   if (!pFont)
     return nullptr;
 
@@ -533,6 +523,13 @@
     m_FontFileMap.erase(it);
 }
 
+std::unique_ptr<CPDF_Font::FormIface> CPDF_DocPageData::CreateForm(
+    CPDF_Document* pDocument,
+    CPDF_Dictionary* pPageResources,
+    CPDF_Stream* pFormStream) {
+  return pdfium::MakeUnique<CPDF_Form>(pDocument, pPageResources, pFormStream);
+}
+
 CPDF_Font* CPDF_DocPageData::AddStandardFont(
     const char* font,
     const CPDF_FontEncoding* pEncoding) {
diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h
index 1e334cb..d774501 100644
--- a/core/fpdfapi/page/cpdf_docpagedata.h
+++ b/core/fpdfapi/page/cpdf_docpagedata.h
@@ -8,8 +8,10 @@
 #define CORE_FPDFAPI_PAGE_CPDF_DOCPAGEDATA_H_
 
 #include <map>
+#include <memory>
 #include <set>
 
+#include "core/fpdfapi/font/cpdf_font.h"
 #include "core/fpdfapi/page/cpdf_colorspace.h"
 #include "core/fpdfapi/page/cpdf_countedobject.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
@@ -20,7 +22,6 @@
 
 class CFX_Font;
 class CPDF_Dictionary;
-class CPDF_Font;
 class CPDF_FontEncoding;
 class CPDF_IccProfile;
 class CPDF_Image;
@@ -29,7 +30,8 @@
 class CPDF_Stream;
 class CPDF_StreamAcc;
 
-class CPDF_DocPageData : public CPDF_Document::PageDataIface {
+class CPDF_DocPageData : public CPDF_Document::PageDataIface,
+                         public CPDF_Font::FormFactoryIface {
  public:
   static CPDF_DocPageData* FromDocument(const CPDF_Document* pDoc);
 
@@ -42,6 +44,12 @@
       const CPDF_Stream* pFontStream) override;
   void MaybePurgeFontFileStreamAcc(const CPDF_Stream* pFontStream) override;
 
+  // CPDF_Font::FormFactoryIFace:
+  std::unique_ptr<CPDF_Font::FormIface> CreateForm(
+      CPDF_Document* pDocument,
+      CPDF_Dictionary* pPageResources,
+      CPDF_Stream* pFormStream) override;
+
   void Clear(bool bForceRelease);
   bool IsForceClear() const { return m_bForceClear; }