diff --git a/BUILD.gn b/BUILD.gn
index 8df422d..4e430ab 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -451,8 +451,6 @@
     "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h",
     "core/fpdfapi/fpdf_page/cpdf_textobject.cpp",
     "core/fpdfapi/fpdf_page/cpdf_textstate.cpp",
-    "core/fpdfapi/fpdf_page/cpdf_textstate.h",
-    "core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp",
     "core/fpdfapi/fpdf_page/cpdf_tilingpattern.cpp",
     "core/fpdfapi/fpdf_page/cpdf_tilingpattern.h",
     "core/fpdfapi/fpdf_page/fpdf_page_colors.cpp",
@@ -475,7 +473,7 @@
     "core/fpdfapi/fpdf_page/include/cpdf_pathobject.h",
     "core/fpdfapi/fpdf_page/include/cpdf_shadingobject.h",
     "core/fpdfapi/fpdf_page/include/cpdf_textobject.h",
-    "core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h",
+    "core/fpdfapi/fpdf_page/include/cpdf_textstate.h",
     "core/fpdfapi/fpdf_page/pageint.h",
     "core/fpdfapi/fpdf_parser/cfdf_document.cpp",
     "core/fpdfapi/fpdf_parser/cpdf_array.cpp",
diff --git a/core/fpdfapi/fpdf_page/cpdf_graphicstates.h b/core/fpdfapi/fpdf_page/cpdf_graphicstates.h
index fb404ff..5059f3c 100644
--- a/core/fpdfapi/fpdf_page/cpdf_graphicstates.h
+++ b/core/fpdfapi/fpdf_page/cpdf_graphicstates.h
@@ -8,9 +8,9 @@
 #define CORE_FPDFAPI_FPDF_PAGE_CPDF_GRAPHICSTATES_H_
 
 #include "core/fpdfapi/fpdf_page/cpdf_colorstate.h"
-#include "core/fpdfapi/fpdf_page/cpdf_textstate.h"
 #include "core/fpdfapi/fpdf_page/include/cpdf_clippath.h"
 #include "core/fpdfapi/fpdf_page/include/cpdf_generalstate.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_textstate.h"
 #include "core/fxge/include/cfx_graphstate.h"
 
 class CPDF_GraphicStates {
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
index feb70ae..4967cca 100644
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_textstate.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfapi/fpdf_page/cpdf_textstate.h"
+#include "core/fpdfapi/fpdf_page/include/cpdf_textstate.h"
 
 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fpdfapi/fpdf_page/pageint.h"
@@ -88,3 +88,100 @@
 FX_FLOAT* CPDF_TextState::GetMutableCTM() {
   return m_Ref.GetPrivateCopy()->m_CTM;
 }
+
+CPDF_TextState::TextData::TextData()
+    : m_pFont(nullptr),
+      m_pDocument(nullptr),
+      m_FontSize(1.0f),
+      m_CharSpace(0),
+      m_WordSpace(0),
+      m_TextMode(TextRenderingMode::MODE_FILL) {
+  m_Matrix[0] = m_Matrix[3] = 1.0f;
+  m_Matrix[1] = m_Matrix[2] = 0;
+  m_CTM[0] = m_CTM[3] = 1.0f;
+  m_CTM[1] = m_CTM[2] = 0;
+}
+
+CPDF_TextState::TextData::TextData(const TextData& that)
+    : m_pFont(that.m_pFont),
+      m_pDocument(that.m_pDocument),
+      m_FontSize(that.m_FontSize),
+      m_CharSpace(that.m_CharSpace),
+      m_WordSpace(that.m_WordSpace),
+      m_TextMode(that.m_TextMode) {
+  for (int i = 0; i < 4; ++i)
+    m_Matrix[i] = that.m_Matrix[i];
+
+  for (int i = 0; i < 4; ++i)
+    m_CTM[i] = that.m_CTM[i];
+
+  if (m_pDocument && m_pFont) {
+    m_pFont =
+        m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);
+  }
+}
+
+CPDF_TextState::TextData::~TextData() {
+  if (m_pDocument && m_pFont) {
+    CPDF_DocPageData* pPageData = m_pDocument->GetPageData();
+    if (pPageData && !pPageData->IsForceClear())
+      pPageData->ReleaseFont(m_pFont->GetFontDict());
+  }
+}
+
+void CPDF_TextState::TextData::SetFont(CPDF_Font* pFont) {
+  CPDF_Document* pDoc = m_pDocument;
+  CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
+  if (pPageData && m_pFont && !pPageData->IsForceClear())
+    pPageData->ReleaseFont(m_pFont->GetFontDict());
+
+  m_pDocument = pFont ? pFont->m_pDocument : nullptr;
+  m_pFont = pFont;
+}
+
+FX_FLOAT CPDF_TextState::TextData::GetFontSizeV() const {
+  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize);
+}
+
+FX_FLOAT CPDF_TextState::TextData::GetFontSizeH() const {
+  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize);
+}
+
+FX_FLOAT CPDF_TextState::TextData::GetBaselineAngle() const {
+  return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
+}
+
+FX_FLOAT CPDF_TextState::TextData::GetShearAngle() const {
+  return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
+}
+
+bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) {
+  if (iMode < 0 || iMode > 7)
+    return false;
+  *mode = static_cast<TextRenderingMode>(iMode);
+  return true;
+}
+
+bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) {
+  switch (mode) {
+    case TextRenderingMode::MODE_FILL_CLIP:
+    case TextRenderingMode::MODE_STROKE_CLIP:
+    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
+    case TextRenderingMode::MODE_CLIP:
+      return true;
+    default:
+      return false;
+  }
+}
+
+bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) {
+  switch (mode) {
+    case TextRenderingMode::MODE_STROKE:
+    case TextRenderingMode::MODE_FILL_STROKE:
+    case TextRenderingMode::MODE_STROKE_CLIP:
+    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
+      return true;
+    default:
+      return false;
+  }
+}
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstate.h b/core/fpdfapi/fpdf_page/cpdf_textstate.h
deleted file mode 100644
index 87f0b5c..0000000
--- a/core/fpdfapi/fpdf_page/cpdf_textstate.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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_TEXTSTATE_H_
-#define CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_
-
-#include "core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h"
-#include "core/fxcrt/include/cfx_count_ref.h"
-#include "core/fxcrt/include/fx_basic.h"
-
-class CPDF_Font;
-
-class CPDF_TextState {
- public:
-  CPDF_TextState();
-  ~CPDF_TextState();
-
-  void Emplace();
-
-  CPDF_Font* GetFont() const;
-  void SetFont(CPDF_Font* pFont);
-
-  FX_FLOAT GetFontSize() const;
-  void SetFontSize(FX_FLOAT size);
-
-  const FX_FLOAT* GetMatrix() const;
-  FX_FLOAT* GetMutableMatrix();
-
-  FX_FLOAT GetCharSpace() const;
-  void SetCharSpace(FX_FLOAT sp);
-
-  FX_FLOAT GetWordSpace() const;
-  void SetWordSpace(FX_FLOAT sp);
-
-  FX_FLOAT GetFontSizeV() const;
-  FX_FLOAT GetFontSizeH() const;
-  FX_FLOAT GetBaselineAngle() const;
-  FX_FLOAT GetShearAngle() const;
-
-  TextRenderingMode GetTextMode() const;
-  void SetTextMode(TextRenderingMode mode);
-
-  const FX_FLOAT* GetCTM() const;
-  FX_FLOAT* GetMutableCTM();
-
- private:
-  CFX_CountRef<CPDF_TextStateData> m_Ref;
-};
-
-#endif  // CORE_FPDFAPI_FPDF_PAGE_CPDF_TEXTSTATE_H_
diff --git a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp b/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp
deleted file mode 100644
index 17c33a0..0000000
--- a/core/fpdfapi/fpdf_page/cpdf_textstatedata.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-// 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_textstatedata.h"
-
-#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
-#include "core/fpdfapi/fpdf_page/pageint.h"
-#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
-
-bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode) {
-  if (iMode < 0 || iMode > 7)
-    return false;
-  *mode = static_cast<TextRenderingMode>(iMode);
-  return true;
-}
-
-bool TextRenderingModeIsClipMode(const TextRenderingMode& mode) {
-  switch (mode) {
-    case TextRenderingMode::MODE_FILL_CLIP:
-    case TextRenderingMode::MODE_STROKE_CLIP:
-    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
-    case TextRenderingMode::MODE_CLIP:
-      return true;
-    default:
-      return false;
-  }
-}
-
-bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode) {
-  switch (mode) {
-    case TextRenderingMode::MODE_STROKE:
-    case TextRenderingMode::MODE_FILL_STROKE:
-    case TextRenderingMode::MODE_STROKE_CLIP:
-    case TextRenderingMode::MODE_FILL_STROKE_CLIP:
-      return true;
-    default:
-      return false;
-  }
-}
-
-CPDF_TextStateData::CPDF_TextStateData()
-    : m_pFont(nullptr),
-      m_pDocument(nullptr),
-      m_FontSize(1.0f),
-      m_CharSpace(0),
-      m_WordSpace(0),
-      m_TextMode(TextRenderingMode::MODE_FILL) {
-  m_Matrix[0] = m_Matrix[3] = 1.0f;
-  m_Matrix[1] = m_Matrix[2] = 0;
-  m_CTM[0] = m_CTM[3] = 1.0f;
-  m_CTM[1] = m_CTM[2] = 0;
-}
-
-CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src) {
-  if (this == &src)
-    return;
-
-  FXSYS_memcpy(this, &src, sizeof(CPDF_TextStateData));
-  if (m_pDocument && m_pFont) {
-    m_pFont =
-        m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);
-  }
-}
-
-CPDF_TextStateData::~CPDF_TextStateData() {
-  if (m_pDocument && m_pFont) {
-    CPDF_DocPageData* pPageData = m_pDocument->GetPageData();
-    if (pPageData && !pPageData->IsForceClear())
-      pPageData->ReleaseFont(m_pFont->GetFontDict());
-  }
-}
-
-void CPDF_TextStateData::SetFont(CPDF_Font* pFont) {
-  CPDF_Document* pDoc = m_pDocument;
-  CPDF_DocPageData* pPageData = pDoc ? pDoc->GetPageData() : nullptr;
-  if (pPageData && m_pFont && !pPageData->IsForceClear())
-    pPageData->ReleaseFont(m_pFont->GetFontDict());
-
-  m_pDocument = pFont ? pFont->m_pDocument : nullptr;
-  m_pFont = pFont;
-}
-
-FX_FLOAT CPDF_TextStateData::GetFontSizeV() const {
-  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[1], m_Matrix[3]) * m_FontSize);
-}
-
-FX_FLOAT CPDF_TextStateData::GetFontSizeH() const {
-  return FXSYS_fabs(FXSYS_sqrt2(m_Matrix[0], m_Matrix[2]) * m_FontSize);
-}
-
-FX_FLOAT CPDF_TextStateData::GetBaselineAngle() const {
-  return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
-}
-
-FX_FLOAT CPDF_TextStateData::GetShearAngle() const {
-  return GetBaselineAngle() + FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
-}
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_textstate.h b/core/fpdfapi/fpdf_page/include/cpdf_textstate.h
new file mode 100644
index 0000000..b457026
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/include/cpdf_textstate.h
@@ -0,0 +1,91 @@
+// 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_TEXTSTATE_H_
+#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATE_H_
+
+#include "core/fxcrt/include/cfx_count_ref.h"
+#include "core/fxcrt/include/fx_basic.h"
+
+class CPDF_Document;
+class CPDF_Font;
+
+// See PDF Reference 1.7, page 402, table 5.3.
+enum class TextRenderingMode {
+  MODE_FILL = 0,
+  MODE_STROKE = 1,
+  MODE_FILL_STROKE = 2,
+  MODE_INVISIBLE = 3,
+  MODE_FILL_CLIP = 4,
+  MODE_STROKE_CLIP = 5,
+  MODE_FILL_STROKE_CLIP = 6,
+  MODE_CLIP = 7,
+};
+
+class CPDF_TextState {
+ public:
+  CPDF_TextState();
+  ~CPDF_TextState();
+
+  void Emplace();
+
+  CPDF_Font* GetFont() const;
+  void SetFont(CPDF_Font* pFont);
+
+  FX_FLOAT GetFontSize() const;
+  void SetFontSize(FX_FLOAT size);
+
+  const FX_FLOAT* GetMatrix() const;
+  FX_FLOAT* GetMutableMatrix();
+
+  FX_FLOAT GetCharSpace() const;
+  void SetCharSpace(FX_FLOAT sp);
+
+  FX_FLOAT GetWordSpace() const;
+  void SetWordSpace(FX_FLOAT sp);
+
+  FX_FLOAT GetFontSizeV() const;
+  FX_FLOAT GetFontSizeH() const;
+  FX_FLOAT GetBaselineAngle() const;
+  FX_FLOAT GetShearAngle() const;
+
+  TextRenderingMode GetTextMode() const;
+  void SetTextMode(TextRenderingMode mode);
+
+  const FX_FLOAT* GetCTM() const;
+  FX_FLOAT* GetMutableCTM();
+
+ private:
+  class TextData {
+   public:
+    TextData();
+    TextData(const TextData& src);
+    ~TextData();
+
+    void SetFont(CPDF_Font* pFont);
+    FX_FLOAT GetFontSizeV() const;
+    FX_FLOAT GetFontSizeH() const;
+    FX_FLOAT GetBaselineAngle() const;
+    FX_FLOAT GetShearAngle() const;
+
+    CPDF_Font* m_pFont;
+    CPDF_Document* m_pDocument;
+    FX_FLOAT m_FontSize;
+    FX_FLOAT m_CharSpace;
+    FX_FLOAT m_WordSpace;
+    TextRenderingMode m_TextMode;
+    FX_FLOAT m_Matrix[4];
+    FX_FLOAT m_CTM[4];
+  };
+
+  CFX_CountRef<TextData> m_Ref;
+};
+
+bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode);
+bool TextRenderingModeIsClipMode(const TextRenderingMode& mode);
+bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode);
+
+#endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATE_H_
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h b/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h
deleted file mode 100644
index f3d6696..0000000
--- a/core/fpdfapi/fpdf_page/include/cpdf_textstatedata.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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_TEXTSTATEDATA_H_
-#define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATEDATA_H_
-
-#include "core/fxcrt/include/fx_system.h"
-
-class CPDF_Font;
-class CPDF_Document;
-
-// See PDF Reference 1.7, page 402, table 5.3.
-enum class TextRenderingMode {
-  MODE_FILL = 0,
-  MODE_STROKE = 1,
-  MODE_FILL_STROKE = 2,
-  MODE_INVISIBLE = 3,
-  MODE_FILL_CLIP = 4,
-  MODE_STROKE_CLIP = 5,
-  MODE_FILL_STROKE_CLIP = 6,
-  MODE_CLIP = 7,
-};
-
-bool SetTextRenderingModeFromInt(int iMode, TextRenderingMode* mode);
-bool TextRenderingModeIsClipMode(const TextRenderingMode& mode);
-bool TextRenderingModeIsStrokeMode(const TextRenderingMode& mode);
-
-class CPDF_TextStateData {
- public:
-  CPDF_TextStateData();
-  CPDF_TextStateData(const CPDF_TextStateData& src);
-  ~CPDF_TextStateData();
-
-  void SetFont(CPDF_Font* pFont);
-  FX_FLOAT GetFontSizeV() const;
-  FX_FLOAT GetFontSizeH() const;
-  FX_FLOAT GetBaselineAngle() const;
-  FX_FLOAT GetShearAngle() const;
-
-  CPDF_Font* m_pFont;
-  CPDF_Document* m_pDocument;
-  FX_FLOAT m_FontSize;
-  FX_FLOAT m_CharSpace;
-  FX_FLOAT m_WordSpace;
-  TextRenderingMode m_TextMode;
-  FX_FLOAT m_Matrix[4];
-  FX_FLOAT m_CTM[4];
-};
-
-#endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_TEXTSTATEDATA_H_
