Remove knowledge of CPDF_ImageObject from fpdfapi/font layer. One less layering violation. Change-Id: I34443a5224d2df06374bccd3d6299deb0ee62748 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58010 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 44ca22b..e8d8bf5 100644 --- a/core/fpdfapi/font/cpdf_type3char.cpp +++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -8,7 +8,6 @@ #include <utility> -#include "core/fpdfapi/page/cpdf_imageobject.h" #include "core/fxge/dib/cfx_dibitmap.h" #include "core/fxge/fx_dib.h" #include "third_party/base/ptr_util.h" @@ -40,12 +39,11 @@ if (m_bColored) return false; - const CPDF_ImageObject* pImageObject = m_pForm->GetSoleImageOfForm(); - if (!pImageObject) + auto result = m_pForm->GetBitmapAndMatrixFromSoleImageOfForm(); + if (!result.has_value()) return false; - m_ImageMatrix = pImageObject->matrix(); - m_pBitmap = pImageObject->GetIndependentBitmap(); + std::tie(m_pBitmap, m_ImageMatrix) = result.value(); m_pForm.reset(); return true; }
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h index 25b3838..acf6190 100644 --- a/core/fpdfapi/font/cpdf_type3char.h +++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -8,13 +8,14 @@ #define CORE_FPDFAPI_FONT_CPDF_TYPE3CHAR_H_ #include <memory> +#include <utility> #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_system.h" #include "core/fxcrt/retain_ptr.h" +#include "third_party/base/optional.h" class CFX_DIBitmap; -class CPDF_ImageObject; class CPDF_Type3Char { public: @@ -24,8 +25,9 @@ virtual void ParseContentForType3Char(CPDF_Type3Char* pChar) = 0; virtual bool HasPageObjects() const = 0; - virtual const CPDF_ImageObject* GetSoleImageOfForm() const = 0; virtual CFX_FloatRect CalcBoundingBox() const = 0; + virtual Optional<std::pair<RetainPtr<CFX_DIBitmap>, CFX_Matrix>> + GetBitmapAndMatrixFromSoleImageOfForm() const = 0; }; CPDF_Type3Char();
diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp index 3033f1c..5b3bf73 100644 --- a/core/fpdfapi/page/cpdf_form.cpp +++ b/core/fpdfapi/page/cpdf_form.cpp
@@ -14,6 +14,7 @@ #include "core/fpdfapi/page/cpdf_pageobjectholder.h" #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxge/dib/cfx_dibitmap.h" #include "third_party/base/ptr_util.h" // static @@ -109,6 +110,14 @@ return GetPageObjectCount() != 0; } -const CPDF_ImageObject* CPDF_Form::GetSoleImageOfForm() const { - return GetPageObjectCount() == 1 ? (*begin())->AsImage() : nullptr; +Optional<std::pair<RetainPtr<CFX_DIBitmap>, CFX_Matrix>> +CPDF_Form::GetBitmapAndMatrixFromSoleImageOfForm() const { + if (GetPageObjectCount() != 1) + return {}; + + CPDF_ImageObject* pImageObject = (*begin())->AsImage(); + if (!pImageObject) + return {}; + + return {{pImageObject->GetIndependentBitmap(), pImageObject->matrix()}}; }
diff --git a/core/fpdfapi/page/cpdf_form.h b/core/fpdfapi/page/cpdf_form.h index 7b94dde..5c104b2 100644 --- a/core/fpdfapi/page/cpdf_form.h +++ b/core/fpdfapi/page/cpdf_form.h
@@ -9,6 +9,7 @@ #include <memory> #include <set> +#include <utility> #include "core/fpdfapi/font/cpdf_type3char.h" #include "core/fpdfapi/page/cpdf_pageobjectholder.h" @@ -41,8 +42,9 @@ // CPDF_Type3Char::FormIface: void ParseContentForType3Char(CPDF_Type3Char* pType3Char) override; bool HasPageObjects() const override; - const CPDF_ImageObject* GetSoleImageOfForm() const override; CFX_FloatRect CalcBoundingBox() const override; + Optional<std::pair<RetainPtr<CFX_DIBitmap>, CFX_Matrix>> + GetBitmapAndMatrixFromSoleImageOfForm() const override; void ParseContent(); void ParseContent(const CPDF_AllStates* pGraphicStates,