Encapsulate CPDF_FormObject members.

Also remove a conditional in the CPDF_Form ctor that cannot be true.

Change-Id: Icd00233969cea33e9c63d0d6a9d07226c2b173f2
Reviewed-on: https://pdfium-review.googlesource.com/17070
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_form.cpp b/core/fpdfapi/page/cpdf_form.cpp
index e433401..ae06cb2 100644
--- a/core/fpdfapi/page/cpdf_form.cpp
+++ b/core/fpdfapi/page/cpdf_form.cpp
@@ -17,8 +17,7 @@
                      CPDF_Dictionary* pPageResources,
                      CPDF_Stream* pFormStream,
                      CPDF_Dictionary* pParentResources)
-    : CPDF_PageObjectHolder(pDoc,
-                            pFormStream ? pFormStream->GetDict() : nullptr) {
+    : CPDF_PageObjectHolder(pDoc, pFormStream->GetDict()) {
   m_pFormStream = pFormStream;
   m_pResources = m_pFormDict->GetDictFor("Resources");
   m_pPageResources = pPageResources;
diff --git a/core/fpdfapi/page/cpdf_formobject.cpp b/core/fpdfapi/page/cpdf_formobject.cpp
index c0cdd3e..eca92ca 100644
--- a/core/fpdfapi/page/cpdf_formobject.cpp
+++ b/core/fpdfapi/page/cpdf_formobject.cpp
@@ -6,9 +6,13 @@
 
 #include "core/fpdfapi/page/cpdf_formobject.h"
 
+#include <utility>
+
 #include "core/fpdfapi/page/cpdf_form.h"
 
-CPDF_FormObject::CPDF_FormObject() {}
+CPDF_FormObject::CPDF_FormObject(std::unique_ptr<CPDF_Form> pForm,
+                                 const CFX_Matrix& matrix)
+    : m_pForm(std::move(pForm)), m_FormMatrix(matrix) {}
 
 CPDF_FormObject::~CPDF_FormObject() {}
 
diff --git a/core/fpdfapi/page/cpdf_formobject.h b/core/fpdfapi/page/cpdf_formobject.h
index b13cb5f..c723cc0 100644
--- a/core/fpdfapi/page/cpdf_formobject.h
+++ b/core/fpdfapi/page/cpdf_formobject.h
@@ -16,7 +16,7 @@
 
 class CPDF_FormObject : public CPDF_PageObject {
  public:
-  CPDF_FormObject();
+  CPDF_FormObject(std::unique_ptr<CPDF_Form> pForm, const CFX_Matrix& matrix);
   ~CPDF_FormObject() override;
 
   // CPDF_PageObject:
@@ -28,8 +28,10 @@
 
   void CalcBoundingBox();
   const CPDF_Form* form() const { return m_pForm.get(); }
+  const CFX_Matrix& form_matrix() const { return m_FormMatrix; }
 
-  std::unique_ptr<CPDF_Form> m_pForm;
+ private:
+  const std::unique_ptr<CPDF_Form> m_pForm;
   CFX_Matrix m_FormMatrix;
 };
 
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
index 5de9115..4e9da63 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.cpp
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
@@ -22,7 +22,10 @@
       m_pResources(nullptr),
       m_iTransparency(0),
       m_bBackgroundAlphaNeeded(false),
-      m_ParseState(CONTENT_NOT_PARSED) {}
+      m_ParseState(CONTENT_NOT_PARSED) {
+  // TODO(thestig): Check if |m_pFormDict| is never a nullptr and simplify
+  // callers that checks for that.
+}
 
 CPDF_PageObjectHolder::~CPDF_PageObjectHolder() {}
 
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h
index 1a8b1aa..f649ef7 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.h
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.h
@@ -71,7 +71,7 @@
   void Transform(const CFX_Matrix& matrix);
   CFX_FloatRect CalcBoundingBox() const;
 
-  UnownedPtr<CPDF_Dictionary> m_pFormDict;
+  const UnownedPtr<CPDF_Dictionary> m_pFormDict;
   UnownedPtr<CPDF_Stream> m_pFormStream;
   UnownedPtr<CPDF_Document> m_pDocument;
   UnownedPtr<CPDF_Dictionary> m_pPageResources;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 4ba1d2a..9e9c450 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -767,20 +767,21 @@
 }
 
 void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream) {
-  auto pFormObj = pdfium::MakeUnique<CPDF_FormObject>();
-  pFormObj->m_pForm = pdfium::MakeUnique<CPDF_Form>(
-      m_pDocument.Get(), m_pPageResources.Get(), pStream, m_pResources.Get());
-  pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
-  pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
   CPDF_AllStates status;
   status.m_GeneralState = m_pCurStates->m_GeneralState;
   status.m_GraphState = m_pCurStates->m_GraphState;
   status.m_ColorState = m_pCurStates->m_ColorState;
   status.m_TextState = m_pCurStates->m_TextState;
-  pFormObj->m_pForm->ParseContentWithParams(&status, nullptr, nullptr,
-                                            m_ParsedSet.Get());
+  auto form = pdfium::MakeUnique<CPDF_Form>(
+      m_pDocument.Get(), m_pPageResources.Get(), pStream, m_pResources.Get());
+  form->ParseContentWithParams(&status, nullptr, nullptr, m_ParsedSet.Get());
+
+  CFX_Matrix matrix = m_pCurStates->m_CTM;
+  matrix.Concat(m_mtContentToUser);
+
+  auto pFormObj = pdfium::MakeUnique<CPDF_FormObject>(std::move(form), matrix);
   if (!m_pObjectHolder->BackgroundAlphaNeeded() &&
-      pFormObj->m_pForm->BackgroundAlphaNeeded()) {
+      pFormObj->form()->BackgroundAlphaNeeded()) {
     m_pObjectHolder->SetBackgroundAlphaNeeded(true);
   }
   pFormObj->CalcBoundingBox();
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index df5a41d..5f9a899 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1237,11 +1237,11 @@
   matrix.Concat(*buffer.GetMatrix());
   GetScaledMatrix(matrix);
   CPDF_Dictionary* pFormResource = nullptr;
-  if (pObj->IsForm()) {
-    const CPDF_FormObject* pFormObj = pObj->AsForm();
-    if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
-      pFormResource = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources");
-    }
+  const CPDF_FormObject* pFormObj = pObj->AsForm();
+  if (pFormObj) {
+    const auto& pFormDict = pFormObj->form()->m_pFormDict;
+    if (pFormDict)
+      pFormResource = pFormDict->GetDictFor("Resources");
   }
   CPDF_RenderStatus status;
   status.Initialize(m_pContext.Get(), buffer.GetDevice(), buffer.GetMatrix(),
@@ -1256,17 +1256,16 @@
 #if defined _SKIA_SUPPORT_
   DebugVerifyDeviceIsPreMultiplied();
 #endif
-  CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDictFor("OC");
+  CPDF_Dictionary* pOC = pFormObj->form()->m_pFormDict->GetDictFor("OC");
   if (pOC && m_Options.GetOCContext() &&
       !m_Options.GetOCContext()->CheckOCGVisible(pOC)) {
     return true;
   }
-  CFX_Matrix matrix = pFormObj->m_FormMatrix;
+  CFX_Matrix matrix = pFormObj->form_matrix();
   matrix.Concat(*pObj2Device);
-  CPDF_Dictionary* pResources = nullptr;
-  if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
-    pResources = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources");
-  }
+  const auto& pFormDict = pFormObj->form()->m_pFormDict;
+  CPDF_Dictionary* pResources =
+      pFormDict ? pFormDict->GetDictFor("Resources") : nullptr;
   CPDF_RenderStatus status;
   status.Initialize(m_pContext.Get(), m_pDevice, nullptr, m_pStopObj, this,
                     pFormObj, &m_Options, m_iTransparency, m_bDropObjects,
@@ -1274,7 +1273,7 @@
   status.m_curBlend = m_curBlend;
   {
     CFX_RenderDevice::StateRestorer restorer(m_pDevice);
-    status.RenderObjectList(pFormObj->m_pForm.get(), &matrix);
+    status.RenderObjectList(pFormObj->form(), &matrix);
     m_bStopped = status.m_bStopped;
   }
 #if defined _SKIA_SUPPORT_
@@ -1487,14 +1486,14 @@
   float group_alpha = 1.0f;
   int iTransparency = m_iTransparency;
   bool bGroupTransparent = false;
-  if (pPageObj->IsForm()) {
-    const CPDF_FormObject* pFormObj = pPageObj->AsForm();
+  const CPDF_FormObject* pFormObj = pPageObj->AsForm();
+  if (pFormObj) {
     group_alpha = pFormObj->m_GeneralState.GetFillAlpha();
-    iTransparency = pFormObj->m_pForm->m_iTransparency;
+    iTransparency = pFormObj->form()->m_iTransparency;
     bGroupTransparent = !!(iTransparency & PDFTRANS_ISOLATED);
-    if (pFormObj->m_pForm->m_pFormDict) {
-      pFormResource = pFormObj->m_pForm->m_pFormDict->GetDictFor("Resources");
-    }
+    const auto& pFormDict = pFormObj->form()->m_pFormDict;
+    if (pFormDict)
+      pFormResource = pFormDict->GetDictFor("Resources");
   }
   bool bTextClip =
       (pPageObj->m_ClipPath.HasRef() && pPageObj->m_ClipPath.GetTextCount() &&
@@ -2269,10 +2268,9 @@
     if (!pPattern->colored())
       pStates = CloneObjStates(pPageObj, bStroke);
 
-    CPDF_Dictionary* pFormResource = nullptr;
-    if (pPattern->form()->m_pFormDict)
-      pFormResource = pPattern->form()->m_pFormDict->GetDictFor("Resources");
-
+    auto& pFormDict = pPattern->form()->m_pFormDict;
+    CPDF_Dictionary* pFormResource =
+        pFormDict ? pFormDict->GetDictFor("Resources") : nullptr;
     for (int col = min_col; col <= max_col; col++) {
       for (int row = min_row; row <= max_row; row++) {
         CFX_PointF original = mtPattern2Device.Transform(
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 82778b1..b4f879a 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -605,12 +605,12 @@
 
 void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj,
                                       const CFX_Matrix& formMatrix) {
-  CPDF_PageObjectList* pObjectList = pFormObj->m_pForm->GetPageObjectList();
+  const CPDF_PageObjectList* pObjectList =
+      pFormObj->form()->GetPageObjectList();
   if (pObjectList->empty())
     return;
 
-  CFX_Matrix curFormMatrix;
-  curFormMatrix = pFormObj->m_FormMatrix;
+  CFX_Matrix curFormMatrix = pFormObj->form_matrix();
   curFormMatrix.Concat(formMatrix);
 
   for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) {