More direct form management in CPDF_Type3Font.
Next step towards getting CPDF_Type3Char out of form lifetime
management. Pass form in Transform() method as a step to
getting rid of |CPDF_Type3Char::m_pForm| next.
- Remove unused CPDF_RenderStatus argument
Change-Id: I88f56146b4856c4e86986ad0bfc819a55b6dab42
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/57670
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_type3char.cpp b/core/fpdfapi/font/cpdf_type3char.cpp
index c008d5b..1e3ff65 100644
--- a/core/fpdfapi/font/cpdf_type3char.cpp
+++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -22,8 +22,7 @@
} // namespace
-CPDF_Type3Char::CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm)
- : m_pForm(std::move(pForm)) {}
+CPDF_Type3Char::CPDF_Type3Char() = default;
CPDF_Type3Char::~CPDF_Type3Char() = default;
@@ -37,7 +36,7 @@
pRect->Scale(kTextUnitInGlyphUnit);
}
-bool CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext) {
+bool CPDF_Type3Char::LoadBitmap() {
if (m_pBitmap || !m_pForm)
return true;
@@ -78,12 +77,12 @@
m_BBox.top = FXSYS_round(TextUnitToGlyphUnit(pData[5]));
}
-void CPDF_Type3Char::Transform(const CFX_Matrix& matrix) {
+void CPDF_Type3Char::Transform(CPDF_Form* pForm, const CFX_Matrix& matrix) {
m_Width = m_Width * matrix.GetXUnit() + 0.5f;
CFX_FloatRect char_rect;
if (m_BBox.right <= m_BBox.left || m_BBox.bottom >= m_BBox.top) {
- char_rect = form()->CalcBoundingBox();
+ char_rect = pForm->CalcBoundingBox();
TextUnitRectToGlyphUnitRect(&char_rect);
} else {
char_rect = CFX_FloatRect(m_BBox);
@@ -92,12 +91,8 @@
m_BBox = matrix.TransformRect(char_rect).ToRoundedFxRect();
}
-void CPDF_Type3Char::ResetForm() {
- m_pForm.reset();
-}
-
-bool CPDF_Type3Char::HasPageObjects() const {
- return !!m_pForm->GetPageObjectCount();
+void CPDF_Type3Char::SetForm(std::unique_ptr<CPDF_Form> pForm) {
+ m_pForm = std::move(pForm);
}
RetainPtr<CFX_DIBitmap> CPDF_Type3Char::GetBitmap() {
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h
index c52f5e7..784332d 100644
--- a/core/fpdfapi/font/cpdf_type3char.h
+++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -15,20 +15,18 @@
class CFX_DIBitmap;
class CPDF_Form;
-class CPDF_RenderContext;
class CPDF_Type3Char {
public:
- explicit CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm);
+ CPDF_Type3Char();
~CPDF_Type3Char();
static float TextUnitToGlyphUnit(float fTextUnit);
static void TextUnitRectToGlyphUnitRect(CFX_FloatRect* pRect);
- bool LoadBitmap(CPDF_RenderContext* pContext);
+ bool LoadBitmap();
void InitializeFromStreamData(bool bColored, const float* pData);
- void Transform(const CFX_Matrix& matrix);
- bool HasPageObjects() const;
+ void Transform(CPDF_Form* pForm, const CFX_Matrix& matrix);
RetainPtr<CFX_DIBitmap> GetBitmap();
const RetainPtr<CFX_DIBitmap>& GetBitmap() const;
@@ -40,7 +38,7 @@
const CPDF_Form* form() const { return m_pForm.get(); }
CPDF_Form* form() { return m_pForm.get(); }
- void ResetForm();
+ void SetForm(std::unique_ptr<CPDF_Form> pForm);
private:
std::unique_ptr<CPDF_Form> m_pForm;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index 64343ed..97d473e 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -108,13 +108,12 @@
if (!pStream)
return nullptr;
- auto form = pdfium::MakeUnique<CPDF_Form>(
+ auto pForm = pdfium::MakeUnique<CPDF_Form>(
m_pDocument.Get(),
m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
pStream);
- CPDF_Form* pForm = form.get();
- auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>(std::move(form));
+ auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>();
// 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
@@ -128,11 +127,12 @@
if (it != m_CacheMap.end())
return it->second.get();
- pNewChar->Transform(m_FontMatrix);
+ pNewChar->Transform(pForm.get(), m_FontMatrix);
+ if (pForm->GetPageObjectCount() != 0)
+ pNewChar->SetForm(std::move(pForm));
+
+ CPDF_Type3Char* pCachedChar = pNewChar.get();
m_CacheMap[charcode] = std::move(pNewChar);
- CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get();
- if (!pCachedChar->HasPageObjects())
- pCachedChar->ResetForm();
return pCachedChar;
}
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 416ed1e..95ad758 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1825,7 +1825,7 @@
matrix.e += iChar > 0 ? textobj->GetCharPositions()[iChar - 1] : 0;
matrix.Concat(text_matrix);
matrix.Concat(mtObj2Device);
- if (!pType3Char->LoadBitmap(m_pContext.Get())) {
+ if (!pType3Char->LoadBitmap()) {
if (!glyphs.empty()) {
for (size_t i = 0; i < iChar; ++i) {
const TextGlyphPos& glyph = glyphs[i];