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,