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