Introduce CPDF_Type3Char::FormIface to avoid some layering issues Allows the removal of some otherwise circular includes. Change-Id: I0a4102d0c4461422ae2ff8935acb728c038e1d8d Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/57811 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 96c9b30..44ca22b 100644 --- a/core/fpdfapi/font/cpdf_type3char.cpp +++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -8,10 +8,7 @@ #include <utility> -#include "core/fpdfapi/page/cpdf_form.h" -#include "core/fpdfapi/page/cpdf_image.h" #include "core/fpdfapi/page/cpdf_imageobject.h" -#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" @@ -63,7 +60,7 @@ m_BBox.top = FXSYS_round(TextUnitToGlyphUnit(pData[5])); } -void CPDF_Type3Char::Transform(CPDF_Form* pForm, const CFX_Matrix& matrix) { +void CPDF_Type3Char::Transform(FormIface* pForm, const CFX_Matrix& matrix) { m_Width = m_Width * matrix.GetXUnit() + 0.5f; CFX_FloatRect char_rect; @@ -77,7 +74,7 @@ m_BBox = matrix.TransformRect(char_rect).ToRoundedFxRect(); } -void CPDF_Type3Char::SetForm(std::unique_ptr<CPDF_Form> pForm) { +void CPDF_Type3Char::SetForm(std::unique_ptr<FormIface> pForm) { m_pForm = std::move(pForm); }
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h index bcf94da..a7d855e 100644 --- a/core/fpdfapi/font/cpdf_type3char.h +++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -14,10 +14,19 @@ #include "core/fxcrt/retain_ptr.h" class CFX_DIBitmap; -class CPDF_Form; +class CPDF_ImageObject; class CPDF_Type3Char { public: + class FormIface { + public: + virtual ~FormIface() {} + + virtual void ParseContentForType3Char(CPDF_Type3Char* pChar) = 0; + virtual const CPDF_ImageObject* GetSoleImageOfForm() const = 0; + virtual CFX_FloatRect CalcBoundingBox() const = 0; + }; + CPDF_Type3Char(); ~CPDF_Type3Char(); @@ -26,7 +35,7 @@ bool LoadBitmapFromSoleImageOfForm(); void InitializeFromStreamData(bool bColored, const float* pData); - void Transform(CPDF_Form* pForm, const CFX_Matrix& matrix); + void Transform(FormIface* pForm, const CFX_Matrix& matrix); RetainPtr<CFX_DIBitmap> GetBitmap(); const RetainPtr<CFX_DIBitmap>& GetBitmap() const; @@ -36,12 +45,11 @@ const CFX_Matrix& matrix() const { return m_ImageMatrix; } const FX_RECT& bbox() const { return m_BBox; } - const CPDF_Form* form() const { return m_pForm.get(); } - CPDF_Form* form() { return m_pForm.get(); } - void SetForm(std::unique_ptr<CPDF_Form> pForm); + const FormIface* form() const { return m_pForm.get(); } + void SetForm(std::unique_ptr<FormIface> pForm); private: - std::unique_ptr<CPDF_Form> m_pForm; + std::unique_ptr<FormIface> m_pForm; RetainPtr<CFX_DIBitmap> m_pBitmap; bool m_bColored = false; uint32_t m_Width = 0;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp index 2c9d815..5787dc9 100644 --- a/core/fpdfapi/font/cpdf_type3font.cpp +++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -103,8 +103,10 @@ if (!name) return nullptr; - CPDF_Stream* pStream = - ToStream(m_pCharProcs ? m_pCharProcs->GetDirectObjectFor(name) : nullptr); + if (!m_pCharProcs) + return nullptr; + + CPDF_Stream* pStream = ToStream(m_pCharProcs->GetDirectObjectFor(name)); if (!pStream) return nullptr;
diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index 68f92d5..f9b2e2e 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h
@@ -10,6 +10,7 @@ #include <memory> #include <set> +#include "core/fpdfapi/font/cpdf_type3char.h" #include "core/fpdfapi/page/cpdf_pageobjectholder.h" class CFX_Matrix; @@ -20,7 +21,8 @@ class CPDF_Stream; class CPDF_Type3Char; -class CPDF_Form final : public CPDF_PageObjectHolder { +class CPDF_Form final : public CPDF_PageObjectHolder, + public CPDF_Type3Char::FormIface { public: // Helper method to choose the first non-null resources dictionary. static CPDF_Dictionary* ChooseResourcesDict(CPDF_Dictionary* pResources, @@ -36,18 +38,18 @@ CPDF_Dictionary* pParentResources); ~CPDF_Form() override; + // CPDF_Type3Char::FormIface: + void ParseContentForType3Char(CPDF_Type3Char* pType3Char) override; + const CPDF_ImageObject* GetSoleImageOfForm() const override; + CFX_FloatRect CalcBoundingBox() const override; + void ParseContent(); void ParseContent(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix, std::set<const uint8_t*>* pParsedSet); - void ParseContentForType3Char(CPDF_Type3Char* pType3Char); - CFX_FloatRect CalcBoundingBox() const; const CPDF_Stream* GetStream() const; - // Fast path helper for avoiding a full rendering of form. - const CPDF_ImageObject* GetSoleImageOfForm() const; - private: void ParseContentInternal(const CPDF_AllStates* pGraphicStates, const CFX_Matrix* pParentMatrix,
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index b32c995..ef23876 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1850,13 +1850,14 @@ options.GetOptions().bForceDownsample = false; const CPDF_Dictionary* pFormResource = nullptr; - if (pType3Char->form() && pType3Char->form()->GetDict()) { - pFormResource = pType3Char->form()->GetDict()->GetDictFor("Resources"); - } + auto* pForm = static_cast<const CPDF_Form*>(pType3Char->form()); + if (pForm->GetDict()) + pFormResource = pForm->GetDict()->GetDictFor("Resources"); + if (fill_alpha == 255) { CPDF_RenderStatus status(m_pContext.Get(), m_pDevice); status.SetOptions(options); - status.SetTransparency(pType3Char->form()->GetTransparency()); + status.SetTransparency(pForm->GetTransparency()); status.SetType3Char(pType3Char); status.SetFillColor(fill_argb); status.SetDropObjects(m_bDropObjects); @@ -1866,11 +1867,10 @@ status.m_Type3FontCache.push_back(pType3Font); CFX_RenderDevice::StateRestorer restorer(m_pDevice); - status.RenderObjectList(pType3Char->form(), matrix); + status.RenderObjectList(pForm, matrix); } else { FX_RECT rect = - matrix.TransformRect(pType3Char->form()->CalcBoundingBox()) - .GetOuterRect(); + matrix.TransformRect(pForm->CalcBoundingBox()).GetOuterRect(); if (!rect.Valid()) continue; @@ -1882,7 +1882,7 @@ bitmap_device.GetBitmap()->Clear(0); CPDF_RenderStatus status(m_pContext.Get(), &bitmap_device); status.SetOptions(options); - status.SetTransparency(pType3Char->form()->GetTransparency()); + status.SetTransparency(pForm->GetTransparency()); status.SetType3Char(pType3Char); status.SetFillColor(fill_argb); status.SetDropObjects(m_bDropObjects); @@ -1891,7 +1891,7 @@ status.m_Type3FontCache = m_Type3FontCache; status.m_Type3FontCache.push_back(pType3Font); matrix.Translate(-rect.left, -rect.top); - status.RenderObjectList(pType3Char->form(), matrix); + status.RenderObjectList(pForm, matrix); m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); } } else if (pType3Char->GetBitmap()) {