Prevent CPDF_Type3Font from knowing that CPDF_Type3Char has a form.
Small bit of information hiding. One less "illegal" include.
Note that CPDF_RenderStatus still has to know about this for
the moment.
Change-Id: I4de6d610102ba5897bb840465356a5f1bfafb835
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55715
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_type3char.cpp b/core/fpdfapi/font/cpdf_type3char.cpp
index 77e5bc6..5e04065 100644
--- a/core/fpdfapi/font/cpdf_type3char.cpp
+++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -14,6 +14,7 @@
#include "core/fpdfapi/page/cpdf_pageobject.h"
#include "core/fxge/dib/cfx_dibitmap.h"
#include "core/fxge/fx_dib.h"
+#include "third_party/base/ptr_util.h"
namespace {
@@ -21,10 +22,14 @@
} // namespace
-CPDF_Type3Char::CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm)
- : m_pForm(std::move(pForm)) {}
+CPDF_Type3Char::CPDF_Type3Char(CPDF_Document* pDocument,
+ CPDF_Dictionary* pPageResources,
+ CPDF_Stream* pFormStream)
+ : m_pForm(pdfium::MakeUnique<CPDF_Form>(pDocument,
+ pPageResources,
+ pFormStream)) {}
-CPDF_Type3Char::~CPDF_Type3Char() {}
+CPDF_Type3Char::~CPDF_Type3Char() = default;
// static
float CPDF_Type3Char::TextUnitToGlyphUnit(float fTextUnit) {
@@ -95,6 +100,14 @@
m_pForm.reset();
}
+void CPDF_Type3Char::ParseContent() {
+ m_pForm->ParseContent(nullptr, nullptr, this, nullptr);
+}
+
+bool CPDF_Type3Char::HasPageObjects() const {
+ return !!m_pForm->GetPageObjectCount();
+}
+
RetainPtr<CFX_DIBitmap> CPDF_Type3Char::GetBitmap() {
return m_pBitmap;
}
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h
index 28baffe..9edd6cd 100644
--- a/core/fpdfapi/font/cpdf_type3char.h
+++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -14,35 +14,43 @@
#include "core/fxcrt/retain_ptr.h"
class CFX_DIBitmap;
+class CPDF_Dictionary;
+class CPDF_Document;
class CPDF_Form;
class CPDF_RenderContext;
+class CPDF_Stream;
class CPDF_Type3Char {
public:
- explicit CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm);
+ CPDF_Type3Char(CPDF_Document* pDocument,
+ CPDF_Dictionary* pPageResources,
+ CPDF_Stream* pFormStream);
~CPDF_Type3Char();
static float TextUnitToGlyphUnit(float fTextUnit);
static void TextUnitRectToGlyphUnitRect(CFX_FloatRect* pRect);
bool LoadBitmap(CPDF_RenderContext* pContext);
-
void InitializeFromStreamData(bool bColored, const float* pData);
void Transform(const CFX_Matrix& matrix);
void ResetForm();
+ void ParseContent();
+ bool HasPageObjects() const;
RetainPtr<CFX_DIBitmap> GetBitmap();
const RetainPtr<CFX_DIBitmap>& GetBitmap() const;
- const CPDF_Form* form() const { return m_pForm.get(); }
- CPDF_Form* form() { return m_pForm.get(); }
-
bool colored() const { return m_bColored; }
uint32_t width() const { return m_Width; }
const CFX_Matrix& matrix() const { return m_ImageMatrix; }
const FX_RECT& bbox() const { return m_BBox; }
private:
+ friend class CPDF_RenderStatus;
+
+ const CPDF_Form* form() const { return m_pForm.get(); }
+ CPDF_Form* form() { return m_pForm.get(); }
+
std::unique_ptr<CPDF_Form> m_pForm;
RetainPtr<CFX_DIBitmap> m_pBitmap;
bool m_bColored = false;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index df9bec7..85b9ea3 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -10,7 +10,6 @@
#include <utility>
#include "core/fpdfapi/font/cpdf_type3char.h"
-#include "core/fpdfapi/page/cpdf_form.h"
#include "core/fpdfapi/parser/cpdf_array.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
#include "core/fpdfapi/parser/cpdf_stream.h"
@@ -107,17 +106,16 @@
if (!pStream)
return nullptr;
- auto pNewChar =
- pdfium::MakeUnique<CPDF_Type3Char>(pdfium::MakeUnique<CPDF_Form>(
- m_pDocument.Get(),
- m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
- pStream, nullptr));
+ auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>(
+ m_pDocument.Get(),
+ m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
+ pStream);
// This can trigger recursion into this method. The content of |m_CacheMap|
// can change as a result. Thus after it returns, check the cache again for
// a cache hit.
m_CharLoadingDepth++;
- pNewChar->form()->ParseContent(nullptr, nullptr, pNewChar.get(), nullptr);
+ pNewChar->ParseContent();
m_CharLoadingDepth--;
it = m_CacheMap.find(charcode);
if (it != m_CacheMap.end())
@@ -126,7 +124,7 @@
pNewChar->Transform(m_FontMatrix);
m_CacheMap[charcode] = std::move(pNewChar);
CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get();
- if (pCachedChar->form()->GetPageObjectCount() == 0)
+ if (!pCachedChar->HasPageObjects())
pCachedChar->ResetForm();
return pCachedChar;
}