Prevent CPDF_Type3Font from knowing that CPDF_Type3Char has a form.

Small bit of information hiding. One less "illegal" include.
Note that CPDF_RenderStatus still has to know about this for
the moment.

Change-Id: I4de6d610102ba5897bb840465356a5f1bfafb835
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55715
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_type3char.cpp b/core/fpdfapi/font/cpdf_type3char.cpp
index 77e5bc6..5e04065 100644
--- a/core/fpdfapi/font/cpdf_type3char.cpp
+++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -14,6 +14,7 @@
 #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"
 
 namespace {
 
@@ -21,10 +22,14 @@
 
 }  // namespace
 
-CPDF_Type3Char::CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm)
-    : m_pForm(std::move(pForm)) {}
+CPDF_Type3Char::CPDF_Type3Char(CPDF_Document* pDocument,
+                               CPDF_Dictionary* pPageResources,
+                               CPDF_Stream* pFormStream)
+    : m_pForm(pdfium::MakeUnique<CPDF_Form>(pDocument,
+                                            pPageResources,
+                                            pFormStream)) {}
 
-CPDF_Type3Char::~CPDF_Type3Char() {}
+CPDF_Type3Char::~CPDF_Type3Char() = default;
 
 // static
 float CPDF_Type3Char::TextUnitToGlyphUnit(float fTextUnit) {
@@ -95,6 +100,14 @@
   m_pForm.reset();
 }
 
+void CPDF_Type3Char::ParseContent() {
+  m_pForm->ParseContent(nullptr, nullptr, this, nullptr);
+}
+
+bool CPDF_Type3Char::HasPageObjects() const {
+  return !!m_pForm->GetPageObjectCount();
+}
+
 RetainPtr<CFX_DIBitmap> CPDF_Type3Char::GetBitmap() {
   return m_pBitmap;
 }
diff --git a/core/fpdfapi/font/cpdf_type3char.h b/core/fpdfapi/font/cpdf_type3char.h
index 28baffe..9edd6cd 100644
--- a/core/fpdfapi/font/cpdf_type3char.h
+++ b/core/fpdfapi/font/cpdf_type3char.h
@@ -14,35 +14,43 @@
 #include "core/fxcrt/retain_ptr.h"
 
 class CFX_DIBitmap;
+class CPDF_Dictionary;
+class CPDF_Document;
 class CPDF_Form;
 class CPDF_RenderContext;
+class CPDF_Stream;
 
 class CPDF_Type3Char {
  public:
-  explicit CPDF_Type3Char(std::unique_ptr<CPDF_Form> pForm);
+  CPDF_Type3Char(CPDF_Document* pDocument,
+                 CPDF_Dictionary* pPageResources,
+                 CPDF_Stream* pFormStream);
   ~CPDF_Type3Char();
 
   static float TextUnitToGlyphUnit(float fTextUnit);
   static void TextUnitRectToGlyphUnitRect(CFX_FloatRect* pRect);
 
   bool LoadBitmap(CPDF_RenderContext* pContext);
-
   void InitializeFromStreamData(bool bColored, const float* pData);
   void Transform(const CFX_Matrix& matrix);
   void ResetForm();
+  void ParseContent();
+  bool HasPageObjects() const;
 
   RetainPtr<CFX_DIBitmap> GetBitmap();
   const RetainPtr<CFX_DIBitmap>& GetBitmap() const;
 
-  const CPDF_Form* form() const { return m_pForm.get(); }
-  CPDF_Form* form() { return m_pForm.get(); }
-
   bool colored() const { return m_bColored; }
   uint32_t width() const { return m_Width; }
   const CFX_Matrix& matrix() const { return m_ImageMatrix; }
   const FX_RECT& bbox() const { return m_BBox; }
 
  private:
+  friend class CPDF_RenderStatus;
+
+  const CPDF_Form* form() const { return m_pForm.get(); }
+  CPDF_Form* form() { return m_pForm.get(); }
+
   std::unique_ptr<CPDF_Form> m_pForm;
   RetainPtr<CFX_DIBitmap> m_pBitmap;
   bool m_bColored = false;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index df9bec7..85b9ea3 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -10,7 +10,6 @@
 #include <utility>
 
 #include "core/fpdfapi/font/cpdf_type3char.h"
-#include "core/fpdfapi/page/cpdf_form.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_stream.h"
@@ -107,17 +106,16 @@
   if (!pStream)
     return nullptr;
 
-  auto pNewChar =
-      pdfium::MakeUnique<CPDF_Type3Char>(pdfium::MakeUnique<CPDF_Form>(
-          m_pDocument.Get(),
-          m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
-          pStream, nullptr));
+  auto pNewChar = pdfium::MakeUnique<CPDF_Type3Char>(
+      m_pDocument.Get(),
+      m_pFontResources ? m_pFontResources.Get() : m_pPageResources.Get(),
+      pStream);
 
   // 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
   // a cache hit.
   m_CharLoadingDepth++;
-  pNewChar->form()->ParseContent(nullptr, nullptr, pNewChar.get(), nullptr);
+  pNewChar->ParseContent();
   m_CharLoadingDepth--;
   it = m_CacheMap.find(charcode);
   if (it != m_CacheMap.end())
@@ -126,7 +124,7 @@
   pNewChar->Transform(m_FontMatrix);
   m_CacheMap[charcode] = std::move(pNewChar);
   CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get();
-  if (pCachedChar->form()->GetPageObjectCount() == 0)
+  if (!pCachedChar->HasPageObjects())
     pCachedChar->ResetForm();
   return pCachedChar;
 }