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; }