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