Move core/include/fpdfapi/fpdf_page.h to correct locations.

This CL splits the fpdf_page.h header into the individual classes and moves
them to the correct core/fpdfapi locations.

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/1805663002 .
diff --git a/BUILD.gn b/BUILD.gn
index a4ea471..4b5edbb 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -301,18 +301,25 @@
     "core/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp",
     "core/fpdfapi/fpdf_cmaps/cmap_int.h",
     "core/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp",
+    "core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp",
     "core/fpdfapi/fpdf_edit/editint.h",
-    "core/fpdfapi/fpdf_edit/fpdf_edit_content.cpp",
     "core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp",
     "core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp",
     "core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp",
     "core/fpdfapi/fpdf_edit/include/cpdf_creator.h",
+    "core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h",
     "core/fpdfapi/fpdf_font/font_int.h",
     "core/fpdfapi/fpdf_font/fpdf_font.cpp",
     "core/fpdfapi/fpdf_font/fpdf_font_charset.cpp",
     "core/fpdfapi/fpdf_font/fpdf_font_cid.cpp",
     "core/fpdfapi/fpdf_font/ttgsubtable.cpp",
     "core/fpdfapi/fpdf_font/ttgsubtable.h",
+    "core/fpdfapi/fpdf_page/cpdf_form.cpp",
+    "core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp",
+    "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp",
+    "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h",
+    "core/fpdfapi/fpdf_page/cpdf_parseoptions.cpp",
+    "core/fpdfapi/fpdf_page/cpdf_parseoptions.h",
     "core/fpdfapi/fpdf_page/fpdf_page.cpp",
     "core/fpdfapi/fpdf_page/fpdf_page_colors.cpp",
     "core/fpdfapi/fpdf_page/fpdf_page_doc.cpp",
@@ -323,6 +330,9 @@
     "core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp",
     "core/fpdfapi/fpdf_page/fpdf_page_path.cpp",
     "core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp",
+    "core/fpdfapi/fpdf_page/include/cpdf_form.h",
+    "core/fpdfapi/fpdf_page/include/cpdf_page.h",
+    "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h",
     "core/fpdfapi/fpdf_page/pageint.h",
     "core/fpdfapi/fpdf_parser/cfdf_document.cpp",
     "core/fpdfapi/fpdf_parser/cpdf_array.cpp",
@@ -390,7 +400,6 @@
     "core/fpdfapi/include/cpdf_modulemgr.h",
     "core/fpdfapi/ipdf_pagemodule.h",
     "core/fpdfapi/ipdf_rendermodule.h",
-    "core/include/fpdfapi/fpdf_page.h",
     "core/include/fpdfapi/fpdf_pageobj.h",
     "core/include/fpdfapi/fpdf_resource.h",
   ]
diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
similarity index 96%
rename from core/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
rename to core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
index 6010a04..a09aa1f 100644
--- a/core/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
+++ b/core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp
@@ -1,16 +1,18 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
+// Copyright 2016 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h"
+
 #include "core/fpdfapi/fpdf_edit/include/cpdf_creator.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& ar, CFX_Matrix& matrix) {
   ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " "
diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
index 121498c..46d6d1f 100644
--- a/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
+++ b/core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -13,7 +13,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
 #include "core/fpdfapi/ipdf_rendermodule.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 CPDF_Document::CPDF_Document() : CPDF_IndirectObjectHolder(NULL) {
   m_pRootDict = NULL;
diff --git a/core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
index fec596c..50e4f79 100644
--- a/core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
+++ b/core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -4,6 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
@@ -13,7 +14,6 @@
 #include "core/fpdfapi/fpdf_render/cpdf_pagerendercache.h"
 #include "core/fpdfapi/fpdf_render/render_int.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcodec/fx_codec.h"
 
 CPDF_Dictionary* CPDF_Image::InitJPEG(uint8_t* pData, FX_DWORD size) {
diff --git a/core/fpdfapi/fpdf_edit/include/cpdf_creator.h b/core/fpdfapi/fpdf_edit/include/cpdf_creator.h
index 5b5671b..7be92f9 100644
--- a/core/fpdfapi/fpdf_edit/include/cpdf_creator.h
+++ b/core/fpdfapi/fpdf_edit/include/cpdf_creator.h
@@ -7,7 +7,6 @@
 #ifndef CORE_FPDFAPI_FPDF_EDIT_INCLUDE_CPDF_CREATOR_H_
 #define CORE_FPDFAPI_FPDF_EDIT_INCLUDE_CPDF_CREATOR_H_
 
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 
 class CPDF_Parser;
diff --git a/core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h b/core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h
new file mode 100644
index 0000000..8aea084
--- /dev/null
+++ b/core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h
@@ -0,0 +1,42 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_EDIT_INCLUDE_CPDF_PAGECONTENTGENERATOR_H_
+#define CORE_FPDFAPI_FPDF_EDIT_INCLUDE_CPDF_PAGECONTENTGENERATOR_H_
+
+#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class CPDF_Object;
+class CPDF_Page;
+class CPDF_PageObject;
+class CPDF_ImageObject;
+
+class CPDF_PageContentGenerator {
+ public:
+  explicit CPDF_PageContentGenerator(CPDF_Page* pPage);
+
+  FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
+  void GenerateContent();
+  void TransformContent(CFX_Matrix& matrix);
+
+ private:
+  void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
+  void ProcessForm(CFX_ByteTextBuf& buf,
+                   const uint8_t* data,
+                   FX_DWORD size,
+                   CFX_Matrix& matrix);
+  CFX_ByteString RealizeResource(CPDF_Object* pResourceObj,
+                                 const FX_CHAR* szType);
+
+  CPDF_Page* m_pPage;
+  CPDF_Document* m_pDocument;
+  CFX_ArrayTemplate<CPDF_PageObject*> m_pageObjects;
+};
+
+#endif  // CORE_FPDFAPI_FPDF_EDIT_INCLUDE_CPDF_PAGECONTENTGENERATOR_H_
diff --git a/core/fpdfapi/fpdf_font/fpdf_font.cpp b/core/fpdfapi/fpdf_font/fpdf_font.cpp
index b1db0eb..5e9b0ed 100644
--- a/core/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -6,6 +6,7 @@
 
 #include "core/fpdfapi/fpdf_font/font_int.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
@@ -14,7 +15,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
 #include "core/include/fxcrt/fx_ext.h"
diff --git a/core/fpdfapi/fpdf_font/fpdf_font_charset.cpp b/core/fpdfapi/fpdf_font/fpdf_font_charset.cpp
index 40ec221..642efd6 100644
--- a/core/fpdfapi/fpdf_font/fpdf_font_charset.cpp
+++ b/core/fpdfapi/fpdf_font/fpdf_font_charset.cpp
@@ -5,7 +5,6 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
 #include "core/include/fxge/fx_freetype.h"
 
diff --git a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index 321fc59..1295c62 100644
--- a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -12,7 +12,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
 #include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxge/fx_freetype.h"
diff --git a/core/fpdfapi/fpdf_page/cpdf_form.cpp b/core/fpdfapi/fpdf_page/cpdf_form.cpp
new file mode 100644
index 0000000..a116039
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_form.cpp
@@ -0,0 +1,65 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
+#include "core/fpdfapi/fpdf_page/pageint.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
+
+CPDF_Form::CPDF_Form(CPDF_Document* pDoc,
+                     CPDF_Dictionary* pPageResources,
+                     CPDF_Stream* pFormStream,
+                     CPDF_Dictionary* pParentResources) {
+  m_pDocument = pDoc;
+  m_pFormStream = pFormStream;
+  m_pFormDict = pFormStream ? pFormStream->GetDict() : NULL;
+  m_pResources = m_pFormDict->GetDictBy("Resources");
+  m_pPageResources = pPageResources;
+  if (!m_pResources) {
+    m_pResources = pParentResources;
+  }
+  if (!m_pResources) {
+    m_pResources = pPageResources;
+  }
+  m_Transparency = 0;
+  LoadTransInfo();
+}
+
+CPDF_Form::~CPDF_Form() {}
+
+void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates,
+                           CFX_Matrix* pParentMatrix,
+                           CPDF_Type3Char* pType3Char,
+                           CPDF_ParseOptions* pOptions,
+                           int level) {
+  if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) {
+    return;
+  }
+  m_pParser.reset(new CPDF_ContentParser);
+  m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions,
+                   level);
+  m_ParseState = CONTENT_PARSING;
+}
+
+void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates,
+                             CFX_Matrix* pParentMatrix,
+                             CPDF_Type3Char* pType3Char,
+                             CPDF_ParseOptions* pOptions,
+                             int level) {
+  StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
+  ContinueParse(NULL);
+}
+
+CPDF_Form* CPDF_Form::Clone() const {
+  CPDF_Form* pCloneForm =
+      new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);
+  for (const auto& pObj : m_PageObjectList)
+    pCloneForm->m_PageObjectList.emplace_back(pObj->Clone());
+
+  return pCloneForm;
+}
diff --git a/core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp b/core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp
new file mode 100644
index 0000000..a1392f6
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp
@@ -0,0 +1,73 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
+
+#include "core/fpdfapi/fpdf_page/pageint.h"
+
+CPDF_PageObjectHolder::CPDF_PageObjectHolder()
+    : m_pFormDict(nullptr),
+      m_pFormStream(nullptr),
+      m_pDocument(nullptr),
+      m_pPageResources(nullptr),
+      m_pResources(nullptr),
+      m_Transparency(0),
+      m_bBackgroundAlphaNeeded(FALSE),
+      m_bHasImageMask(FALSE),
+      m_ParseState(CONTENT_NOT_PARSED) {}
+
+void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) {
+  if (!m_pParser) {
+    return;
+  }
+  m_pParser->Continue(pPause);
+  if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {
+    m_ParseState = CONTENT_PARSED;
+    m_pParser.reset();
+  }
+}
+
+void CPDF_PageObjectHolder::Transform(const CFX_Matrix& matrix) {
+  for (auto& pObj : m_PageObjectList)
+    pObj->Transform(matrix);
+}
+
+CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const {
+  if (m_PageObjectList.empty())
+    return CFX_FloatRect(0, 0, 0, 0);
+
+  FX_FLOAT left = 1000000.0f;
+  FX_FLOAT right = -1000000.0f;
+  FX_FLOAT bottom = 1000000.0f;
+  FX_FLOAT top = -1000000.0f;
+  for (const auto& pObj : m_PageObjectList) {
+    left = std::min(left, pObj->m_Left);
+    right = std::max(right, pObj->m_Right);
+    bottom = std::min(bottom, pObj->m_Bottom);
+    top = std::max(top, pObj->m_Top);
+  }
+  return CFX_FloatRect(left, bottom, right, top);
+}
+
+void CPDF_PageObjectHolder::LoadTransInfo() {
+  if (!m_pFormDict) {
+    return;
+  }
+  CPDF_Dictionary* pGroup = m_pFormDict->GetDictBy("Group");
+  if (!pGroup) {
+    return;
+  }
+  if (pGroup->GetStringBy("S") != "Transparency") {
+    return;
+  }
+  m_Transparency |= PDFTRANS_GROUP;
+  if (pGroup->GetIntegerBy("I")) {
+    m_Transparency |= PDFTRANS_ISOLATED;
+  }
+  if (pGroup->GetIntegerBy("K")) {
+    m_Transparency |= PDFTRANS_KNOCKOUT;
+  }
+}
diff --git a/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp b/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp
new file mode 100644
index 0000000..36fb672
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp
@@ -0,0 +1,17 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h"
+
+#include "core/fpdfapi/fpdf_page/pageint.h"
+#include "core/include/fpdfapi/fpdf_pageobj.h"
+#include "third_party/base/stl_util.h"
+
+CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) {
+  if (index < 0 || index >= pdfium::CollectionSize<int>(*this))
+    return nullptr;
+  return (*this)[index].get();
+}
diff --git a/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h b/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h
new file mode 100644
index 0000000..360bb26
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h
@@ -0,0 +1,21 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_PAGE_CPDF_PAGEOBJECTLIST_H_
+#define CORE_FPDFAPI_FPDF_PAGE_CPDF_PAGEOBJECTLIST_H_
+
+#include <deque>
+#include <memory>
+
+class CPDF_PageObject;
+
+class CPDF_PageObjectList
+    : public std::deque<std::unique_ptr<CPDF_PageObject>> {
+ public:
+  CPDF_PageObject* GetPageObjectByIndex(int index);
+};
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_CPDF_PAGEOBJECTLIST_H_
diff --git a/core/fpdfapi/fpdf_page/cpdf_parseoptions.cpp b/core/fpdfapi/fpdf_page/cpdf_parseoptions.cpp
new file mode 100644
index 0000000..d22b6f1
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_parseoptions.cpp
@@ -0,0 +1,12 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+
+CPDF_ParseOptions::CPDF_ParseOptions()
+    : m_bTextOnly(FALSE),
+      m_bMarkedContent(TRUE),
+      m_bSeparateForm(TRUE),
+      m_bDecodeInlineImage(FALSE) {}
diff --git a/core/fpdfapi/fpdf_page/cpdf_parseoptions.h b/core/fpdfapi/fpdf_page/cpdf_parseoptions.h
new file mode 100644
index 0000000..cd1bb69
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_parseoptions.h
@@ -0,0 +1,22 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_PAGE_CPDF_PARSEOPTIONS_H_
+#define CORE_FPDFAPI_FPDF_PAGE_CPDF_PARSEOPTIONS_H_
+
+#include "core/include/fxcrt/fx_system.h"
+
+class CPDF_ParseOptions {
+ public:
+  CPDF_ParseOptions();
+
+  FX_BOOL m_bTextOnly;
+  FX_BOOL m_bMarkedContent;
+  FX_BOOL m_bSeparateForm;
+  FX_BOOL m_bDecodeInlineImage;
+};
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_CPDF_PARSEOPTIONS_H_
diff --git a/core/fpdfapi/fpdf_page/fpdf_page.cpp b/core/fpdfapi/fpdf_page/fpdf_page.cpp
index 2cec092..ad54e32 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page.cpp
@@ -8,12 +8,13 @@
 
 #include <algorithm>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
 #include "core/fpdfapi/ipdf_rendermodule.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "third_party/base/stl_util.h"
 
 CPDF_PageObject::CPDF_PageObject() {}
@@ -463,76 +464,6 @@
   m_Top = form_rect.top;
 }
 
-CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) {
-  if (index < 0 || index >= pdfium::CollectionSize<int>(*this))
-    return nullptr;
-  return (*this)[index].get();
-}
-
-CPDF_PageObjectHolder::CPDF_PageObjectHolder()
-    : m_pFormDict(nullptr),
-      m_pFormStream(nullptr),
-      m_pDocument(nullptr),
-      m_pPageResources(nullptr),
-      m_pResources(nullptr),
-      m_Transparency(0),
-      m_bBackgroundAlphaNeeded(FALSE),
-      m_bHasImageMask(FALSE),
-      m_ParseState(CONTENT_NOT_PARSED) {}
-
-void CPDF_PageObjectHolder::ContinueParse(IFX_Pause* pPause) {
-  if (!m_pParser) {
-    return;
-  }
-  m_pParser->Continue(pPause);
-  if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {
-    m_ParseState = CONTENT_PARSED;
-    m_pParser.reset();
-  }
-}
-
-void CPDF_PageObjectHolder::Transform(const CFX_Matrix& matrix) {
-  for (auto& pObj : m_PageObjectList)
-    pObj->Transform(matrix);
-}
-
-CFX_FloatRect CPDF_PageObjectHolder::CalcBoundingBox() const {
-  if (m_PageObjectList.empty())
-    return CFX_FloatRect(0, 0, 0, 0);
-
-  FX_FLOAT left = 1000000.0f;
-  FX_FLOAT right = -1000000.0f;
-  FX_FLOAT bottom = 1000000.0f;
-  FX_FLOAT top = -1000000.0f;
-  for (const auto& pObj : m_PageObjectList) {
-    left = std::min(left, pObj->m_Left);
-    right = std::max(right, pObj->m_Right);
-    bottom = std::min(bottom, pObj->m_Bottom);
-    top = std::max(top, pObj->m_Top);
-  }
-  return CFX_FloatRect(left, bottom, right, top);
-}
-
-void CPDF_PageObjectHolder::LoadTransInfo() {
-  if (!m_pFormDict) {
-    return;
-  }
-  CPDF_Dictionary* pGroup = m_pFormDict->GetDictBy("Group");
-  if (!pGroup) {
-    return;
-  }
-  if (pGroup->GetStringBy("S") != "Transparency") {
-    return;
-  }
-  m_Transparency |= PDFTRANS_GROUP;
-  if (pGroup->GetIntegerBy("I")) {
-    m_Transparency |= PDFTRANS_ISOLATED;
-  }
-  if (pGroup->GetIntegerBy("K")) {
-    m_Transparency |= PDFTRANS_KNOCKOUT;
-  }
-}
-
 CPDF_Page::CPDF_Page() : m_pPageRender(nullptr) {}
 
 void CPDF_Page::Load(CPDF_Document* pDocument,
@@ -650,59 +581,6 @@
   return FPDFAPI_GetPageAttr(m_pFormDict, name);
 }
 
-CPDF_Form::CPDF_Form(CPDF_Document* pDoc,
-                     CPDF_Dictionary* pPageResources,
-                     CPDF_Stream* pFormStream,
-                     CPDF_Dictionary* pParentResources) {
-  m_pDocument = pDoc;
-  m_pFormStream = pFormStream;
-  m_pFormDict = pFormStream ? pFormStream->GetDict() : NULL;
-  m_pResources = m_pFormDict->GetDictBy("Resources");
-  m_pPageResources = pPageResources;
-  if (!m_pResources) {
-    m_pResources = pParentResources;
-  }
-  if (!m_pResources) {
-    m_pResources = pPageResources;
-  }
-  m_Transparency = 0;
-  LoadTransInfo();
-}
-
-CPDF_Form::~CPDF_Form() {}
-
-void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates,
-                           CFX_Matrix* pParentMatrix,
-                           CPDF_Type3Char* pType3Char,
-                           CPDF_ParseOptions* pOptions,
-                           int level) {
-  if (m_ParseState == CONTENT_PARSED || m_ParseState == CONTENT_PARSING) {
-    return;
-  }
-  m_pParser.reset(new CPDF_ContentParser);
-  m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions,
-                   level);
-  m_ParseState = CONTENT_PARSING;
-}
-
-void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates,
-                             CFX_Matrix* pParentMatrix,
-                             CPDF_Type3Char* pType3Char,
-                             CPDF_ParseOptions* pOptions,
-                             int level) {
-  StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
-  ContinueParse(NULL);
-}
-
-CPDF_Form* CPDF_Form::Clone() const {
-  CPDF_Form* pCloneForm =
-      new CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);
-  for (const auto& pObj : m_PageObjectList)
-    pCloneForm->m_PageObjectList.emplace_back(pObj->Clone());
-
-  return pCloneForm;
-}
-
 void CPDF_Page::GetDisplayMatrix(CFX_Matrix& matrix,
                                  int xPos,
                                  int yPos,
@@ -756,10 +634,3 @@
   matrix = m_PageMatrix;
   matrix.Concat(display_matrix);
 }
-
-CPDF_ParseOptions::CPDF_ParseOptions() {
-  m_bTextOnly = FALSE;
-  m_bMarkedContent = TRUE;
-  m_bSeparateForm = TRUE;
-  m_bDecodeInlineImage = FALSE;
-}
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/fpdfapi/fpdf_page/fpdf_page_colors.cpp
index 040821b..d4b69f2 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_colors.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -15,7 +15,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcodec/fx_codec.h"
 
 namespace {
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index 9da5d1f..0d0c373 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_doc.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -13,7 +13,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
 #include "core/fpdfapi/ipdf_pagemodule.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 namespace {
 
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/fpdfapi/fpdf_page/fpdf_page_func.cpp
index 00ca2d8..4bf7c06 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_func.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_func.cpp
@@ -15,7 +15,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcrt/fx_safe_types.h"
 #include "third_party/base/numerics/safe_conversions_impl.h"
 
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
index 9915641..cd81b97 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
@@ -12,7 +12,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_render/render_int.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/fpdfapi/fpdf_page/fpdf_page_image.cpp
index cd89725..247b0b9 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_image.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -8,7 +8,6 @@
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 
 CPDF_ImageObject::CPDF_ImageObject() : m_pImage(nullptr) {}
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index 69ff8da..b625798 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "core/fpdfapi/fpdf_edit/include/cpdf_creator.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
@@ -16,7 +17,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 namespace {
 
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 36be007..c1bb70f 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -8,6 +8,8 @@
 
 #include <limits.h>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/cpdf_boolean.h"
 #include "core/fpdfapi/fpdf_parser/cpdf_null.h"
 #include "core/fpdfapi/fpdf_parser/fpdf_parser_utility.h"
@@ -19,7 +21,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcodec/fx_codec.h"
 #include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxcrt/fx_safe_types.h"
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_path.cpp b/core/fpdfapi/fpdf_page/fpdf_page_path.cpp
index 07c6ae1..286dfdf 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_path.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_path.cpp
@@ -6,7 +6,6 @@
 
 #include "core/fpdfapi/fpdf_page/pageint.h"
 
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 
 CPDF_PathObject::CPDF_PathObject() {}
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
index 7e22661..fbb2c28 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
@@ -8,10 +8,10 @@
 
 #include <algorithm>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 namespace {
 
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_form.h b/core/fpdfapi/fpdf_page/include/cpdf_form.h
new file mode 100644
index 0000000..3b9f1cc
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/include/cpdf_form.h
@@ -0,0 +1,44 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_FORM_H_
+#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_FORM_H_
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
+
+class CPDF_Document;
+class CPDF_Dictionary;
+class CPDF_Stream;
+class CPDF_AllStates;
+class CFX_Matrix;
+class CPDF_Type3Char;
+class CPDF_ParseOptions;
+
+class CPDF_Form : public CPDF_PageObjectHolder {
+ public:
+  CPDF_Form(CPDF_Document* pDocument,
+            CPDF_Dictionary* pPageResources,
+            CPDF_Stream* pFormStream,
+            CPDF_Dictionary* pParentResources = NULL);
+
+  ~CPDF_Form();
+
+  void StartParse(CPDF_AllStates* pGraphicStates,
+                  CFX_Matrix* pParentMatrix,
+                  CPDF_Type3Char* pType3Char,
+                  CPDF_ParseOptions* pOptions,
+                  int level = 0);
+
+  void ParseContent(CPDF_AllStates* pGraphicStates,
+                    CFX_Matrix* pParentMatrix,
+                    CPDF_Type3Char* pType3Char,
+                    CPDF_ParseOptions* pOptions,
+                    int level = 0);
+
+  CPDF_Form* Clone() const;
+};
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_FORM_H_
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_page.h b/core/fpdfapi/fpdf_page/include/cpdf_page.h
new file mode 100644
index 0000000..82c88d1
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/include/cpdf_page.h
@@ -0,0 +1,57 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGE_H_
+#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGE_H_
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
+#include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class CPDF_Document;
+class CPDF_Dictionary;
+class CPDF_Object;
+class CPDF_PageRenderCache;
+class CPDF_ParseOptions;
+
+class CPDF_Page : public CPDF_PageObjectHolder, public CFX_PrivateData {
+ public:
+  CPDF_Page();
+  ~CPDF_Page();
+
+  void Load(CPDF_Document* pDocument,
+            CPDF_Dictionary* pPageDict,
+            FX_BOOL bPageCache = TRUE);
+
+  void ParseContent(CPDF_ParseOptions* pOptions);
+
+  void GetDisplayMatrix(CFX_Matrix& matrix,
+                        int xPos,
+                        int yPos,
+                        int xSize,
+                        int ySize,
+                        int iRotate) const;
+
+  FX_FLOAT GetPageWidth() const { return m_PageWidth; }
+  FX_FLOAT GetPageHeight() const { return m_PageHeight; }
+  CFX_FloatRect GetPageBBox() const { return m_BBox; }
+  const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; }
+  CPDF_Object* GetPageAttr(const CFX_ByteStringC& name) const;
+  CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender; }
+
+ protected:
+  friend class CPDF_ContentParser;
+
+  void StartParse(CPDF_ParseOptions* pOptions);
+
+  FX_FLOAT m_PageWidth;
+  FX_FLOAT m_PageHeight;
+  CFX_Matrix m_PageMatrix;
+  CPDF_PageRenderCache* m_pPageRender;
+};
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGE_H_
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h b/core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h
new file mode 100644
index 0000000..b0ab376
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h
@@ -0,0 +1,67 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGEOBJECTHOLDER_H_
+#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGEOBJECTHOLDER_H_
+
+#include "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h"
+#include "core/include/fxcrt/fx_coordinates.h"
+#include "core/include/fxcrt/fx_system.h"
+
+class IFX_Pause;
+class CPDF_Dictionary;
+class CPDF_Stream;
+class CPDF_Document;
+class CPDF_ContentParser;
+
+#define PDFTRANS_GROUP 0x0100
+#define PDFTRANS_ISOLATED 0x0200
+#define PDFTRANS_KNOCKOUT 0x0400
+
+class CPDF_PageObjectHolder {
+ public:
+  CPDF_PageObjectHolder();
+
+  void ContinueParse(IFX_Pause* pPause);
+  bool IsParsed() const { return m_ParseState == CONTENT_PARSED; }
+
+  CPDF_PageObjectList* GetPageObjectList() { return &m_PageObjectList; }
+  const CPDF_PageObjectList* GetPageObjectList() const {
+    return &m_PageObjectList;
+  }
+
+  FX_BOOL BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; }
+  void SetBackgroundAlphaNeeded(FX_BOOL needed) {
+    m_bBackgroundAlphaNeeded = needed;
+  }
+
+  FX_BOOL HasImageMask() const { return m_bHasImageMask; }
+  void SetHasImageMask(FX_BOOL value) { m_bHasImageMask = value; }
+
+  void Transform(const CFX_Matrix& matrix);
+  CFX_FloatRect CalcBoundingBox() const;
+
+  CPDF_Dictionary* m_pFormDict;
+  CPDF_Stream* m_pFormStream;
+  CPDF_Document* m_pDocument;
+  CPDF_Dictionary* m_pPageResources;
+  CPDF_Dictionary* m_pResources;
+  CFX_FloatRect m_BBox;
+  int m_Transparency;
+
+ protected:
+  enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED };
+
+  void LoadTransInfo();
+
+  FX_BOOL m_bBackgroundAlphaNeeded;
+  FX_BOOL m_bHasImageMask;
+  ParseState m_ParseState;
+  std::unique_ptr<CPDF_ContentParser> m_pParser;
+  CPDF_PageObjectList m_PageObjectList;
+};
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGEOBJECTHOLDER_H_
diff --git a/core/fpdfapi/fpdf_page/pageint.h b/core/fpdfapi/fpdf_page/pageint.h
index 8818bc9..eab3d42 100644
--- a/core/fpdfapi/fpdf_page/pageint.h
+++ b/core/fpdfapi/fpdf_page/pageint.h
@@ -12,7 +12,8 @@
 #include <unordered_map>
 #include <vector>
 
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 
 class CPDF_AllStates;
diff --git a/core/fpdfapi/fpdf_render/fpdf_render.cpp b/core/fpdfapi/fpdf_render/fpdf_render.cpp
index 94398df..b52a745 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/fpdf_render/render_int.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/fpdfapi/fpdf_render/fpdf_render_cache.cpp
index fbe0784..298dea0 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_cache.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_cache.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/fpdf_render/cpdf_pagerendercache.h"
 
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
index 963ff24..b2c8985 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -9,6 +9,9 @@
 #include <utility>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
index 905e7a6..56af308 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -10,6 +10,7 @@
 #include <memory>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
index 2e25912..8fef5b3 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/fpdf_render/render_int.h"
 
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 4db2249..07790bd 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -6,6 +6,8 @@
 
 #include "core/fpdfapi/fpdf_render/render_int.h"
 
+#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
diff --git a/core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h b/core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h
index eddd4b0..e5c0d9d 100644
--- a/core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h
+++ b/core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h
@@ -9,8 +9,8 @@
 
 #include <memory>
 
+#include "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcrt/fx_coordinates.h"
 #include "core/include/fxcrt/fx_system.h"
 
diff --git a/core/fpdfdoc/doc_annot.cpp b/core/fpdfdoc/doc_annot.cpp
index 219d611..52f2192 100644
--- a/core/fpdfdoc/doc_annot.cpp
+++ b/core/fpdfdoc/doc_annot.cpp
@@ -4,13 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
 #include "core/fpdfapi/fpdf_parser/ipdf_occontext.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fpdfdoc/fpdf_doc.h"
 
diff --git a/core/fpdfdoc/doc_bookmark.cpp b/core/fpdfdoc/doc_bookmark.cpp
index 908960e..6acd247 100644
--- a/core/fpdfdoc/doc_bookmark.cpp
+++ b/core/fpdfdoc/doc_bookmark.cpp
@@ -10,7 +10,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfdoc/fpdf_doc.h"
 
 CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(
diff --git a/core/fpdfdoc/doc_form.cpp b/core/fpdfdoc/doc_form.cpp
index bcb2dcc..8329a5f 100644
--- a/core/fpdfdoc/doc_form.cpp
+++ b/core/fpdfdoc/doc_form.cpp
@@ -6,12 +6,12 @@
 
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
 #include "core/fpdfdoc/doc_utils.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfdoc/fpdf_doc.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/core/fpdfdoc/doc_formcontrol.cpp b/core/fpdfdoc/doc_formcontrol.cpp
index eab1902..425c3a1 100644
--- a/core/fpdfdoc/doc_formcontrol.cpp
+++ b/core/fpdfdoc/doc_formcontrol.cpp
@@ -6,11 +6,11 @@
 
 #include <algorithm>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfdoc/fpdf_doc.h"
 
 CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField,
diff --git a/core/fpdfdoc/doc_link.cpp b/core/fpdfdoc/doc_link.cpp
index 6c7ecde..b1a6a73 100644
--- a/core/fpdfdoc/doc_link.cpp
+++ b/core/fpdfdoc/doc_link.cpp
@@ -8,8 +8,8 @@
 
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 
 CPDF_LinkList::CPDF_LinkList() {}
 
diff --git a/core/fpdfdoc/doc_tagged.cpp b/core/fpdfdoc/doc_tagged.cpp
index 5795b36..4be0d6c 100644
--- a/core/fpdfdoc/doc_tagged.cpp
+++ b/core/fpdfdoc/doc_tagged.cpp
@@ -12,7 +12,6 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
 #include "core/fpdfdoc/doc_utils.h"
 #include "core/fpdfdoc/tagged_int.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfdoc/fpdf_tagged.h"
 
 const int nMaxRecursion = 32;
diff --git a/core/fpdftext/fpdf_text_int.cpp b/core/fpdftext/fpdf_text_int.cpp
index 0b23797..be01648 100644
--- a/core/fpdftext/fpdf_text_int.cpp
+++ b/core/fpdftext/fpdf_text_int.cpp
@@ -19,7 +19,6 @@
 #include "core/fpdftext/include/ipdf_textpage.h"
 #include "core/fpdftext/include/ipdf_textpagefind.h"
 #include "core/fpdftext/unicodenormalization.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
 #include "core/include/fxcrt/fx_bidi.h"
diff --git a/core/fpdftext/fpdf_text_int.h b/core/fpdftext/fpdf_text_int.h
index 7ebf653..dc82d3f 100644
--- a/core/fpdftext/fpdf_text_int.h
+++ b/core/fpdftext/fpdf_text_int.h
@@ -10,10 +10,12 @@
 #include <deque>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdftext/include/ipdf_linkextract.h"
 #include "core/fpdftext/include/ipdf_textpage.h"
 #include "core/fpdftext/include/ipdf_textpagefind.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcrt/fx_basic.h"
 
 class CFX_BidiChar;
diff --git a/core/fpdftext/include/ipdf_textpage.h b/core/fpdftext/include/ipdf_textpage.h
index 1698e9a..6808eae 100644
--- a/core/fpdftext/include/ipdf_textpage.h
+++ b/core/fpdftext/include/ipdf_textpage.h
@@ -7,7 +7,6 @@
 #ifndef CORE_FPDFTEXT_INCLUDE_IPDF_TEXTPAGE_H_
 #define CORE_FPDFTEXT_INCLUDE_IPDF_TEXTPAGE_H_
 
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fxcrt/fx_coordinates.h"
 #include "core/include/fxcrt/fx_system.h"
diff --git a/core/include/fpdfapi/fpdf_page.h b/core/include/fpdfapi/fpdf_page.h
deleted file mode 100644
index 534faf2..0000000
--- a/core/include/fpdfapi/fpdf_page.h
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
-#define CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
-
-#include <deque>
-#include <memory>
-
-#include "core/include/fpdfapi/fpdf_resource.h"
-#include "core/include/fxge/fx_dib.h"
-
-class CPDF_Page;
-class CPDF_Form;
-class CPDF_ParseOptions;
-class CPDF_PageObject;
-class CPDF_PageRenderCache;
-class CPDF_AllStates;
-class CPDF_ContentParser;
-class CPDF_ImageObject;
-
-#define PDFTRANS_GROUP 0x0100
-#define PDFTRANS_ISOLATED 0x0200
-#define PDFTRANS_KNOCKOUT 0x0400
-
-class CPDF_PageObjectList
-    : public std::deque<std::unique_ptr<CPDF_PageObject>> {
- public:
-  CPDF_PageObject* GetPageObjectByIndex(int index);
-};
-
-class CPDF_PageObjectHolder {
- public:
-  CPDF_PageObjectHolder();
-
-  void ContinueParse(IFX_Pause* pPause);
-  bool IsParsed() const { return m_ParseState == CONTENT_PARSED; }
-
-  CPDF_PageObjectList* GetPageObjectList() { return &m_PageObjectList; }
-  const CPDF_PageObjectList* GetPageObjectList() const {
-    return &m_PageObjectList;
-  }
-
-  FX_BOOL BackgroundAlphaNeeded() const { return m_bBackgroundAlphaNeeded; }
-  void SetBackgroundAlphaNeeded(FX_BOOL needed) {
-    m_bBackgroundAlphaNeeded = needed;
-  }
-
-  FX_BOOL HasImageMask() const { return m_bHasImageMask; }
-  void SetHasImageMask(FX_BOOL value) { m_bHasImageMask = value; }
-
-  void Transform(const CFX_Matrix& matrix);
-  CFX_FloatRect CalcBoundingBox() const;
-
-  CPDF_Dictionary* m_pFormDict;
-  CPDF_Stream* m_pFormStream;
-  CPDF_Document* m_pDocument;
-  CPDF_Dictionary* m_pPageResources;
-  CPDF_Dictionary* m_pResources;
-  CFX_FloatRect m_BBox;
-  int m_Transparency;
-
- protected:
-  enum ParseState { CONTENT_NOT_PARSED, CONTENT_PARSING, CONTENT_PARSED };
-
-  void LoadTransInfo();
-
-  FX_BOOL m_bBackgroundAlphaNeeded;
-  FX_BOOL m_bHasImageMask;
-  ParseState m_ParseState;
-  std::unique_ptr<CPDF_ContentParser> m_pParser;
-  CPDF_PageObjectList m_PageObjectList;
-};
-
-class CPDF_Page : public CPDF_PageObjectHolder, public CFX_PrivateData {
- public:
-  CPDF_Page();
-  ~CPDF_Page();
-
-  void Load(CPDF_Document* pDocument,
-            CPDF_Dictionary* pPageDict,
-            FX_BOOL bPageCache = TRUE);
-
-  void ParseContent(CPDF_ParseOptions* pOptions);
-
-  void GetDisplayMatrix(CFX_Matrix& matrix,
-                        int xPos,
-                        int yPos,
-                        int xSize,
-                        int ySize,
-                        int iRotate) const;
-
-  FX_FLOAT GetPageWidth() const { return m_PageWidth; }
-  FX_FLOAT GetPageHeight() const { return m_PageHeight; }
-  CFX_FloatRect GetPageBBox() const { return m_BBox; }
-  const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; }
-  CPDF_Object* GetPageAttr(const CFX_ByteStringC& name) const;
-  CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender; }
-
- protected:
-  friend class CPDF_ContentParser;
-  void StartParse(CPDF_ParseOptions* pOptions);
-
-  FX_FLOAT m_PageWidth;
-  FX_FLOAT m_PageHeight;
-  CFX_Matrix m_PageMatrix;
-  CPDF_PageRenderCache* m_pPageRender;
-};
-class CPDF_ParseOptions {
- public:
-  CPDF_ParseOptions();
-
-  FX_BOOL m_bTextOnly;
-
-  FX_BOOL m_bMarkedContent;
-
-  FX_BOOL m_bSeparateForm;
-
-  FX_BOOL m_bDecodeInlineImage;
-};
-class CPDF_Form : public CPDF_PageObjectHolder {
- public:
-  CPDF_Form(CPDF_Document* pDocument,
-            CPDF_Dictionary* pPageResources,
-            CPDF_Stream* pFormStream,
-            CPDF_Dictionary* pParentResources = NULL);
-
-  ~CPDF_Form();
-
-  void StartParse(CPDF_AllStates* pGraphicStates,
-                  CFX_Matrix* pParentMatrix,
-                  CPDF_Type3Char* pType3Char,
-                  CPDF_ParseOptions* pOptions,
-                  int level = 0);
-
-  void ParseContent(CPDF_AllStates* pGraphicStates,
-                    CFX_Matrix* pParentMatrix,
-                    CPDF_Type3Char* pType3Char,
-                    CPDF_ParseOptions* pOptions,
-                    int level = 0);
-
-  CPDF_Form* Clone() const;
-};
-class CPDF_PageContentGenerator {
- public:
-  explicit CPDF_PageContentGenerator(CPDF_Page* pPage);
-
-  FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
-  void GenerateContent();
-  void TransformContent(CFX_Matrix& matrix);
-
- private:
-  void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
-  void ProcessForm(CFX_ByteTextBuf& buf,
-                   const uint8_t* data,
-                   FX_DWORD size,
-                   CFX_Matrix& matrix);
-  CFX_ByteString RealizeResource(CPDF_Object* pResourceObj,
-                                 const FX_CHAR* szType);
-
-  CPDF_Page* m_pPage;
-  CPDF_Document* m_pDocument;
-  CFX_ArrayTemplate<CPDF_PageObject*> m_pageObjects;
-};
-
-#endif  // CORE_INCLUDE_FPDFAPI_FPDF_PAGE_H_
diff --git a/fpdfsdk/DEPS b/fpdfsdk/DEPS
index a351ff7..d81d04b 100644
--- a/fpdfsdk/DEPS
+++ b/fpdfsdk/DEPS
@@ -3,6 +3,7 @@
   '+core/fpdftext/include',
   '+core/fpdfapi/include',
   '+core/fpdfapi/fpdf_edit/include',
+  '+core/fpdfapi/fpdf_page/include',
   '+core/fpdfapi/fpdf_parser/include',
   '+core/fpdfapi/fpdf_render/include',
   '+javascript/IJavaScript.h',
diff --git a/fpdfsdk/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/formfiller/FFL_CBA_Fontmap.cpp
index 44e9cdd..d7488d1 100644
--- a/fpdfsdk/formfiller/FFL_CBA_Fontmap.cpp
+++ b/fpdfsdk/formfiller/FFL_CBA_Fontmap.cpp
@@ -6,9 +6,9 @@
 
 #include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_baseannot.h"
 
 CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot,
diff --git a/fpdfsdk/formfiller/FFL_FormFiller.cpp b/fpdfsdk/formfiller/FFL_FormFiller.cpp
index fbf0fd2..e764c19 100644
--- a/fpdfsdk/formfiller/FFL_FormFiller.cpp
+++ b/fpdfsdk/formfiller/FFL_FormFiller.cpp
@@ -6,7 +6,7 @@
 
 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
 
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h"
 #include "fpdfsdk/include/fsdk_common.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
diff --git a/fpdfsdk/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/formfiller/FFL_IFormFiller.cpp
index 4c5537e..8cc7b40 100644
--- a/fpdfsdk/formfiller/FFL_IFormFiller.cpp
+++ b/fpdfsdk/formfiller/FFL_IFormFiller.cpp
@@ -6,8 +6,8 @@
 
 #include "fpdfsdk/include/formfiller/FFL_IFormFiller.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/formfiller/FFL_CheckBox.h"
 #include "fpdfsdk/include/formfiller/FFL_ComboBox.h"
 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index bb982ca..9235136 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -8,10 +8,10 @@
 
 #include <algorithm>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_define.h"
 
 typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray;
diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp
index f4af9c4..1450f8e 100644
--- a/fpdfsdk/fpdf_progressive.cpp
+++ b/fpdfsdk/fpdf_progressive.cpp
@@ -6,6 +6,7 @@
 
 #include "public/fpdf_progressive.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/include/fsdk_rendercontext.h"
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 033e49f..ad11927 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -6,11 +6,11 @@
 
 #include "public/fpdf_transformpage.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_reference.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_define.h"
 
 namespace {
diff --git a/fpdfsdk/fpdfdoc.cpp b/fpdfsdk/fpdfdoc.cpp
index cb05df1..6a65e4a 100644
--- a/fpdfsdk/fpdfdoc.cpp
+++ b/fpdfsdk/fpdfdoc.cpp
@@ -8,9 +8,9 @@
 
 #include <set>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "third_party/base/stl_util.h"
 
diff --git a/fpdfsdk/fpdfeditpage.cpp b/fpdfsdk/fpdfeditpage.cpp
index 493329c..1345a1d 100644
--- a/fpdfsdk/fpdfeditpage.cpp
+++ b/fpdfsdk/fpdfeditpage.cpp
@@ -6,11 +6,13 @@
 
 #include "public/fpdf_edit.h"
 
+#include "core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_form.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "public/fpdf_formfill.h"
 #include "third_party/base/stl_util.h"
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index fea66a0..9230910 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -9,9 +9,9 @@
 #include <memory>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
 #include "public/fpdfview.h"
diff --git a/fpdfsdk/fpdftext.cpp b/fpdfsdk/fpdftext.cpp
index 3e64d8e..cbb8e00 100644
--- a/fpdfsdk/fpdftext.cpp
+++ b/fpdfsdk/fpdftext.cpp
@@ -6,6 +6,7 @@
 
 #include "public/fpdf_text.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdftext/include/ipdf_linkextract.h"
 #include "core/fpdftext/include/ipdf_textpage.h"
 #include "core/fpdftext/include/ipdf_textpagefind.h"
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index acad659..1c9024d 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -8,6 +8,7 @@
 
 #include <memory>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
diff --git a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
index 120d1ba..89638c0 100644
--- a/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/fpdfxfa_page.cpp
@@ -6,8 +6,8 @@
 
 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h"
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h"
 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h"
 #include "fpdfsdk/include/fsdk_define.h"
diff --git a/fpdfsdk/fsdk_annothandler.cpp b/fpdfsdk/fsdk_annothandler.cpp
index 0b6f2e1..725679d 100644
--- a/fpdfsdk/fsdk_annothandler.cpp
+++ b/fpdfsdk/fsdk_annothandler.cpp
@@ -9,8 +9,8 @@
 #include <algorithm>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
diff --git a/fpdfsdk/fsdk_baseform.cpp b/fpdfsdk/fsdk_baseform.cpp
index 4bb5374..d260ecb 100644
--- a/fpdfsdk/fsdk_baseform.cpp
+++ b/fpdfsdk/fsdk_baseform.cpp
@@ -10,10 +10,10 @@
 #include <memory>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
 #include "fpdfsdk/include/fsdk_actionhandler.h"
 #include "fpdfsdk/include/fsdk_baseannot.h"
diff --git a/fpdfsdk/fsdk_mgr.cpp b/fpdfsdk/fsdk_mgr.cpp
index e8654d3..57eba21 100644
--- a/fpdfsdk/fsdk_mgr.cpp
+++ b/fpdfsdk/fsdk_mgr.cpp
@@ -9,9 +9,9 @@
 #include <algorithm>
 #include <memory>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "fpdfsdk/include/javascript/IJavaScript.h"
diff --git a/fpdfsdk/fxedit/fxet_pageobjs.cpp b/fpdfsdk/fxedit/fxet_pageobjs.cpp
index 660f4a4..7a229ee 100644
--- a/fpdfsdk/fxedit/fxet_pageobjs.cpp
+++ b/fpdfsdk/fxedit/fxet_pageobjs.cpp
@@ -4,9 +4,9 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_textrenderer.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "fpdfsdk/include/fx_systemhandler.h"
 #include "fpdfsdk/include/fxedit/fx_edit.h"
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 5f6291b..144d428 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -8,8 +8,8 @@
 
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-#include "core/include/fpdfapi/fpdf_page.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/javascript/IJavaScript.h"
 #include "fpdfsdk/javascript/Field.h"
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 1ccd756..4955124 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -11,7 +11,7 @@
 #include <string>
 #include <vector>
 
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "fpdfsdk/include/fsdk_mgr.h"
 #include "fpdfsdk/include/javascript/IJavaScript.h"
 #include "fpdfsdk/javascript/Document.h"
diff --git a/fpdfsdk/pdfwindow/PWL_Edit.cpp b/fpdfsdk/pdfwindow/PWL_Edit.cpp
index c2b3864..808b2b5 100644
--- a/fpdfsdk/pdfwindow/PWL_Edit.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Edit.cpp
@@ -8,7 +8,7 @@
 
 #include <vector>
 
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/include/fpdfapi/fpdf_resource.h"
 #include "core/include/fxcrt/fx_safe_types.h"
 #include "core/include/fxcrt/fx_xml.h"
 #include "core/include/fxge/fx_ge.h"
diff --git a/fpdfsdk/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/pdfwindow/PWL_FontMap.cpp
index 2b9f17c..ff9e2a3 100644
--- a/fpdfsdk/pdfwindow/PWL_FontMap.cpp
+++ b/fpdfsdk/pdfwindow/PWL_FontMap.cpp
@@ -8,7 +8,7 @@
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/include/fpdfapi/fpdf_resource.h"
 #include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
 
 namespace {
diff --git a/fpdfsdk/pdfwindow/PWL_Icon.cpp b/fpdfsdk/pdfwindow/PWL_Icon.cpp
index 6fa65cf..3e5911e 100644
--- a/fpdfsdk/pdfwindow/PWL_Icon.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Icon.cpp
@@ -7,7 +7,7 @@
 #include "fpdfsdk/include/pdfwindow/PWL_Icon.h"
 
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
 #include "fpdfsdk/include/pdfwindow/PWL_Utils.h"
 #include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
 
diff --git a/pdfium.gyp b/pdfium.gyp
index cdbf184..fed93b7 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -316,17 +316,24 @@
         'core/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp',
         'core/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp',
         'core/fpdfapi/fpdf_edit/editint.h',
-        'core/fpdfapi/fpdf_edit/fpdf_edit_content.cpp',
+        'core/fpdfapi/fpdf_edit/cpdf_pagecontentgenerator.cpp',
         'core/fpdfapi/fpdf_edit/fpdf_edit_create.cpp',
         'core/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp',
         'core/fpdfapi/fpdf_edit/fpdf_edit_image.cpp',
         'core/fpdfapi/fpdf_edit/include/cpdf_creator.h',
+        'core/fpdfapi/fpdf_edit/include/cpdf_pagecontentgenerator.h',
         'core/fpdfapi/fpdf_font/font_int.h',
         'core/fpdfapi/fpdf_font/fpdf_font.cpp',
         'core/fpdfapi/fpdf_font/fpdf_font_charset.cpp',
         'core/fpdfapi/fpdf_font/fpdf_font_cid.cpp',
         'core/fpdfapi/fpdf_font/ttgsubtable.cpp',
         'core/fpdfapi/fpdf_font/ttgsubtable.h',
+        'core/fpdfapi/fpdf_page/cpdf_form.cpp',
+        'core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp',
+        'core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h',
+        'core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp',
+        'core/fpdfapi/fpdf_page/cpdf_parseoptions.cpp',
+        'core/fpdfapi/fpdf_page/cpdf_parseoptions.h',
         'core/fpdfapi/fpdf_page/fpdf_page.cpp',
         'core/fpdfapi/fpdf_page/fpdf_page_colors.cpp',
         'core/fpdfapi/fpdf_page/fpdf_page_doc.cpp',
@@ -337,6 +344,9 @@
         'core/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp',
         'core/fpdfapi/fpdf_page/fpdf_page_path.cpp',
         'core/fpdfapi/fpdf_page/fpdf_page_pattern.cpp',
+        'core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h',
+        'core/fpdfapi/fpdf_page/include/cpdf_form.h',
+        'core/fpdfapi/fpdf_page/include/cpdf_page.h',
         'core/fpdfapi/fpdf_page/pageint.h',
         'core/fpdfapi/fpdf_parser/cfdf_document.cpp',
         'core/fpdfapi/fpdf_parser/cpdf_array.cpp',
@@ -404,7 +414,6 @@
         'core/fpdfapi/include/cpdf_modulemgr.h',
         'core/fpdfapi/ipdf_rendermodule.h',
         'core/fpdfapi/ipdf_pagemodule.h',
-        'core/include/fpdfapi/fpdf_page.h',
         'core/include/fpdfapi/fpdf_pageobj.h',
         'core/include/fpdfapi/fpdf_resource.h',
       ],
diff --git a/xfa/fxfa/app/DEPS b/xfa/fxfa/app/DEPS
index d92f3de..6678121 100644
--- a/xfa/fxfa/app/DEPS
+++ b/xfa/fxfa/app/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   '+core/fdrm/crypto/include',
+  '+core/fpdfapi/fpdf_page/include',
   '+core/fpdfapi/fpdf_parser/include',
 ]
diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
index 3153946..450c4ed 100644
--- a/xfa/fxfa/app/xfa_ffwidget.cpp
+++ b/xfa/fxfa/app/xfa_ffwidget.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "core/include/fpdfapi/fpdf_page.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_pageobjectholder.h"
 #include "core/include/fxcodec/fx_codec.h"
 #include "xfa/fxfa/app/xfa_ffapp.h"
 #include "xfa/fxfa/app/xfa_ffdoc.h"