diff --git a/BUILD.gn b/BUILD.gn
index 98027d0..7d202f7 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -195,6 +195,8 @@
 
 static_library("fpdfdoc") {
   sources = [
+    "core/fpdfdoc/clines.cpp",
+    "core/fpdfdoc/clines.h",
     "core/fpdfdoc/cpdf_variabletext.cpp",
     "core/fpdfdoc/cpvt_color.cpp",
     "core/fpdfdoc/cpvt_color.h",
diff --git a/core/fpdfdoc/clines.cpp b/core/fpdfdoc/clines.cpp
new file mode 100644
index 0000000..b117310
--- /dev/null
+++ b/core/fpdfdoc/clines.cpp
@@ -0,0 +1,50 @@
+// 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/fpdfdoc/clines.h"
+
+CLines::CLines() : m_nTotal(0) {}
+
+CLines::~CLines() {
+  RemoveAll();
+}
+
+int32_t CLines::GetSize() const {
+  return m_Lines.GetSize();
+}
+
+CLine* CLines::GetAt(int32_t nIndex) const {
+  return m_Lines.GetAt(nIndex);
+}
+
+void CLines::Empty() {
+  m_nTotal = 0;
+}
+
+void CLines::RemoveAll() {
+  for (int32_t i = 0, sz = GetSize(); i < sz; i++)
+    delete GetAt(i);
+  m_Lines.RemoveAll();
+  m_nTotal = 0;
+}
+
+int32_t CLines::Add(const CPVT_LineInfo& lineinfo) {
+  if (m_nTotal >= GetSize()) {
+    CLine* pLine = new CLine;
+    pLine->m_LineInfo = lineinfo;
+    m_Lines.Add(pLine);
+  } else if (CLine* pLine = GetAt(m_nTotal)) {
+    pLine->m_LineInfo = lineinfo;
+  }
+  return m_nTotal++;
+}
+
+void CLines::Clear() {
+  for (int32_t i = GetSize() - 1; i >= m_nTotal; i--) {
+    delete GetAt(i);
+    m_Lines.RemoveAt(i);
+  }
+}
diff --git a/core/fpdfdoc/clines.h b/core/fpdfdoc/clines.h
new file mode 100644
index 0000000..9d71d3f
--- /dev/null
+++ b/core/fpdfdoc/clines.h
@@ -0,0 +1,30 @@
+// 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_FPDFDOC_CLINES_H_
+#define CORE_FPDFDOC_CLINES_H_
+
+#include "core/fpdfdoc/pdf_vt.h"
+
+class CLines final {
+ public:
+  CLines();
+  ~CLines();
+
+  int32_t GetSize() const;
+  CLine* GetAt(int32_t nIndex) const;
+
+  void Empty();
+  void RemoveAll();
+  int32_t Add(const CPVT_LineInfo& lineinfo);
+  void Clear();
+
+ private:
+  CPVT_ArrayTemplate<CLine*> m_Lines;
+  int32_t m_nTotal;
+};
+
+#endif  // CORE_FPDFDOC_CLINES_H_
diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpdf_variabletext.cpp
index 1d5fde2..010d426 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpdf_variabletext.cpp
@@ -787,10 +787,18 @@
   return FALSE;
 }
 
+void CPDF_VariableText::SetPlateRect(const CFX_FloatRect& rect) {
+  CPDF_EditContainer::SetPlateRect(rect);
+}
+
 CFX_FloatRect CPDF_VariableText::GetContentRect() const {
   return InToOut(CPVT_FloatRect(CPDF_EditContainer::GetContentRect()));
 }
 
+const CFX_FloatRect& CPDF_VariableText::GetPlateRect() const {
+  return CPDF_EditContainer::GetPlateRect();
+}
+
 FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo& WordInfo,
                                             FX_BOOL bFactFontSize) {
   return m_bRichText && WordInfo.pWordProps
diff --git a/core/fpdfdoc/csection.h b/core/fpdfdoc/csection.h
index 4ac345c..8629be7 100644
--- a/core/fpdfdoc/csection.h
+++ b/core/fpdfdoc/csection.h
@@ -7,6 +7,7 @@
 #ifndef CORE_FPDFDOC_CSECTION_H_
 #define CORE_FPDFDOC_CSECTION_H_
 
+#include "core/fpdfdoc/clines.h"
 #include "core/fpdfdoc/cpvt_sectioninfo.h"
 #include "core/fpdfdoc/ctypeset.h"
 #include "core/fxcrt/include/fx_coordinates.h"
diff --git a/core/fpdfdoc/doc_basic.cpp b/core/fpdfdoc/doc_basic.cpp
index 72f2985..3fe182a 100644
--- a/core/fpdfdoc/doc_basic.cpp
+++ b/core/fpdfdoc/doc_basic.cpp
@@ -31,6 +31,7 @@
     return 0;
   return pDoc->GetPageIndex(pPage->GetObjNum());
 }
+
 uint32_t CPDF_Dest::GetPageObjNum() {
   CPDF_Array* pArray = ToArray(m_pObj);
   if (!pArray)
@@ -68,6 +69,7 @@
   CPDF_Array* pArray = ToArray(m_pObj);
   return pArray ? pArray->GetNumberAt(2 + index) : 0;
 }
+
 CFX_ByteString CPDF_Dest::GetRemoteName() {
   return m_pObj ? m_pObj->GetString() : CFX_ByteString();
 }
@@ -224,6 +226,7 @@
   }
   return nIndex;
 }
+
 CPDF_Object* CPDF_NameTree::LookupValue(int nIndex,
                                         CFX_ByteString& csName) const {
   if (!m_pRoot) {
@@ -232,6 +235,7 @@
   size_t nCurIndex = 0;
   return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, nullptr);
 }
+
 CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const {
   if (!m_pRoot) {
     return nullptr;
@@ -239,6 +243,7 @@
   size_t nIndex = 0;
   return SearchNameNode(m_pRoot, csName, nIndex, nullptr);
 }
+
 CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc,
                                            const CFX_ByteString& sName) {
   CPDF_Object* pValue = LookupValue(sName);
@@ -442,6 +447,7 @@
   }
   return wsLetters;
 }
+
 static CFX_WideString _GetLabelNumPortion(int num,
                                           const CFX_ByteString& bsStyle) {
   CFX_WideString wsNumPortion;
@@ -463,6 +469,40 @@
   }
   return wsNumPortion;
 }
+
+IPDF_FormNotify::~IPDF_FormNotify() {}
+
+int IPDF_FormNotify::BeforeValueChange(CPDF_FormField* pField,
+                                       const CFX_WideString& csValue) {
+  return 0;
+}
+
+void IPDF_FormNotify::AfterValueChange(CPDF_FormField* pField) {}
+
+int IPDF_FormNotify::BeforeSelectionChange(CPDF_FormField* pField,
+                                           const CFX_WideString& csValue) {
+  return 0;
+}
+
+void IPDF_FormNotify::AfterSelectionChange(CPDF_FormField* pField) {}
+
+void IPDF_FormNotify::AfterCheckedStatusChange(CPDF_FormField* pField) {}
+
+int IPDF_FormNotify::BeforeFormReset(CPDF_InterForm* pForm) {
+  return 0;
+}
+
+void IPDF_FormNotify::AfterFormReset(CPDF_InterForm* pForm) {}
+
+int IPDF_FormNotify::BeforeFormImportData(CPDF_InterForm* pForm) {
+  return 0;
+}
+
+void IPDF_FormNotify::AfterFormImportData(CPDF_InterForm* pForm) {}
+
+CPDF_PageLabel::CPDF_PageLabel(CPDF_Document* pDocument)
+    : m_pDocument(pDocument) {}
+
 CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const {
   CFX_WideString wsLabel;
   if (!m_pDocument) {
diff --git a/core/fpdfdoc/doc_formcontrol.cpp b/core/fpdfdoc/doc_formcontrol.cpp
index 9b3cf1e..7e058ae 100644
--- a/core/fpdfdoc/doc_formcontrol.cpp
+++ b/core/fpdfdoc/doc_formcontrol.cpp
@@ -27,10 +27,6 @@
       m_pWidgetDict(pWidgetDict),
       m_pForm(m_pField->m_pForm) {}
 
-CFX_FloatRect CPDF_FormControl::GetRect() const {
-  return m_pWidgetDict->GetRectBy("Rect");
-}
-
 CFX_ByteString CPDF_FormControl::GetOnStateName() const {
   ASSERT(GetType() == CPDF_FormField::CheckBox ||
          GetType() == CPDF_FormField::RadioButton);
diff --git a/core/fpdfdoc/doc_tagged.cpp b/core/fpdfdoc/doc_tagged.cpp
index 05109bb..2bd4347 100644
--- a/core/fpdfdoc/doc_tagged.cpp
+++ b/core/fpdfdoc/doc_tagged.cpp
@@ -208,6 +208,30 @@
   LoadKids(pDict);
 }
 
+IPDF_StructTree* CPDF_StructElementImpl::GetTree() const {
+  return m_pTree;
+}
+
+const CFX_ByteString& CPDF_StructElementImpl::GetType() const {
+  return m_Type;
+}
+
+IPDF_StructElement* CPDF_StructElementImpl::GetParent() const {
+  return m_pParent;
+}
+
+CPDF_Dictionary* CPDF_StructElementImpl::GetDict() const {
+  return m_pDict;
+}
+
+int CPDF_StructElementImpl::CountKids() const {
+  return pdfium::CollectionSize<int>(m_Kids);
+}
+
+const CPDF_StructKid& CPDF_StructElementImpl::GetKid(int index) const {
+  return m_Kids[index];
+}
+
 CPDF_StructElementImpl::~CPDF_StructElementImpl() {
   for (CPDF_StructKid& kid : m_Kids) {
     if (kid.m_Type == CPDF_StructKid::Element && kid.m_Element.m_pElement)
diff --git a/core/fpdfdoc/doc_vt.cpp b/core/fpdfdoc/doc_vt.cpp
index 7b902f8..84d6a1a 100644
--- a/core/fpdfdoc/doc_vt.cpp
+++ b/core/fpdfdoc/doc_vt.cpp
@@ -7,14 +7,18 @@
 #include "core/fpdfdoc/pdf_vt.h"
 
 CLine::CLine() {}
+
 CLine::~CLine() {}
+
 CPVT_WordPlace CLine::GetBeginWordPlace() const {
   return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
 }
+
 CPVT_WordPlace CLine::GetEndWordPlace() const {
   return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex,
                         m_LineInfo.nEndWordIndex);
 }
+
 CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace& place) const {
   if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
     return CPVT_WordPlace(place.nSecIndex, place.nLineIndex,
@@ -23,6 +27,7 @@
   return CPVT_WordPlace(place.nSecIndex, place.nLineIndex,
                         place.nWordIndex - 1);
 }
+
 CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace& place) const {
   if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {
     return CPVT_WordPlace(place.nSecIndex, place.nLineIndex,
@@ -31,3 +36,23 @@
   return CPVT_WordPlace(place.nSecIndex, place.nLineIndex,
                         place.nWordIndex + 1);
 }
+
+CPDF_EditContainer::CPDF_EditContainer() {}
+
+CPDF_EditContainer::~CPDF_EditContainer() {}
+
+void CPDF_EditContainer::SetPlateRect(const CFX_FloatRect& rect) {
+  m_rcPlate = rect;
+}
+
+const CFX_FloatRect& CPDF_EditContainer::GetPlateRect() const {
+  return m_rcPlate;
+}
+
+void CPDF_EditContainer::SetContentRect(const CPVT_FloatRect& rect) {
+  m_rcContent = rect;
+}
+
+CFX_FloatRect CPDF_EditContainer::GetContentRect() const {
+  return m_rcContent;
+}
diff --git a/core/fpdfdoc/include/cpdf_variabletext.h b/core/fpdfdoc/include/cpdf_variabletext.h
index 06b41f1..5e64ab2 100644
--- a/core/fpdfdoc/include/cpdf_variabletext.h
+++ b/core/fpdfdoc/include/cpdf_variabletext.h
@@ -87,13 +87,9 @@
   CPDF_VariableText::Iterator* GetIterator();
 
   // CPDF_EditContainer.
-  void SetPlateRect(const CFX_FloatRect& rect) override {
-    CPDF_EditContainer::SetPlateRect(rect);
-  }
+  void SetPlateRect(const CFX_FloatRect& rect) override;
   CFX_FloatRect GetContentRect() const override;
-  const CFX_FloatRect& GetPlateRect() const override {
-    return CPDF_EditContainer::GetPlateRect();
-  }
+  const CFX_FloatRect& GetPlateRect() const override;
 
   void SetAlignment(int32_t nFormat = 0) { m_nAlignment = nFormat; }
   void SetPasswordChar(uint16_t wSubWord = '*') { m_wSubWord = wSubWord; }
@@ -108,8 +104,10 @@
   void SetRichText(FX_BOOL bRichText) { m_bRichText = bRichText; }
   void SetLineLeading(FX_FLOAT fLineLeading) { m_fLineLeading = fLineLeading; }
   void Initialize();
+
   FX_BOOL IsValid() const { return m_bInitial; }
   FX_BOOL IsRichText() const { return m_bRichText; }
+
   void RearrangeAll();
   void RearrangePart(const CPVT_WordRange& PlaceRange);
   void ResetAll();
diff --git a/core/fpdfdoc/include/cpvt_word.h b/core/fpdfdoc/include/cpvt_word.h
index 7d022dd..f7b7b23 100644
--- a/core/fpdfdoc/include/cpvt_word.h
+++ b/core/fpdfdoc/include/cpvt_word.h
@@ -12,15 +12,7 @@
 #include "core/fxcrt/include/fx_system.h"
 
 struct CPVT_Word {
-  CPVT_Word()
-      : Word(0),
-        nCharset(0),
-        ptWord(0, 0),
-        fAscent(0.0f),
-        fDescent(0.0f),
-        fWidth(0.0f),
-        fFontSize(0),
-        WordProps() {}
+  CPVT_Word();
 
   uint16_t Word;
   int32_t nCharset;
@@ -34,4 +26,14 @@
   CPVT_WordProps WordProps;
 };
 
+inline CPVT_Word::CPVT_Word()
+    : Word(0),
+      nCharset(0),
+      ptWord(0.0f, 0.0f),
+      fAscent(0.0f),
+      fDescent(0.0f),
+      fWidth(0.0f),
+      nFontIndex(-1),
+      fFontSize(0.0f) {}
+
 #endif  // CORE_FPDFDOC_INCLUDE_CPVT_WORD_H_
diff --git a/core/fpdfdoc/include/fpdf_doc.h b/core/fpdfdoc/include/fpdf_doc.h
index 2722003..afa5a30 100644
--- a/core/fpdfdoc/include/fpdf_doc.h
+++ b/core/fpdfdoc/include/fpdf_doc.h
@@ -738,7 +738,7 @@
   CPDF_InterForm* GetInterForm() const { return m_pForm; }
   CPDF_FormField* GetField() const { return m_pField; }
   CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; }
-  CFX_FloatRect GetRect() const;
+  CFX_FloatRect GetRect() const { return m_pWidgetDict->GetRectBy("Rect"); }
 
   void DrawControl(CFX_RenderDevice* pDevice,
                    CFX_Matrix* pMatrix,
@@ -756,9 +756,7 @@
   bool HasMKEntry(const CFX_ByteString& csEntry) const;
   int GetRotation();
 
-  inline FX_ARGB GetBorderColor(int& iColorType) {
-    return GetColor(iColorType, "BC");
-  }
+  FX_ARGB GetBorderColor(int& iColorType) { return GetColor(iColorType, "BC"); }
 
   FX_FLOAT GetOriginalBorderColor(int index) {
     return GetOriginalColor(index, "BC");
@@ -823,28 +821,24 @@
 
 class IPDF_FormNotify {
  public:
-  virtual ~IPDF_FormNotify() {}
+  virtual ~IPDF_FormNotify();
 
   virtual int BeforeValueChange(CPDF_FormField* pField,
-                                const CFX_WideString& csValue) {
-    return 0;
-  }
-  virtual void AfterValueChange(CPDF_FormField* pField) {}
+                                const CFX_WideString& csValue);
+  virtual void AfterValueChange(CPDF_FormField* pField);
   virtual int BeforeSelectionChange(CPDF_FormField* pField,
-                                    const CFX_WideString& csValue) {
-    return 0;
-  }
-  virtual void AfterSelectionChange(CPDF_FormField* pField) {}
-  virtual void AfterCheckedStatusChange(CPDF_FormField* pField) {}
-  virtual int BeforeFormReset(CPDF_InterForm* pForm) { return 0; }
-  virtual void AfterFormReset(CPDF_InterForm* pForm) {}
-  virtual int BeforeFormImportData(CPDF_InterForm* pForm) { return 0; }
-  virtual void AfterFormImportData(CPDF_InterForm* pForm) {}
+                                    const CFX_WideString& csValue);
+  virtual void AfterSelectionChange(CPDF_FormField* pField);
+  virtual void AfterCheckedStatusChange(CPDF_FormField* pField);
+  virtual int BeforeFormReset(CPDF_InterForm* pForm);
+  virtual void AfterFormReset(CPDF_InterForm* pForm);
+  virtual int BeforeFormImportData(CPDF_InterForm* pForm);
+  virtual void AfterFormImportData(CPDF_InterForm* pForm);
 };
 
 class CPDF_PageLabel {
  public:
-  explicit CPDF_PageLabel(CPDF_Document* pDocument) : m_pDocument(pDocument) {}
+  explicit CPDF_PageLabel(CPDF_Document* pDocument);
 
   CFX_WideString GetLabel(int nPage) const;
   int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const;
diff --git a/core/fpdfdoc/pdf_vt.h b/core/fpdfdoc/pdf_vt.h
index 3f06f7d..71e28da 100644
--- a/core/fpdfdoc/pdf_vt.h
+++ b/core/fpdfdoc/pdf_vt.h
@@ -49,54 +49,16 @@
   CPVT_LineInfo m_LineInfo;
 };
 
-class CLines final {
- public:
-  CLines() : m_nTotal(0) {}
-  ~CLines() { RemoveAll(); }
-
-  int32_t GetSize() const { return m_Lines.GetSize(); }
-  CLine* GetAt(int32_t nIndex) const { return m_Lines.GetAt(nIndex); }
-  void Empty() { m_nTotal = 0; }
-  void RemoveAll() {
-    for (int32_t i = 0, sz = GetSize(); i < sz; i++) {
-      delete GetAt(i);
-    }
-    m_Lines.RemoveAll();
-    m_nTotal = 0;
-  }
-  int32_t Add(const CPVT_LineInfo& lineinfo) {
-    if (m_nTotal >= GetSize()) {
-      CLine* pLine = new CLine;
-      pLine->m_LineInfo = lineinfo;
-      m_Lines.Add(pLine);
-    } else if (CLine* pLine = GetAt(m_nTotal)) {
-      pLine->m_LineInfo = lineinfo;
-    }
-    return m_nTotal++;
-  }
-  void Clear() {
-    for (int32_t i = GetSize() - 1; i >= m_nTotal; i--) {
-      delete GetAt(i);
-      m_Lines.RemoveAt(i);
-    }
-  }
-
- private:
-  CPVT_ArrayTemplate<CLine*> m_Lines;
-  int32_t m_nTotal;
-};
-
 class CPDF_EditContainer {
  public:
-  CPDF_EditContainer() : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {}
-  virtual ~CPDF_EditContainer() {}
+  CPDF_EditContainer();
+  virtual ~CPDF_EditContainer();
 
-  virtual void SetPlateRect(const CFX_FloatRect& rect) { m_rcPlate = rect; }
-  virtual const CFX_FloatRect& GetPlateRect() const { return m_rcPlate; }
-  virtual void SetContentRect(const CPVT_FloatRect& rect) {
-    m_rcContent = rect;
-  }
-  virtual CFX_FloatRect GetContentRect() const { return m_rcContent; }
+  virtual void SetPlateRect(const CFX_FloatRect& rect);
+  virtual const CFX_FloatRect& GetPlateRect() const;
+  virtual void SetContentRect(const CPVT_FloatRect& rect);
+  virtual CFX_FloatRect GetContentRect() const;
+
   FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; }
   FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; }
   CFX_SizeF GetPlateSize() const {
@@ -108,20 +70,20 @@
   CFX_FloatPoint GetETPoint() const {
     return CFX_FloatPoint(m_rcPlate.right, m_rcPlate.bottom);
   }
-  inline CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const {
+  CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const {
     return CFX_FloatPoint(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
   }
-  inline CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const {
+  CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const {
     return CFX_FloatPoint(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
   }
-  inline CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const {
+  CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const {
     CFX_FloatPoint ptLeftTop = InToOut(CFX_FloatPoint(rect.left, rect.top));
     CFX_FloatPoint ptRightBottom =
         InToOut(CFX_FloatPoint(rect.right, rect.bottom));
     return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x,
                          ptLeftTop.y);
   }
-  inline CPVT_FloatRect OutToIn(const CFX_FloatRect& rect) const {
+  CPVT_FloatRect OutToIn(const CFX_FloatRect& rect) const {
     CFX_FloatPoint ptLeftTop = OutToIn(CFX_FloatPoint(rect.left, rect.top));
     CFX_FloatPoint ptRightBottom =
         OutToIn(CFX_FloatPoint(rect.right, rect.bottom));
diff --git a/core/fpdfdoc/tagged_int.h b/core/fpdfdoc/tagged_int.h
index d508211..354a93c 100644
--- a/core/fpdfdoc/tagged_int.h
+++ b/core/fpdfdoc/tagged_int.h
@@ -50,15 +50,13 @@
                          CPDF_StructElementImpl* pParent,
                          CPDF_Dictionary* pDict);
 
-  // IPDF_StructElement:
-  IPDF_StructTree* GetTree() const override { return m_pTree; }
-  const CFX_ByteString& GetType() const override { return m_Type; }
-  IPDF_StructElement* GetParent() const override { return m_pParent; }
-  CPDF_Dictionary* GetDict() const override { return m_pDict; }
-  int CountKids() const override { return pdfium::CollectionSize<int>(m_Kids); }
-  const CPDF_StructKid& GetKid(int index) const override {
-    return m_Kids[index];
-  }
+  // IPDF_StructElement
+  IPDF_StructTree* GetTree() const override;
+  const CFX_ByteString& GetType() const override;
+  IPDF_StructElement* GetParent() const override;
+  CPDF_Dictionary* GetDict() const override;
+  int CountKids() const override;
+  const CPDF_StructKid& GetKid(int index) const override;
   CPDF_Object* GetAttr(const CFX_ByteStringC& owner,
                        const CFX_ByteStringC& name,
                        FX_BOOL bInheritable = FALSE,
diff --git a/core/fpdftext/fpdf_text_int.cpp b/core/fpdftext/fpdf_text_int.cpp
index 5be4714..565f078 100644
--- a/core/fpdftext/fpdf_text_int.cpp
+++ b/core/fpdftext/fpdf_text_int.cpp
@@ -150,13 +150,14 @@
       m_parserflag(flags),
       m_pPreTextObj(nullptr),
       m_bIsParsed(false),
-      m_TextlineDir(TextOrientation::Unknown),
-      m_CurlineRect(0, 0, 0, 0) {
+      m_TextlineDir(TextOrientation::Unknown) {
   m_TextBuf.EstimateSize(0, 10240);
   pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int)pPage->GetPageWidth(),
                           (int)pPage->GetPageHeight(), 0);
 }
 
+CPDF_TextPage::~CPDF_TextPage() {}
+
 bool CPDF_TextPage::IsControlChar(const PAGECHAR_INFO& charInfo) {
   switch (charInfo.m_Unicode) {
     case 0x2:
@@ -1829,6 +1830,8 @@
   }
 }
 
+CPDF_TextPageFind::~CPDF_TextPageFind() {}
+
 int CPDF_TextPageFind::GetCharIndex(int index) const {
   return m_pTextPage->CharIndexFromTextIndex(index);
 }
diff --git a/core/fpdftext/include/cpdf_textpage.h b/core/fpdftext/include/cpdf_textpage.h
index 0c1efdf..d414cbc 100644
--- a/core/fpdftext/include/cpdf_textpage.h
+++ b/core/fpdftext/include/cpdf_textpage.h
@@ -61,11 +61,8 @@
 
 class CPDF_TextPage {
  public:
-  static FX_BOOL IsRectIntersect(const CFX_FloatRect& rect1,
-                                 const CFX_FloatRect& rect2);
-
   CPDF_TextPage(const CPDF_Page* pPage, FPDFText_Direction flags);
-  ~CPDF_TextPage() {}
+  ~CPDF_TextPage();
 
   // IPDF_TextPage:
   void ParseTextPage();
@@ -98,6 +95,9 @@
                            FX_FLOAT bottom,
                            FX_BOOL bContains = FALSE);
 
+  static FX_BOOL IsRectIntersect(const CFX_FloatRect& rect1,
+                                 const CFX_FloatRect& rect2);
+
  private:
   enum class TextOrientation {
     Unknown,
diff --git a/core/fpdftext/include/cpdf_textpagefind.h b/core/fpdftext/include/cpdf_textpagefind.h
index d993777..4950bd1 100644
--- a/core/fpdftext/include/cpdf_textpagefind.h
+++ b/core/fpdftext/include/cpdf_textpagefind.h
@@ -18,7 +18,7 @@
 class CPDF_TextPageFind {
  public:
   explicit CPDF_TextPageFind(const CPDF_TextPage* pTextPage);
-  ~CPDF_TextPageFind() {}
+  ~CPDF_TextPageFind();
 
   FX_BOOL FindFirst(const CFX_WideString& findwhat,
                     int flags,
@@ -38,10 +38,6 @@
                            int iSubString,
                            FX_WCHAR chSep);
   CFX_WideString MakeReverse(const CFX_WideString& str);
-  int ReverseFind(const CFX_WideString& csPageText,
-                  const CFX_WideString& csWord,
-                  int nStartPos,
-                  int& WordLength);
   int GetCharIndex(int index) const;
 
  private:
diff --git a/core/fxcodec/codec/ccodec_iccmodule.h b/core/fxcodec/codec/ccodec_iccmodule.h
index 822b202..fd2f456 100644
--- a/core/fxcodec/codec/ccodec_iccmodule.h
+++ b/core/fxcodec/codec/ccodec_iccmodule.h
@@ -43,6 +43,7 @@
     double Gamma;
   };
 
+  CCodec_IccModule();
   ~CCodec_IccModule();
 
   IccCS GetProfileCS(const uint8_t* pProfileData, unsigned int dwProfileSize);
diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp
index 55cb6ee..1995784 100644
--- a/core/fxcodec/codec/fx_codec.cpp
+++ b/core/fxcodec/codec/fx_codec.cpp
@@ -31,6 +31,8 @@
       m_pFlateModule(new CCodec_FlateModule) {
 }
 
+CCodec_ModuleMgr::~CCodec_ModuleMgr() {}
+
 CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()
     : m_NextLine(-1), m_pLastScanline(nullptr) {}
 
diff --git a/core/fxcodec/codec/fx_codec_icc.cpp b/core/fxcodec/codec/fx_codec_icc.cpp
index 4903c24..29cfe0e 100644
--- a/core/fxcodec/codec/fx_codec_icc.cpp
+++ b/core/fxcodec/codec/fx_codec_icc.cpp
@@ -526,6 +526,9 @@
   }
   return pTransformCache->m_pCmm;
 }
+
+CCodec_IccModule::CCodec_IccModule() : m_nComponents(0) {}
+
 CCodec_IccModule::~CCodec_IccModule() {
   for (const auto& pair : m_MapProfile) {
     delete pair.second;
diff --git a/core/fxcodec/include/fx_codec.h b/core/fxcodec/include/fx_codec.h
index 4853e26..8621db2 100644
--- a/core/fxcodec/include/fx_codec.h
+++ b/core/fxcodec/include/fx_codec.h
@@ -59,6 +59,7 @@
 class CCodec_ModuleMgr {
  public:
   CCodec_ModuleMgr();
+  ~CCodec_ModuleMgr();
 
   CCodec_BasicModule* GetBasicModule() const { return m_pBasicModule.get(); }
   CCodec_FaxModule* GetFaxModule() const { return m_pFaxModule.get(); }
diff --git a/core/fxcodec/lgif/fx_gif.cpp b/core/fxcodec/lgif/fx_gif.cpp
index b9ea090..d6db28b 100644
--- a/core/fxcodec/lgif/fx_gif.cpp
+++ b/core/fxcodec/lgif/fx_gif.cpp
@@ -12,9 +12,28 @@
   next_in = src_buf;
   avail_in = src_size;
 }
+
 uint32_t CGifLZWDecoder::GetAvailInput() {
   return avail_in;
 }
+
+CGifLZWDecoder::CGifLZWDecoder(FX_CHAR* error_ptr)
+    : code_size(0),
+      code_size_cur(0),
+      code_clear(0),
+      code_end(0),
+      code_next(0),
+      code_first(0),
+      stack_size(0),
+      code_old(0),
+      next_in(nullptr),
+      avail_in(0),
+      bits_left(0),
+      code_store(0),
+      err_msg_ptr(error_ptr) {}
+
+CGifLZWDecoder::~CGifLZWDecoder() {}
+
 void CGifLZWDecoder::InitTable(uint8_t code_len) {
   code_size = code_len;
   code_clear = 1 << code_size;
diff --git a/core/fxcodec/lgif/fx_gif.h b/core/fxcodec/lgif/fx_gif.h
index 7d325fb..b7157df 100644
--- a/core/fxcodec/lgif/fx_gif.h
+++ b/core/fxcodec/lgif/fx_gif.h
@@ -107,22 +107,25 @@
   uint8_t* image_row_buf;
   int32_t image_row_num;
 } GifImage;
+
 typedef struct tagGifPlainText {
   GifGCE* gce_ptr;
   GifPTE* pte_ptr;
   CFX_ByteString* string_ptr;
 } GifPlainText;
+
 class CGifLZWDecoder {
  public:
   struct tag_Table {
     uint16_t prefix;
     uint8_t suffix;
   };
-  CGifLZWDecoder(FX_CHAR* error_ptr = nullptr) { err_msg_ptr = error_ptr; }
+
+  explicit CGifLZWDecoder(FX_CHAR* error_ptr);
+  ~CGifLZWDecoder();
+
   void InitTable(uint8_t code_len);
-
   int32_t Decode(uint8_t* des_buf, uint32_t& des_size);
-
   void Input(uint8_t* src_buf, uint32_t src_size);
   uint32_t GetAvailInput();
 
@@ -130,6 +133,7 @@
   void ClearTable();
   void AddCode(uint16_t prefix_code, uint8_t append_char);
   void DecodeString(uint16_t code);
+
   uint8_t code_size;
   uint8_t code_size_cur;
   uint16_t code_clear;
@@ -149,14 +153,17 @@
 
   FX_CHAR* err_msg_ptr;
 };
+
 class CGifLZWEncoder {
  public:
   struct tag_Table {
     uint16_t prefix;
     uint8_t suffix;
   };
+
   CGifLZWEncoder();
   ~CGifLZWEncoder();
+
   void Start(uint8_t code_len,
              const uint8_t* src_buf,
              uint8_t*& dst_buf,
@@ -178,6 +185,7 @@
                     uint32_t& dst_len,
                     uint32_t& offset);
   void WriteBlock(uint8_t*& dst_buf, uint32_t& dst_len, uint32_t& offset);
+
   jmp_buf jmp;
   uint32_t src_offset;
   uint8_t src_bit_offset;
@@ -194,6 +202,7 @@
   tag_Table code_table[GIF_MAX_LZW_CODE];
   uint16_t table_cur;
 };
+
 typedef struct tag_gif_decompress_struct gif_decompress_struct;
 typedef gif_decompress_struct* gif_decompress_struct_p;
 typedef gif_decompress_struct_p* gif_decompress_struct_pp;
diff --git a/core/fxcrt/extension.h b/core/fxcrt/extension.h
index 877f1ca..d4fd093 100644
--- a/core/fxcrt/extension.h
+++ b/core/fxcrt/extension.h
@@ -37,30 +37,16 @@
 #ifdef PDF_ENABLE_XFA
 class CFX_CRTFileAccess : public IFX_FileAccess {
  public:
-  CFX_CRTFileAccess() : m_RefCount(0) {}
+  CFX_CRTFileAccess();
+  ~CFX_CRTFileAccess() override;
 
   // IFX_FileAccess
-  void Release() override {
-    if (--m_RefCount == 0)
-      delete this;
-  }
+  void Release() override;
+  IFX_FileAccess* Retain() override;
+  void GetPath(CFX_WideString& wsPath) override;
+  IFX_FileStream* CreateFileStream(uint32_t dwModes) override;
 
-  IFX_FileAccess* Retain() override {
-    m_RefCount++;
-    return this;
-  }
-
-  void GetPath(CFX_WideString& wsPath) override { wsPath = m_path; }
-
-  IFX_FileStream* CreateFileStream(uint32_t dwModes) override {
-    return FX_CreateFileStream(m_path.c_str(), dwModes);
-  }
-
-  FX_BOOL Init(const CFX_WideStringC& wsPath) {
-    m_path = wsPath;
-    m_RefCount = 1;
-    return TRUE;
-  }
+  FX_BOOL Init(const CFX_WideStringC& wsPath);
 
  protected:
   CFX_WideString m_path;
@@ -96,190 +82,29 @@
 #define FX_MEMSTREAM_TakeOver 0x02
 class CFX_MemoryStream final : public IFX_MemoryStream {
  public:
-  explicit CFX_MemoryStream(FX_BOOL bConsecutive)
-      : m_dwCount(1),
-        m_nTotalSize(0),
-        m_nCurSize(0),
-        m_nCurPos(0),
-        m_nGrowSize(FX_MEMSTREAM_BlockSize) {
-    m_dwFlags =
-        FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
-  }
-  CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, FX_BOOL bTakeOver)
-      : m_dwCount(1),
-        m_nTotalSize(nSize),
-        m_nCurSize(nSize),
-        m_nCurPos(0),
-        m_nGrowSize(FX_MEMSTREAM_BlockSize) {
-    m_Blocks.Add(pBuffer);
-    m_dwFlags =
-        FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
-  }
-  ~CFX_MemoryStream() override {
-    if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
-      for (int32_t i = 0; i < m_Blocks.GetSize(); i++) {
-        FX_Free(m_Blocks[i]);
-      }
-    }
-    m_Blocks.RemoveAll();
-  }
+  explicit CFX_MemoryStream(FX_BOOL bConsecutive);
+  CFX_MemoryStream(uint8_t* pBuffer, size_t nSize, FX_BOOL bTakeOver);
+  ~CFX_MemoryStream() override;
 
-  // IFX_MemoryStream:
-  IFX_FileStream* Retain() override {
-    m_dwCount++;
-    return this;
-  }
-  void Release() override {
-    uint32_t nCount = --m_dwCount;
-    if (nCount) {
-      return;
-    }
-    delete this;
-  }
-  FX_FILESIZE GetSize() override { return (FX_FILESIZE)m_nCurSize; }
-  FX_BOOL IsEOF() override { return m_nCurPos >= (size_t)GetSize(); }
-  FX_FILESIZE GetPosition() override { return (FX_FILESIZE)m_nCurPos; }
-  FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override {
-    if (!buffer || !size) {
-      return FALSE;
-    }
-
-    FX_SAFE_SIZE_T newPos = size;
-    newPos += offset;
-    if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 ||
-        newPos.ValueOrDie() > m_nCurSize) {
-      return FALSE;
-    }
-
-    m_nCurPos = newPos.ValueOrDie();
-    if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-      FXSYS_memcpy(buffer, m_Blocks[0] + (size_t)offset, size);
-      return TRUE;
-    }
-    size_t nStartBlock = (size_t)offset / m_nGrowSize;
-    offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
-    while (size) {
-      size_t nRead = m_nGrowSize - (size_t)offset;
-      if (nRead > size) {
-        nRead = size;
-      }
-      FXSYS_memcpy(buffer, m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
-      buffer = ((uint8_t*)buffer) + nRead;
-      size -= nRead;
-      nStartBlock++;
-      offset = 0;
-    }
-    return TRUE;
-  }
-  size_t ReadBlock(void* buffer, size_t size) override {
-    if (m_nCurPos >= m_nCurSize) {
-      return 0;
-    }
-    size_t nRead = std::min(size, m_nCurSize - m_nCurPos);
-    if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) {
-      return 0;
-    }
-    return nRead;
-  }
+  // IFX_MemoryStream
+  IFX_FileStream* Retain() override;
+  void Release() override;
+  FX_FILESIZE GetSize() override;
+  FX_BOOL IsEOF() override;
+  FX_FILESIZE GetPosition() override;
+  FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
+  size_t ReadBlock(void* buffer, size_t size) override;
   FX_BOOL WriteBlock(const void* buffer,
                      FX_FILESIZE offset,
-                     size_t size) override {
-    if (!buffer || !size) {
-      return FALSE;
-    }
-    if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-      FX_SAFE_SIZE_T newPos = size;
-      newPos += offset;
-      if (!newPos.IsValid())
-        return FALSE;
-
-      m_nCurPos = newPos.ValueOrDie();
-      if (m_nCurPos > m_nTotalSize) {
-        m_nTotalSize =
-            (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
-        if (m_Blocks.GetSize() < 1) {
-          uint8_t* block = FX_Alloc(uint8_t, m_nTotalSize);
-          m_Blocks.Add(block);
-        } else {
-          m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize);
-        }
-        if (!m_Blocks[0]) {
-          m_Blocks.RemoveAll();
-          return FALSE;
-        }
-      }
-      FXSYS_memcpy(m_Blocks[0] + (size_t)offset, buffer, size);
-      if (m_nCurSize < m_nCurPos) {
-        m_nCurSize = m_nCurPos;
-      }
-      return TRUE;
-    }
-
-    FX_SAFE_SIZE_T newPos = size;
-    newPos += offset;
-    if (!newPos.IsValid()) {
-      return FALSE;
-    }
-
-    if (!ExpandBlocks(newPos.ValueOrDie())) {
-      return FALSE;
-    }
-    m_nCurPos = newPos.ValueOrDie();
-    size_t nStartBlock = (size_t)offset / m_nGrowSize;
-    offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
-    while (size) {
-      size_t nWrite = m_nGrowSize - (size_t)offset;
-      if (nWrite > size) {
-        nWrite = size;
-      }
-      FXSYS_memcpy(m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
-      buffer = ((uint8_t*)buffer) + nWrite;
-      size -= nWrite;
-      nStartBlock++;
-      offset = 0;
-    }
-    return TRUE;
-  }
-  FX_BOOL Flush() override { return TRUE; }
-  FX_BOOL IsConsecutive() const override {
-    return !!(m_dwFlags & FX_MEMSTREAM_Consecutive);
-  }
-  void EstimateSize(size_t nInitSize, size_t nGrowSize) override {
-    if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
-      if (m_Blocks.GetSize() < 1) {
-        uint8_t* pBlock =
-            FX_Alloc(uint8_t, std::max(nInitSize, static_cast<size_t>(4096)));
-        m_Blocks.Add(pBlock);
-      }
-      m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
-    } else if (m_Blocks.GetSize() < 1) {
-      m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
-    }
-  }
-  uint8_t* GetBuffer() const override {
-    return m_Blocks.GetSize() ? m_Blocks[0] : nullptr;
-  }
+                     size_t size) override;
+  FX_BOOL Flush() override;
+  FX_BOOL IsConsecutive() const override;
+  void EstimateSize(size_t nInitSize, size_t nGrowSize) override;
+  uint8_t* GetBuffer() const override;
   void AttachBuffer(uint8_t* pBuffer,
                     size_t nSize,
-                    FX_BOOL bTakeOver = FALSE) override {
-    if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
-      return;
-    }
-    m_Blocks.RemoveAll();
-    m_Blocks.Add(pBuffer);
-    m_nTotalSize = m_nCurSize = nSize;
-    m_nCurPos = 0;
-    m_dwFlags =
-        FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
-  }
-  void DetachBuffer() override {
-    if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
-      return;
-    }
-    m_Blocks.RemoveAll();
-    m_nTotalSize = m_nCurSize = m_nCurPos = 0;
-    m_dwFlags = FX_MEMSTREAM_TakeOver;
-  }
+                    FX_BOOL bTakeOver = FALSE) override;
+  void DetachBuffer() override;
 
  protected:
   CFX_ArrayTemplate<uint8_t*> m_Blocks;
@@ -289,23 +114,7 @@
   size_t m_nCurPos;
   size_t m_nGrowSize;
   uint32_t m_dwFlags;
-  FX_BOOL ExpandBlocks(size_t size) {
-    if (m_nCurSize < size) {
-      m_nCurSize = size;
-    }
-    if (size <= m_nTotalSize) {
-      return TRUE;
-    }
-    int32_t iCount = m_Blocks.GetSize();
-    size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
-    m_Blocks.SetSize(m_Blocks.GetSize() + (int32_t)size);
-    while (size--) {
-      uint8_t* pBlock = FX_Alloc(uint8_t, m_nGrowSize);
-      m_Blocks.SetAt(iCount++, pBlock);
-      m_nTotalSize += m_nGrowSize;
-    }
-    return TRUE;
-  }
+  FX_BOOL ExpandBlocks(size_t size);
 };
 
 #ifdef __cplusplus
diff --git a/core/fxcrt/fx_basic_bstring.cpp b/core/fxcrt/fx_basic_bstring.cpp
index 379f1ee..d0ba1af 100644
--- a/core/fxcrt/fx_basic_bstring.cpp
+++ b/core/fxcrt/fx_basic_bstring.cpp
@@ -94,11 +94,23 @@
   }
 }
 
+CFX_ByteString::CFX_ByteString() {}
+
+CFX_ByteString::CFX_ByteString(const CFX_ByteString& other)
+    : m_pData(other.m_pData) {}
+
+CFX_ByteString::CFX_ByteString(CFX_ByteString&& other) {
+  m_pData.Swap(other.m_pData);
+}
+
 CFX_ByteString::CFX_ByteString(char ch) {
   m_pData.Reset(StringData::Create(1));
   m_pData->m_String[0] = ch;
 }
 
+CFX_ByteString::CFX_ByteString(const FX_CHAR* ptr)
+    : CFX_ByteString(ptr, ptr ? FXSYS_strlen(ptr) : 0) {}
+
 CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& stringSrc) {
   if (!stringSrc.IsEmpty())
     m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength()));
diff --git a/core/fxcrt/fx_basic_util.cpp b/core/fxcrt/fx_basic_util.cpp
index 8eba2cc..b9cf470 100644
--- a/core/fxcrt/fx_basic_util.cpp
+++ b/core/fxcrt/fx_basic_util.cpp
@@ -117,14 +117,16 @@
   HANDLE m_Handle;
   FX_BOOL m_bEnd;
 };
+
 class CFindFileDataA : public CFindFileData {
  public:
-  virtual ~CFindFileDataA() {}
+  ~CFindFileDataA() override {}
   WIN32_FIND_DATAA m_FindData;
 };
+
 class CFindFileDataW : public CFindFileData {
  public:
-  virtual ~CFindFileDataW() {}
+  ~CFindFileDataW() override {}
   WIN32_FIND_DATAW m_FindData;
 };
 #endif
diff --git a/core/fxcrt/fx_basic_wstring.cpp b/core/fxcrt/fx_basic_wstring.cpp
index ba86823..8837c6b 100644
--- a/core/fxcrt/fx_basic_wstring.cpp
+++ b/core/fxcrt/fx_basic_wstring.cpp
@@ -63,6 +63,15 @@
 static_assert(sizeof(CFX_WideString) <= sizeof(FX_WCHAR*),
               "Strings must not require more space than pointers");
 
+CFX_WideString::CFX_WideString() {}
+
+CFX_WideString::CFX_WideString(const CFX_WideString& other)
+    : m_pData(other.m_pData) {}
+
+CFX_WideString::CFX_WideString(CFX_WideString&& other) {
+  m_pData.Swap(other.m_pData);
+}
+
 CFX_WideString::CFX_WideString(const FX_WCHAR* pStr, FX_STRSIZE nLen) {
   if (nLen < 0)
     nLen = pStr ? FXSYS_wcslen(pStr) : 0;
@@ -76,6 +85,9 @@
   m_pData->m_String[0] = ch;
 }
 
+CFX_WideString::CFX_WideString(const FX_WCHAR* ptr)
+    : CFX_WideString(ptr, ptr ? FXSYS_wcslen(ptr) : 0) {}
+
 CFX_WideString::CFX_WideString(const CFX_WideStringC& stringSrc) {
   if (!stringSrc.IsEmpty()) {
     m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength()));
diff --git a/core/fxcrt/fx_bidi.cpp b/core/fxcrt/fx_bidi.cpp
index d8a8f88..f1d162d 100644
--- a/core/fxcrt/fx_bidi.cpp
+++ b/core/fxcrt/fx_bidi.cpp
@@ -73,6 +73,8 @@
     SetOverallDirectionRight();
 }
 
+CFX_BidiString::~CFX_BidiString() {}
+
 void CFX_BidiString::SetOverallDirectionRight() {
   if (m_eOverallDirection != CFX_BidiChar::RIGHT) {
     std::reverse(m_Order.begin(), m_Order.end());
diff --git a/core/fxcrt/fx_bidi.h b/core/fxcrt/fx_bidi.h
index 309c6f5..ad5fb27 100644
--- a/core/fxcrt/fx_bidi.h
+++ b/core/fxcrt/fx_bidi.h
@@ -49,7 +49,9 @@
 class CFX_BidiString {
  public:
   using const_iterator = std::vector<CFX_BidiChar::Segment>::const_iterator;
+
   explicit CFX_BidiString(const CFX_WideString& str);
+  ~CFX_BidiString();
 
   // Overall direction is always LEFT or RIGHT, never NEUTRAL.
   CFX_BidiChar::Direction OverallDirection() const {
diff --git a/core/fxcrt/fx_extension.cpp b/core/fxcrt/fx_extension.cpp
index 1a95e8c3..4c77244 100644
--- a/core/fxcrt/fx_extension.cpp
+++ b/core/fxcrt/fx_extension.cpp
@@ -16,11 +16,271 @@
 #include <ctime>
 #endif
 
+#ifdef PDF_ENABLE_XFA
+
+CFX_CRTFileAccess::CFX_CRTFileAccess() : m_RefCount(0) {}
+
+CFX_CRTFileAccess::~CFX_CRTFileAccess() {}
+
+void CFX_CRTFileAccess::Release() {
+  if (--m_RefCount == 0)
+    delete this;
+}
+
+IFX_FileAccess* CFX_CRTFileAccess::Retain() {
+  m_RefCount++;
+  return (IFX_FileAccess*)this;
+}
+
+void CFX_CRTFileAccess::GetPath(CFX_WideString& wsPath) {
+  wsPath = m_path;
+}
+
+IFX_FileStream* CFX_CRTFileAccess::CreateFileStream(uint32_t dwModes) {
+  return FX_CreateFileStream(m_path.c_str(), dwModes);
+}
+
+FX_BOOL CFX_CRTFileAccess::Init(const CFX_WideStringC& wsPath) {
+  m_path = wsPath;
+  m_RefCount = 1;
+  return TRUE;
+}
+
+#endif  // PDF_ENABLE_XFA
+
 CFX_CRTFileStream::CFX_CRTFileStream(std::unique_ptr<IFXCRT_FileAccess> pFA)
     : m_pFile(std::move(pFA)), m_dwCount(1) {}
 
 CFX_CRTFileStream::~CFX_CRTFileStream() {}
 
+CFX_MemoryStream::CFX_MemoryStream(FX_BOOL bConsecutive)
+    : m_dwCount(1),
+      m_nTotalSize(0),
+      m_nCurSize(0),
+      m_nCurPos(0),
+      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
+  m_dwFlags =
+      FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
+}
+
+CFX_MemoryStream::CFX_MemoryStream(uint8_t* pBuffer,
+                                   size_t nSize,
+                                   FX_BOOL bTakeOver)
+    : m_dwCount(1),
+      m_nTotalSize(nSize),
+      m_nCurSize(nSize),
+      m_nCurPos(0),
+      m_nGrowSize(FX_MEMSTREAM_BlockSize) {
+  m_Blocks.Add(pBuffer);
+  m_dwFlags =
+      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+}
+
+CFX_MemoryStream::~CFX_MemoryStream() {
+  if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
+    for (int32_t i = 0; i < m_Blocks.GetSize(); i++) {
+      FX_Free(m_Blocks[i]);
+    }
+  }
+  m_Blocks.RemoveAll();
+}
+
+IFX_FileStream* CFX_MemoryStream::Retain() {
+  m_dwCount++;
+  return this;
+}
+
+void CFX_MemoryStream::Release() {
+  uint32_t nCount = --m_dwCount;
+  if (nCount) {
+    return;
+  }
+  delete this;
+}
+
+FX_FILESIZE CFX_MemoryStream::GetSize() {
+  return (FX_FILESIZE)m_nCurSize;
+}
+
+FX_BOOL CFX_MemoryStream::IsEOF() {
+  return m_nCurPos >= (size_t)GetSize();
+}
+
+FX_FILESIZE CFX_MemoryStream::GetPosition() {
+  return (FX_FILESIZE)m_nCurPos;
+}
+
+FX_BOOL CFX_MemoryStream::ReadBlock(void* buffer,
+                                    FX_FILESIZE offset,
+                                    size_t size) {
+  if (!buffer || !size) {
+    return FALSE;
+  }
+
+  FX_SAFE_SIZE_T newPos = size;
+  newPos += offset;
+  if (!newPos.IsValid() || newPos.ValueOrDefault(0) == 0 ||
+      newPos.ValueOrDie() > m_nCurSize) {
+    return FALSE;
+  }
+
+  m_nCurPos = newPos.ValueOrDie();
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    FXSYS_memcpy(buffer, m_Blocks[0] + (size_t)offset, size);
+    return TRUE;
+  }
+  size_t nStartBlock = (size_t)offset / m_nGrowSize;
+  offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+  while (size) {
+    size_t nRead = m_nGrowSize - (size_t)offset;
+    if (nRead > size) {
+      nRead = size;
+    }
+    FXSYS_memcpy(buffer, m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
+    buffer = ((uint8_t*)buffer) + nRead;
+    size -= nRead;
+    nStartBlock++;
+    offset = 0;
+  }
+  return TRUE;
+}
+
+size_t CFX_MemoryStream::ReadBlock(void* buffer, size_t size) {
+  if (m_nCurPos >= m_nCurSize) {
+    return 0;
+  }
+  size_t nRead = std::min(size, m_nCurSize - m_nCurPos);
+  if (!ReadBlock(buffer, (int32_t)m_nCurPos, nRead)) {
+    return 0;
+  }
+  return nRead;
+}
+
+FX_BOOL CFX_MemoryStream::WriteBlock(const void* buffer,
+                                     FX_FILESIZE offset,
+                                     size_t size) {
+  if (!buffer || !size) {
+    return FALSE;
+  }
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    FX_SAFE_SIZE_T newPos = size;
+    newPos += offset;
+    if (!newPos.IsValid())
+      return FALSE;
+
+    m_nCurPos = newPos.ValueOrDie();
+    if (m_nCurPos > m_nTotalSize) {
+      m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
+      if (m_Blocks.GetSize() < 1) {
+        uint8_t* block = FX_Alloc(uint8_t, m_nTotalSize);
+        m_Blocks.Add(block);
+      } else {
+        m_Blocks[0] = FX_Realloc(uint8_t, m_Blocks[0], m_nTotalSize);
+      }
+      if (!m_Blocks[0]) {
+        m_Blocks.RemoveAll();
+        return FALSE;
+      }
+    }
+    FXSYS_memcpy(m_Blocks[0] + (size_t)offset, buffer, size);
+    if (m_nCurSize < m_nCurPos) {
+      m_nCurSize = m_nCurPos;
+    }
+    return TRUE;
+  }
+
+  FX_SAFE_SIZE_T newPos = size;
+  newPos += offset;
+  if (!newPos.IsValid()) {
+    return FALSE;
+  }
+
+  if (!ExpandBlocks(newPos.ValueOrDie())) {
+    return FALSE;
+  }
+  m_nCurPos = newPos.ValueOrDie();
+  size_t nStartBlock = (size_t)offset / m_nGrowSize;
+  offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+  while (size) {
+    size_t nWrite = m_nGrowSize - (size_t)offset;
+    if (nWrite > size) {
+      nWrite = size;
+    }
+    FXSYS_memcpy(m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
+    buffer = ((uint8_t*)buffer) + nWrite;
+    size -= nWrite;
+    nStartBlock++;
+    offset = 0;
+  }
+  return TRUE;
+}
+
+FX_BOOL CFX_MemoryStream::Flush() {
+  return TRUE;
+}
+
+FX_BOOL CFX_MemoryStream::IsConsecutive() const {
+  return !!(m_dwFlags & FX_MEMSTREAM_Consecutive);
+}
+
+void CFX_MemoryStream::EstimateSize(size_t nInitSize, size_t nGrowSize) {
+  if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+    if (m_Blocks.GetSize() < 1) {
+      uint8_t* pBlock =
+          FX_Alloc(uint8_t, std::max(nInitSize, static_cast<size_t>(4096)));
+      m_Blocks.Add(pBlock);
+    }
+    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
+  } else if (m_Blocks.GetSize() < 1) {
+    m_nGrowSize = std::max(nGrowSize, static_cast<size_t>(4096));
+  }
+}
+
+uint8_t* CFX_MemoryStream::GetBuffer() const {
+  return m_Blocks.GetSize() ? m_Blocks[0] : nullptr;
+}
+
+void CFX_MemoryStream::AttachBuffer(uint8_t* pBuffer,
+                                    size_t nSize,
+                                    FX_BOOL bTakeOver) {
+  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+    return;
+  }
+  m_Blocks.RemoveAll();
+  m_Blocks.Add(pBuffer);
+  m_nTotalSize = m_nCurSize = nSize;
+  m_nCurPos = 0;
+  m_dwFlags =
+      FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+}
+
+void CFX_MemoryStream::DetachBuffer() {
+  if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+    return;
+  }
+  m_Blocks.RemoveAll();
+  m_nTotalSize = m_nCurSize = m_nCurPos = 0;
+  m_dwFlags = FX_MEMSTREAM_TakeOver;
+}
+
+FX_BOOL CFX_MemoryStream::ExpandBlocks(size_t size) {
+  if (m_nCurSize < size) {
+    m_nCurSize = size;
+  }
+  if (size <= m_nTotalSize) {
+    return TRUE;
+  }
+  int32_t iCount = m_Blocks.GetSize();
+  size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
+  m_Blocks.SetSize(m_Blocks.GetSize() + (int32_t)size);
+  while (size--) {
+    uint8_t* pBlock = FX_Alloc(uint8_t, m_nGrowSize);
+    m_Blocks.SetAt(iCount++, pBlock);
+    m_nTotalSize += m_nGrowSize;
+  }
+  return TRUE;
+}
+
 IFX_FileStream* CFX_CRTFileStream::Retain() {
   m_dwCount++;
   return this;
diff --git a/core/fxcrt/fx_xml_parser.cpp b/core/fxcrt/fx_xml_parser.cpp
index 6017bd8..9412cdd 100644
--- a/core/fxcrt/fx_xml_parser.cpp
+++ b/core/fxcrt/fx_xml_parser.cpp
@@ -12,11 +12,121 @@
 #include "core/fxcrt/include/fx_xml.h"
 #include "third_party/base/stl_util.h"
 
+CXML_DataBufAcc::CXML_DataBufAcc(const uint8_t* pBuffer, size_t size)
+    : m_pBuffer(pBuffer), m_dwSize(size), m_dwCurPos(0) {}
+
+CXML_DataBufAcc::~CXML_DataBufAcc() {}
+
+void CXML_DataBufAcc::Release() {
+  delete this;
+}
+
+FX_BOOL CXML_DataBufAcc::IsEOF() {
+  return m_dwCurPos >= m_dwSize;
+}
+
+FX_FILESIZE CXML_DataBufAcc::GetPosition() {
+  return (FX_FILESIZE)m_dwCurPos;
+}
+
+size_t CXML_DataBufAcc::ReadBlock(void* buffer, size_t size) {
+  return 0;
+}
+
+FX_BOOL CXML_DataBufAcc::ReadNextBlock(FX_BOOL bRestart) {
+  if (bRestart) {
+    m_dwCurPos = 0;
+  }
+  if (m_dwCurPos < m_dwSize) {
+    m_dwCurPos = m_dwSize;
+    return TRUE;
+  }
+  return FALSE;
+}
+
+const uint8_t* CXML_DataBufAcc::GetBlockBuffer() {
+  return m_pBuffer;
+}
+
+size_t CXML_DataBufAcc::GetBlockSize() {
+  return m_dwSize;
+}
+
+FX_FILESIZE CXML_DataBufAcc::GetBlockOffset() {
+  return 0;
+}
+
+CXML_DataStmAcc::CXML_DataStmAcc(IFX_FileRead* pFileRead)
+    : m_pFileRead(pFileRead), m_pBuffer(nullptr), m_nStart(0), m_dwSize(0) {
+  ASSERT(m_pFileRead);
+}
+
+CXML_DataStmAcc::~CXML_DataStmAcc() {
+  FX_Free(m_pBuffer);
+}
+
+void CXML_DataStmAcc::Release() {
+  delete this;
+}
+
+FX_BOOL CXML_DataStmAcc::IsEOF() {
+  return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
+}
+
+FX_FILESIZE CXML_DataStmAcc::GetPosition() {
+  return m_nStart + (FX_FILESIZE)m_dwSize;
+}
+
+size_t CXML_DataStmAcc::ReadBlock(void* buffer, size_t size) {
+  return 0;
+}
+
+FX_BOOL CXML_DataStmAcc::ReadNextBlock(FX_BOOL bRestart) {
+  if (bRestart) {
+    m_nStart = 0;
+  }
+  FX_FILESIZE nLength = m_pFileRead->GetSize();
+  m_nStart += (FX_FILESIZE)m_dwSize;
+  if (m_nStart >= nLength) {
+    return FALSE;
+  }
+  static const FX_FILESIZE FX_XMLDATASTREAM_BufferSize = 32 * 1024;
+  m_dwSize = static_cast<size_t>(
+      std::min(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart));
+  if (!m_pBuffer) {
+    m_pBuffer = FX_Alloc(uint8_t, m_dwSize);
+  }
+  return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
+}
+
+const uint8_t* CXML_DataStmAcc::GetBlockBuffer() {
+  return (const uint8_t*)m_pBuffer;
+}
+
+size_t CXML_DataStmAcc::GetBlockSize() {
+  return m_dwSize;
+}
+
+FX_FILESIZE CXML_DataStmAcc::GetBlockOffset() {
+  return m_nStart;
+}
+
+CXML_Parser::CXML_Parser()
+    : m_pDataAcc(nullptr),
+      m_bOwnedStream(FALSE),
+      m_nOffset(0),
+      m_bSaveSpaceChars(FALSE),
+      m_pBuffer(nullptr),
+      m_dwBufferSize(0),
+      m_nBufferOffset(0),
+      m_dwIndex(0) {}
+
 CXML_Parser::~CXML_Parser() {
   if (m_bOwnedStream) {
     m_pDataAcc->Release();
   }
 }
+
 FX_BOOL CXML_Parser::Init(uint8_t* pBuffer, size_t size) {
   m_pDataAcc = new CXML_DataBufAcc(pBuffer, size);
   return Init(TRUE);
@@ -764,6 +874,10 @@
   return (space.IsEmpty() || m_QSpaceName == space) && m_AttrName == name;
 }
 
+CXML_AttrMap::CXML_AttrMap() {}
+
+CXML_AttrMap::~CXML_AttrMap() {}
+
 const CFX_WideString* CXML_AttrMap::Lookup(const CFX_ByteString& space,
                                            const CFX_ByteString& name) const {
   if (!m_pMap)
diff --git a/core/fxcrt/include/fx_string.h b/core/fxcrt/include/fx_string.h
index 142f937..b0a89fd 100644
--- a/core/fxcrt/include/fx_string.h
+++ b/core/fxcrt/include/fx_string.h
@@ -34,14 +34,13 @@
  public:
   using CharType = FX_CHAR;
 
-  CFX_ByteString() {}
-  CFX_ByteString(const CFX_ByteString& other) : m_pData(other.m_pData) {}
-  CFX_ByteString(CFX_ByteString&& other) { m_pData.Swap(other.m_pData); }
+  CFX_ByteString();
+  CFX_ByteString(const CFX_ByteString& other);
+  CFX_ByteString(CFX_ByteString&& other);
 
   // Deliberately implicit to avoid calling on every string literal.
   CFX_ByteString(char ch);
-  CFX_ByteString(const FX_CHAR* ptr)
-      : CFX_ByteString(ptr, ptr ? FXSYS_strlen(ptr) : 0) {}
+  CFX_ByteString(const FX_CHAR* ptr);
 
   CFX_ByteString(const FX_CHAR* ptr, FX_STRSIZE len);
   CFX_ByteString(const uint8_t* ptr, FX_STRSIZE len);
@@ -238,14 +237,13 @@
  public:
   using CharType = FX_WCHAR;
 
-  CFX_WideString() {}
-  CFX_WideString(const CFX_WideString& other) : m_pData(other.m_pData) {}
-  CFX_WideString(CFX_WideString&& other) { m_pData.Swap(other.m_pData); }
+  CFX_WideString();
+  CFX_WideString(const CFX_WideString& other);
+  CFX_WideString(CFX_WideString&& other);
 
   // Deliberately implicit to avoid calling on every string literal.
   CFX_WideString(FX_WCHAR ch);
-  CFX_WideString(const FX_WCHAR* ptr)
-      : CFX_WideString(ptr, ptr ? FXSYS_wcslen(ptr) : 0) {}
+  CFX_WideString(const FX_WCHAR* ptr);
 
   CFX_WideString(const FX_WCHAR* ptr, FX_STRSIZE len);
 
diff --git a/core/fxcrt/include/fx_ucd.h b/core/fxcrt/include/fx_ucd.h
index c2c4688..eeecd39 100644
--- a/core/fxcrt/include/fx_ucd.h
+++ b/core/fxcrt/include/fx_ucd.h
@@ -152,8 +152,7 @@
 class CFX_TxtChar : public CFX_Char {
  public:
   CFX_TxtChar()
-      : CFX_Char(),
-        m_dwStatus(0),
+      : m_dwStatus(0),
         m_iBidiClass(0),
         m_iBidiLevel(0),
         m_iBidiPos(0),
@@ -169,17 +168,9 @@
 typedef CFX_ArrayTemplate<CFX_TxtChar> CFX_TxtCharArray;
 class CFX_RTFChar : public CFX_Char {
  public:
-  CFX_RTFChar()
-      : CFX_Char(),
-        m_dwStatus(0),
-        m_iFontSize(0),
-        m_iFontHeight(0),
-        m_iBidiClass(0),
-        m_iBidiLevel(0),
-        m_iBidiPos(0),
-        m_dwLayoutStyles(0),
-        m_dwIdentity(0),
-        m_pUserData(nullptr) {}
+  CFX_RTFChar();
+  CFX_RTFChar(const CFX_RTFChar& other);
+
   uint32_t m_dwStatus;
   int32_t m_iFontSize;
   int32_t m_iFontHeight;
@@ -191,6 +182,20 @@
   uint32_t m_dwIdentity;
   IFX_Retainable* m_pUserData;
 };
+
+inline CFX_RTFChar::CFX_RTFChar()
+    : m_dwStatus(0),
+      m_iFontSize(0),
+      m_iFontHeight(0),
+      m_iBidiClass(0),
+      m_iBidiLevel(0),
+      m_iBidiPos(0),
+      m_dwLayoutStyles(0),
+      m_dwIdentity(0),
+      m_pUserData(nullptr) {}
+
+inline CFX_RTFChar::CFX_RTFChar(const CFX_RTFChar& other) = default;
+
 typedef CFX_ArrayTemplate<CFX_RTFChar> CFX_RTFCharArray;
 #endif  // PDF_ENABLE_XFA
 
diff --git a/core/fxcrt/include/fx_xml.h b/core/fxcrt/include/fx_xml.h
index 0e8c82b..4db4998 100644
--- a/core/fxcrt/include/fx_xml.h
+++ b/core/fxcrt/include/fx_xml.h
@@ -23,13 +23,17 @@
 
 class CXML_AttrMap {
  public:
+  CXML_AttrMap();
+  ~CXML_AttrMap();
+
   const CFX_WideString* Lookup(const CFX_ByteString& space,
                                const CFX_ByteString& name) const;
+  int GetSize() const;
+  CXML_AttrItem& GetAt(int index) const;
+
   void SetAt(const CFX_ByteString& space,
              const CFX_ByteString& name,
              const CFX_WideString& value);
-  int GetSize() const;
-  CXML_AttrItem& GetAt(int index) const;
 
   std::unique_ptr<std::vector<CXML_AttrItem>> m_pMap;
 };
diff --git a/core/fxcrt/xml_int.h b/core/fxcrt/xml_int.h
index 6d3db4f..121441b 100644
--- a/core/fxcrt/xml_int.h
+++ b/core/fxcrt/xml_int.h
@@ -16,28 +16,18 @@
 
 class CXML_DataBufAcc : public IFX_BufferRead {
  public:
-  CXML_DataBufAcc(const uint8_t* pBuffer, size_t size)
-      : m_pBuffer(pBuffer), m_dwSize(size), m_dwCurPos(0) {}
-  ~CXML_DataBufAcc() override {}
+  CXML_DataBufAcc(const uint8_t* pBuffer, size_t size);
+  ~CXML_DataBufAcc() override;
 
   // IFX_BufferRead
-  void Release() override { delete this; }
-  FX_BOOL IsEOF() override { return m_dwCurPos >= m_dwSize; }
-  FX_FILESIZE GetPosition() override { return (FX_FILESIZE)m_dwCurPos; }
-  size_t ReadBlock(void* buffer, size_t size) override { return 0; }
-  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override {
-    if (bRestart) {
-      m_dwCurPos = 0;
-    }
-    if (m_dwCurPos < m_dwSize) {
-      m_dwCurPos = m_dwSize;
-      return TRUE;
-    }
-    return FALSE;
-  }
-  const uint8_t* GetBlockBuffer() override { return m_pBuffer; }
-  size_t GetBlockSize() override { return m_dwSize; }
-  FX_FILESIZE GetBlockOffset() override { return 0; }
+  void Release() override;
+  FX_BOOL IsEOF() override;
+  FX_FILESIZE GetPosition() override;
+  size_t ReadBlock(void* buffer, size_t size) override;
+  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override;
+  const uint8_t* GetBlockBuffer() override;
+  size_t GetBlockSize() override;
+  FX_FILESIZE GetBlockOffset() override;
 
  protected:
   const uint8_t* m_pBuffer;
@@ -47,40 +37,18 @@
 
 class CXML_DataStmAcc : public IFX_BufferRead {
  public:
-  explicit CXML_DataStmAcc(IFX_FileRead* pFileRead)
-      : m_pFileRead(pFileRead), m_pBuffer(nullptr), m_nStart(0), m_dwSize(0) {
-    ASSERT(m_pFileRead);
-  }
-  ~CXML_DataStmAcc() override { FX_Free(m_pBuffer); }
+  explicit CXML_DataStmAcc(IFX_FileRead* pFileRead);
+  ~CXML_DataStmAcc() override;
 
-  void Release() override { delete this; }
-  FX_BOOL IsEOF() override {
-    return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
-  }
-  FX_FILESIZE GetPosition() override {
-    return m_nStart + (FX_FILESIZE)m_dwSize;
-  }
-  size_t ReadBlock(void* buffer, size_t size) override { return 0; }
-  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override {
-    if (bRestart) {
-      m_nStart = 0;
-    }
-    FX_FILESIZE nLength = m_pFileRead->GetSize();
-    m_nStart += (FX_FILESIZE)m_dwSize;
-    if (m_nStart >= nLength) {
-      return FALSE;
-    }
-    static const FX_FILESIZE FX_XMLDATASTREAM_BufferSize = 32 * 1024;
-    m_dwSize = static_cast<size_t>(
-        std::min(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart));
-    if (!m_pBuffer) {
-      m_pBuffer = FX_Alloc(uint8_t, m_dwSize);
-    }
-    return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
-  }
-  const uint8_t* GetBlockBuffer() override { return (const uint8_t*)m_pBuffer; }
-  size_t GetBlockSize() override { return m_dwSize; }
-  FX_FILESIZE GetBlockOffset() override { return m_nStart; }
+  // IFX_BufferRead
+  void Release() override;
+  FX_BOOL IsEOF() override;
+  FX_FILESIZE GetPosition() override;
+  size_t ReadBlock(void* buffer, size_t size) override;
+  FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) override;
+  const uint8_t* GetBlockBuffer() override;
+  size_t GetBlockSize() override;
+  FX_FILESIZE GetBlockOffset() override;
 
  protected:
   IFX_FileRead* m_pFileRead;
@@ -91,15 +59,9 @@
 
 class CXML_Parser {
  public:
+  CXML_Parser();
   ~CXML_Parser();
-  IFX_BufferRead* m_pDataAcc;
-  FX_BOOL m_bOwnedStream;
-  FX_FILESIZE m_nOffset;
-  FX_BOOL m_bSaveSpaceChars;
-  const uint8_t* m_pBuffer;
-  size_t m_dwBufferSize;
-  FX_FILESIZE m_nBufferOffset;
-  size_t m_dwIndex;
+
   FX_BOOL Init(uint8_t* pBuffer, size_t size);
   FX_BOOL Init(IFX_FileRead* pFileRead);
   FX_BOOL Init(IFX_BufferRead* pBuffer);
@@ -121,6 +83,15 @@
                             const CFX_WideStringC& content,
                             CXML_Element* pElement);
   void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
+
+  IFX_BufferRead* m_pDataAcc;
+  FX_BOOL m_bOwnedStream;
+  FX_FILESIZE m_nOffset;
+  FX_BOOL m_bSaveSpaceChars;
+  const uint8_t* m_pBuffer;
+  size_t m_dwBufferSize;
+  FX_FILESIZE m_nBufferOffset;
+  size_t m_dwIndex;
 };
 
 void FX_XML_SplitQualifiedName(const CFX_ByteStringC& bsFullName,
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 554c79f..f5d7cbb 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -425,6 +425,88 @@
                                  bGroupKnockout);
 }
 
+IFX_RenderDeviceDriver::~IFX_RenderDeviceDriver() {}
+
+CFX_Matrix IFX_RenderDeviceDriver::GetCTM() const {
+  return CFX_Matrix();
+}
+
+FX_BOOL IFX_RenderDeviceDriver::StartRendering() {
+  return TRUE;
+}
+
+void IFX_RenderDeviceDriver::EndRendering() {}
+
+FX_BOOL IFX_RenderDeviceDriver::SetClip_PathStroke(
+    const CFX_PathData* pPathData,
+    const CFX_Matrix* pObject2Device,
+    const CFX_GraphStateData* pGraphState) {
+  return FALSE;
+}
+
+FX_BOOL IFX_RenderDeviceDriver::SetPixel(int x, int y, uint32_t color) {
+  return FALSE;
+}
+
+FX_BOOL IFX_RenderDeviceDriver::FillRectWithBlend(const FX_RECT* pRect,
+                                                  uint32_t fill_color,
+                                                  int blend_type) {
+  return FALSE;
+}
+
+FX_BOOL IFX_RenderDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
+                                                 FX_FLOAT y1,
+                                                 FX_FLOAT x2,
+                                                 FX_FLOAT y2,
+                                                 uint32_t color,
+                                                 int blend_type) {
+  return FALSE;
+}
+
+FX_BOOL IFX_RenderDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap,
+                                          int left,
+                                          int top) {
+  return FALSE;
+}
+CFX_DIBitmap* IFX_RenderDeviceDriver::GetBackDrop() {
+  return nullptr;
+}
+
+FX_BOOL IFX_RenderDeviceDriver::ContinueDIBits(void* handle,
+                                               IFX_Pause* pPause) {
+  return FALSE;
+}
+
+void IFX_RenderDeviceDriver::CancelDIBits(void* handle) {}
+
+FX_BOOL IFX_RenderDeviceDriver::DrawDeviceText(int nChars,
+                                               const FXTEXT_CHARPOS* pCharPos,
+                                               CFX_Font* pFont,
+                                               CFX_FontCache* pCache,
+                                               const CFX_Matrix* pObject2Device,
+                                               FX_FLOAT font_size,
+                                               uint32_t color) {
+  return FALSE;
+}
+
+void* IFX_RenderDeviceDriver::GetPlatformSurface() const {
+  return nullptr;
+}
+
+int IFX_RenderDeviceDriver::GetDriverType() const {
+  return 0;
+}
+
+void IFX_RenderDeviceDriver::ClearDriver() {}
+
+FX_BOOL IFX_RenderDeviceDriver::DrawShading(const CPDF_ShadingPattern* pPattern,
+                                            const CFX_Matrix* pMatrix,
+                                            const FX_RECT& clip_rect,
+                                            int alpha,
+                                            FX_BOOL bAlphaMode) {
+  return false;
+}
+
 CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap,
                                          FX_BOOL bRgbByteOrder,
                                          CFX_DIBitmap* pOriDevice,
@@ -452,6 +534,10 @@
   return m_pBitmap->GetBuffer();
 }
 
+const CFX_DIBitmap* CFX_AggDeviceDriver::GetBitmap() const {
+  return m_pBitmap;
+}
+
 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
 void CFX_AggDeviceDriver::InitPlatform() {}
 
@@ -1435,6 +1521,10 @@
   }
 };
 
+int CFX_AggDeviceDriver::GetDriverType() const {
+  return 1;
+}
+
 FX_BOOL CFX_AggDeviceDriver::RenderRasterizer(
     agg::rasterizer_scanline_aa& rasterizer,
     uint32_t color,
@@ -1645,6 +1735,10 @@
   return bRet;
 }
 
+CFX_DIBitmap* CFX_AggDeviceDriver::GetBackDrop() {
+  return m_pOriDevice;
+}
+
 FX_BOOL CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
                                        uint32_t argb,
                                        const FX_RECT* pSrcRect,
diff --git a/core/fxge/agg/fx_agg_driver.h b/core/fxge/agg/fx_agg_driver.h
index 48d6fae..7c2e980 100644
--- a/core/fxge/agg/fx_agg_driver.h
+++ b/core/fxge/agg/fx_agg_driver.h
@@ -59,7 +59,7 @@
                             int blend_type) override;
   FX_BOOL GetClipBox(FX_RECT* pRect) override;
   FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) override;
-  CFX_DIBitmap* GetBackDrop() override { return m_pOriDevice; }
+  CFX_DIBitmap* GetBackDrop() override;
   FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
                     uint32_t color,
                     const FX_RECT* pSrcRect,
@@ -91,7 +91,7 @@
                          const CFX_Matrix* pObject2Device,
                          FX_FLOAT font_size,
                          uint32_t color) override;
-  int GetDriverType() const override { return 1; }
+  int GetDriverType() const override;
 
   FX_BOOL RenderRasterizer(agg::rasterizer_scanline_aa& rasterizer,
                            uint32_t color,
@@ -103,7 +103,7 @@
   void SetClipMask(agg::rasterizer_scanline_aa& rasterizer);
 
   virtual uint8_t* GetBuffer() const;
-  const CFX_DIBitmap* GetBitmap() const { return m_pBitmap; }
+  const CFX_DIBitmap* GetBitmap() const;
 
  private:
   CFX_DIBitmap* m_pBitmap;
diff --git a/core/fxge/ge/fx_ge_device.cpp b/core/fxge/ge/fx_ge_device.cpp
index f1f7dc0..adf68a8 100644
--- a/core/fxge/ge/fx_ge_device.cpp
+++ b/core/fxge/ge/fx_ge_device.cpp
@@ -6,18 +6,25 @@
 
 #include "core/fxge/include/fx_ge.h"
 
-CFX_RenderDevice::CFX_RenderDevice() {
-  m_pDeviceDriver = nullptr;
-  m_pBitmap = nullptr;
-}
+CFX_RenderDevice::CFX_RenderDevice()
+    : m_pBitmap(nullptr),
+      m_Width(0),
+      m_Height(0),
+      m_bpp(0),
+      m_RenderCaps(0),
+      m_DeviceClass(0),
+      m_pDeviceDriver(nullptr) {}
+
 CFX_RenderDevice::~CFX_RenderDevice() {
   delete m_pDeviceDriver;
 }
+
 void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver) {
   delete m_pDeviceDriver;
   m_pDeviceDriver = pDriver;
   InitDeviceInfo();
 }
+
 void CFX_RenderDevice::InitDeviceInfo() {
   m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
   m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
@@ -31,12 +38,15 @@
     m_ClipBox.bottom = m_Height;
   }
 }
+
 FX_BOOL CFX_RenderDevice::StartRendering() {
   return m_pDeviceDriver->StartRendering();
 }
+
 void CFX_RenderDevice::EndRendering() {
   m_pDeviceDriver->EndRendering();
 }
+
 void CFX_RenderDevice::SaveState() {
   m_pDeviceDriver->SaveState();
 }
@@ -52,6 +62,7 @@
 CFX_Matrix CFX_RenderDevice::GetCTM() const {
   return m_pDeviceDriver->GetCTM();
 }
+
 FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB,
                                                  int width,
                                                  int height) const {
@@ -72,6 +83,7 @@
       width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
 #endif
 }
+
 FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
                                            const CFX_Matrix* pObject2Device,
                                            int fill_mode) {
@@ -82,6 +94,7 @@
   UpdateClipBox();
   return TRUE;
 }
+
 FX_BOOL CFX_RenderDevice::SetClip_PathStroke(
     const CFX_PathData* pPathData,
     const CFX_Matrix* pObject2Device,
@@ -93,6 +106,7 @@
   UpdateClipBox();
   return TRUE;
 }
+
 FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT& rect) {
   CFX_PathData path;
   path.AppendRect(rect.left, rect.bottom, rect.right, rect.top);
@@ -102,6 +116,7 @@
   UpdateClipBox();
   return TRUE;
 }
+
 void CFX_RenderDevice::UpdateClipBox() {
   if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
     return;
@@ -421,6 +436,16 @@
                                     FXDIB_BLEND_NORMAL);
 }
 
+FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap,
+                                         int left,
+                                         int top,
+                                         int dest_width,
+                                         int dest_height,
+                                         uint32_t color) {
+  return StretchBitMaskWithFlags(pBitmap, left, top, dest_width, dest_height,
+                                 color, 0);
+}
+
 FX_BOOL CFX_RenderDevice::StretchBitMaskWithFlags(const CFX_DIBSource* pBitmap,
                                                   int left,
                                                   int top,
diff --git a/core/fxge/ge/fx_ge_fontmap.cpp b/core/fxge/ge/fx_ge_fontmap.cpp
index fa53898..81e3137 100644
--- a/core/fxge/ge/fx_ge_fontmap.cpp
+++ b/core/fxge/ge/fx_ge_fontmap.cpp
@@ -9,8 +9,9 @@
 #include <utility>
 #include <vector>
 
+#include "core/fxge/include/fx_font.h"
+
 #include "core/fxge/fontdata/chromefontdata/chromefontdata.h"
-#include "core/fxge/ge/fx_text_int.h"
 #include "core/fxge/include/fx_freetype.h"
 #include "core/fxge/include/fx_ge.h"
 #include "third_party/base/stl_util.h"
@@ -1358,7 +1359,21 @@
 }
 #endif
 
+CFX_FontFaceInfo::CFX_FontFaceInfo(CFX_ByteString filePath,
+                                   CFX_ByteString faceName,
+                                   CFX_ByteString fontTables,
+                                   uint32_t fontOffset,
+                                   uint32_t fileSize)
+    : m_FilePath(filePath),
+      m_FaceName(faceName),
+      m_FontTables(fontTables),
+      m_FontOffset(fontOffset),
+      m_FileSize(fileSize),
+      m_Styles(0),
+      m_Charsets(0) {}
+
 CFX_FolderFontInfo::CFX_FolderFontInfo() {}
+
 CFX_FolderFontInfo::~CFX_FolderFontInfo() {
   for (const auto& pair : m_FontList) {
     delete pair.second;
diff --git a/core/fxge/ge/fx_ge_path.cpp b/core/fxge/ge/fx_ge_path.cpp
index 6eb41d3..468d80e 100644
--- a/core/fxge/ge/fx_ge_path.cpp
+++ b/core/fxge/ge/fx_ge_path.cpp
@@ -8,27 +8,25 @@
 #include "core/fxge/include/fx_ge.h"
 #include "third_party/base/numerics/safe_math.h"
 
-CFX_ClipRgn::CFX_ClipRgn(int width, int height) {
-  m_Type = RectI;
-  m_Box.left = m_Box.top = 0;
-  m_Box.right = width;
-  m_Box.bottom = height;
-}
-CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect) {
-  m_Type = RectI;
-  m_Box = rect;
-}
+CFX_ClipRgn::CFX_ClipRgn(int width, int height)
+    : m_Type(RectI), m_Box(0, 0, width, height) {}
+
+CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect) : m_Type(RectI), m_Box(rect) {}
+
 CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src) {
   m_Type = src.m_Type;
   m_Box = src.m_Box;
   m_Mask = src.m_Mask;
 }
+
 CFX_ClipRgn::~CFX_ClipRgn() {}
+
 void CFX_ClipRgn::Reset(const FX_RECT& rect) {
   m_Type = RectI;
   m_Box = rect;
   m_Mask.SetNull();
 }
+
 void CFX_ClipRgn::IntersectRect(const FX_RECT& rect) {
   if (m_Type == RectI) {
     m_Box.Intersect(rect);
@@ -39,6 +37,7 @@
     return;
   }
 }
+
 void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect,
                                     FX_RECT mask_rect,
                                     CFX_DIBitmapRef Mask) {
@@ -69,6 +68,7 @@
     }
   }
 }
+
 void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask) {
   const CFX_DIBitmap* mask_dib = Mask.GetObject();
   ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
@@ -112,13 +112,14 @@
   }
   ASSERT(FALSE);
 }
-CFX_PathData::CFX_PathData() {
-  m_PointCount = m_AllocCount = 0;
-  m_pPoints = nullptr;
-}
+
+CFX_PathData::CFX_PathData()
+    : m_PointCount(0), m_pPoints(nullptr), m_AllocCount(0) {}
+
 CFX_PathData::~CFX_PathData() {
   FX_Free(m_pPoints);
 }
+
 void CFX_PathData::SetPointCount(int nPoints) {
   m_PointCount = nPoints;
   if (m_AllocCount < nPoints) {
@@ -127,6 +128,7 @@
     m_AllocCount = nPoints;
   }
 }
+
 void CFX_PathData::AllocPointCount(int nPoints) {
   if (m_AllocCount < nPoints) {
     FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
@@ -138,17 +140,20 @@
     m_AllocCount = nPoints;
   }
 }
+
 CFX_PathData::CFX_PathData(const CFX_PathData& src) {
   m_PointCount = m_AllocCount = src.m_PointCount;
   m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
   FXSYS_memcpy(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
 }
+
 void CFX_PathData::TrimPoints(int nPoints) {
   if (m_PointCount <= nPoints) {
     return;
   }
   SetPointCount(nPoints);
 }
+
 void CFX_PathData::AddPointCount(int addPoints) {
   pdfium::base::CheckedNumeric<int> safe_new_count = m_PointCount;
   safe_new_count += addPoints;
@@ -156,6 +161,7 @@
   AllocPointCount(new_count);
   m_PointCount = new_count;
 }
+
 void CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_Matrix* pMatrix) {
   int old_count = m_PointCount;
   AddPointCount(pSrc->m_PointCount);
@@ -168,12 +174,14 @@
     }
   }
 }
+
 void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag) {
   ASSERT(index < m_PointCount);
   m_pPoints[index].m_PointX = x;
   m_pPoints[index].m_PointY = y;
   m_pPoints[index].m_Flag = flag;
 }
+
 void CFX_PathData::AppendRect(FX_FLOAT left,
                               FX_FLOAT bottom,
                               FX_FLOAT right,
@@ -189,6 +197,7 @@
   pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
   pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
 }
+
 CFX_FloatRect CFX_PathData::GetBoundingBox() const {
   CFX_FloatRect rect;
   if (m_PointCount) {
@@ -199,6 +208,7 @@
   }
   return rect;
 }
+
 static void _UpdateLineEndPoints(CFX_FloatRect& rect,
                                  FX_FLOAT start_x,
                                  FX_FLOAT start_y,
@@ -242,6 +252,7 @@
   rect.UpdateRect(mx - dx1, my + dy1);
   rect.UpdateRect(mx + dx1, my - dy1);
 }
+
 static void _UpdateLineJoinPoints(CFX_FloatRect& rect,
                                   FX_FLOAT start_x,
                                   FX_FLOAT start_y,
@@ -334,6 +345,7 @@
   FX_FLOAT join_y = (start_k * join_x) + start_outside_c;
   rect.UpdateRect(join_x, join_y);
 }
+
 CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width,
                                            FX_FLOAT miter_limit) const {
   CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f,
@@ -384,6 +396,7 @@
   }
   return rect;
 }
+
 void CFX_PathData::Transform(const CFX_Matrix* pMatrix) {
   if (!pMatrix) {
     return;
@@ -392,6 +405,7 @@
     pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
   }
 }
+
 FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath,
                                       CFX_Matrix* pMatrix,
                                       FX_BOOL& bThin,
@@ -536,6 +550,7 @@
   }
   return TRUE;
 }
+
 FX_BOOL CFX_PathData::IsRect() const {
   if (m_PointCount != 5 && m_PointCount != 4) {
     return FALSE;
@@ -563,6 +578,7 @@
   }
   return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
 }
+
 FX_BOOL CFX_PathData::IsRect(const CFX_Matrix* pMatrix,
                              CFX_FloatRect* pRect) const {
   if (!pMatrix) {
@@ -613,23 +629,26 @@
   }
   return TRUE;
 }
+
 void CFX_PathData::Copy(const CFX_PathData& src) {
   SetPointCount(src.m_PointCount);
   FXSYS_memcpy(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
 }
-CFX_GraphStateData::CFX_GraphStateData() {
-  m_LineCap = LineCapButt;
-  m_DashCount = 0;
-  m_DashArray = nullptr;
-  m_DashPhase = 0;
-  m_LineJoin = LineJoinMiter;
-  m_MiterLimit = 10 * 1.0f;
-  m_LineWidth = 1.0f;
-}
+
+CFX_GraphStateData::CFX_GraphStateData()
+    : m_LineCap(LineCapButt),
+      m_DashCount(0),
+      m_DashArray(nullptr),
+      m_DashPhase(0),
+      m_LineJoin(LineJoinMiter),
+      m_MiterLimit(10 * 1.0f),
+      m_LineWidth(1.0f) {}
+
 CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src) {
   m_DashArray = nullptr;
   Copy(src);
 }
+
 void CFX_GraphStateData::Copy(const CFX_GraphStateData& src) {
   m_LineCap = src.m_LineCap;
   m_DashCount = src.m_DashCount;
@@ -644,9 +663,11 @@
     FXSYS_memcpy(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
   }
 }
+
 CFX_GraphStateData::~CFX_GraphStateData() {
   FX_Free(m_DashArray);
 }
+
 void CFX_GraphStateData::SetDashCount(int count) {
   FX_Free(m_DashArray);
   m_DashArray = nullptr;
diff --git a/core/fxge/ge/fx_ge_text.cpp b/core/fxge/ge/fx_ge_text.cpp
index 6b456c2..cf349eb 100644
--- a/core/fxge/ge/fx_ge_text.cpp
+++ b/core/fxge/ge/fx_ge_text.cpp
@@ -933,12 +933,16 @@
                            bFontStyle, dest_width, anti_alias);
 #endif
 }
+
+CFX_SizeGlyphCache::CFX_SizeGlyphCache() {}
+
 CFX_SizeGlyphCache::~CFX_SizeGlyphCache() {
   for (const auto& pair : m_GlyphMap) {
     delete pair.second;
   }
   m_GlyphMap.clear();
 }
+
 #define CONTRAST_RAMP_STEP 1
 void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight) {
   FXFT_MM_Var pMasters = nullptr;
diff --git a/core/fxge/ge/fx_text_int.h b/core/fxge/ge/fx_text_int.h
index 2ca2321..87a9b3e 100644
--- a/core/fxge/ge/fx_text_int.h
+++ b/core/fxge/ge/fx_text_int.h
@@ -17,68 +17,12 @@
   FX_CHAR m_Key[128];
   int m_KeyLen;
 };
+
 class CFX_SizeGlyphCache {
  public:
-  CFX_SizeGlyphCache() {}
+  CFX_SizeGlyphCache();
   ~CFX_SizeGlyphCache();
   std::map<uint32_t, CFX_GlyphBitmap*> m_GlyphMap;
 };
-class CTTFontDesc {
- public:
-  CTTFontDesc() {
-    m_Type = 0;
-    m_pFontData = nullptr;
-    m_RefCount = 0;
-  }
-  ~CTTFontDesc();
-  // ret < 0, releaseface not appropriate for this object.
-  // ret == 0, object released
-  // ret > 0, object still alive, other referrers.
-  int ReleaseFace(FXFT_Face face);
-  int m_Type;
-  union {
-    struct {
-      FX_BOOL m_bItalic;
-      FX_BOOL m_bBold;
-      FXFT_Face m_pFace;
-    } m_SingleFace;
-    struct {
-      FXFT_Face m_pFaces[16];
-    } m_TTCFace;
-  };
-  uint8_t* m_pFontData;
-  int m_RefCount;
-};
-
-#define CHARSET_FLAG_ANSI 1
-#define CHARSET_FLAG_SYMBOL 2
-#define CHARSET_FLAG_SHIFTJIS 4
-#define CHARSET_FLAG_BIG5 8
-#define CHARSET_FLAG_GB 16
-#define CHARSET_FLAG_KOREAN 32
-
-class CFX_FontFaceInfo {
- public:
-  CFX_FontFaceInfo(CFX_ByteString filePath,
-                   CFX_ByteString faceName,
-                   CFX_ByteString fontTables,
-                   uint32_t fontOffset,
-                   uint32_t fileSize)
-      : m_FilePath(filePath),
-        m_FaceName(faceName),
-        m_FontTables(fontTables),
-        m_FontOffset(fontOffset),
-        m_FileSize(fileSize),
-        m_Styles(0),
-        m_Charsets(0) {}
-
-  const CFX_ByteString m_FilePath;
-  const CFX_ByteString m_FaceName;
-  const CFX_ByteString m_FontTables;
-  const uint32_t m_FontOffset;
-  const uint32_t m_FileSize;
-  uint32_t m_Styles;
-  uint32_t m_Charsets;
-};
 
 #endif  // CORE_FXGE_GE_FX_TEXT_INT_H_
diff --git a/core/fxge/include/fx_font.h b/core/fxge/include/fx_font.h
index b38ecae..17adc7a 100644
--- a/core/fxge/include/fx_font.h
+++ b/core/fxge/include/fx_font.h
@@ -19,7 +19,6 @@
 typedef void* FXFT_Library;
 
 class CFX_FaceCache;
-class CFX_FontFaceInfo;
 class CFX_FontMapper;
 class CFX_PathData;
 class CFX_SizeGlyphCache;
@@ -65,6 +64,13 @@
 #define FXFONT_FW_NORMAL 400
 #define FXFONT_FW_BOLD 700
 
+#define CHARSET_FLAG_ANSI 1
+#define CHARSET_FLAG_SYMBOL 2
+#define CHARSET_FLAG_SHIFTJIS 4
+#define CHARSET_FLAG_BIG5 8
+#define CHARSET_FLAG_GB 16
+#define CHARSET_FLAG_KOREAN 32
+
 class CFX_Font {
  public:
   CFX_Font();
@@ -379,6 +385,50 @@
   virtual void* RetainFont(void* hFont);
 };
 
+class CTTFontDesc {
+ public:
+  CTTFontDesc() {
+    m_Type = 0;
+    m_pFontData = nullptr;
+    m_RefCount = 0;
+  }
+  ~CTTFontDesc();
+  // ret < 0, releaseface not appropriate for this object.
+  // ret == 0, object released
+  // ret > 0, object still alive, other referrers.
+  int ReleaseFace(FXFT_Face face);
+  int m_Type;
+  union {
+    struct {
+      FX_BOOL m_bItalic;
+      FX_BOOL m_bBold;
+      FXFT_Face m_pFace;
+    } m_SingleFace;
+    struct {
+      FXFT_Face m_pFaces[16];
+    } m_TTCFace;
+  };
+  uint8_t* m_pFontData;
+  int m_RefCount;
+};
+
+class CFX_FontFaceInfo {
+ public:
+  CFX_FontFaceInfo(CFX_ByteString filePath,
+                   CFX_ByteString faceName,
+                   CFX_ByteString fontTables,
+                   uint32_t fontOffset,
+                   uint32_t fileSize);
+
+  const CFX_ByteString m_FilePath;
+  const CFX_ByteString m_FaceName;
+  const CFX_ByteString m_FontTables;
+  const uint32_t m_FontOffset;
+  const uint32_t m_FileSize;
+  uint32_t m_Styles;
+  uint32_t m_Charsets;
+};
+
 class CFX_FolderFontInfo : public IFX_SystemFontInfo {
  public:
   CFX_FolderFontInfo();
diff --git a/core/fxge/include/fx_ge.h b/core/fxge/include/fx_ge.h
index b2e2b45..9114b47 100644
--- a/core/fxge/include/fx_ge.h
+++ b/core/fxge/include/fx_ge.h
@@ -36,9 +36,10 @@
     m_pCodecModule = pCodecModule;
   }
   CCodec_ModuleMgr* GetCodecModule() { return m_pCodecModule; }
-  FXFT_Library m_FTLibrary;
   void* GetPlatformData() { return m_pPlatformData; }
 
+  FXFT_Library m_FTLibrary;
+
  protected:
   explicit CFX_GEModule(const char** pUserFontPaths);
   ~CFX_GEModule();
@@ -71,16 +72,18 @@
 
 class CFX_ClipRgn {
  public:
+  enum ClipType { RectI, MaskF };
+
   CFX_ClipRgn(int device_width, int device_height);
   explicit CFX_ClipRgn(const FX_RECT& rect);
   CFX_ClipRgn(const CFX_ClipRgn& src);
   ~CFX_ClipRgn();
 
-  enum ClipType { RectI, MaskF };
-  void Reset(const FX_RECT& rect);
   ClipType GetType() const { return m_Type; }
   const FX_RECT& GetBox() const { return m_Box; }
   CFX_DIBitmapRef GetMask() const { return m_Mask; }
+
+  void Reset(const FX_RECT& rect);
   void IntersectRect(const FX_RECT& rect);
   void IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);
 
@@ -103,6 +106,7 @@
   FX_FLOAT GetPointX(int index) const { return m_pPoints[index].m_PointX; }
   FX_FLOAT GetPointY(int index) const { return m_pPoints[index].m_PointY; }
   FX_PATHPOINT* GetPoints() const { return m_pPoints; }
+
   void SetPointCount(int nPoints);
   void AllocPointCount(int nPoints);
   void AddPointCount(int addPoints);
@@ -131,6 +135,8 @@
 
 class CFX_GraphStateData {
  public:
+  enum LineCap { LineCapButt = 0, LineCapRound = 1, LineCapSquare = 2 };
+
   CFX_GraphStateData();
   CFX_GraphStateData(const CFX_GraphStateData& src);
   ~CFX_GraphStateData();
@@ -138,7 +144,6 @@
   void Copy(const CFX_GraphStateData& src);
   void SetDashCount(int count);
 
-  enum LineCap { LineCapButt = 0, LineCapRound = 1, LineCapSquare = 2 };
   LineCap m_LineCap;
   int m_DashCount;
   FX_FLOAT* m_DashArray;
@@ -216,6 +221,7 @@
   void EndRendering();
   void SaveState();
   void RestoreState(bool bKeepSaved);
+
   int GetWidth() const { return m_Width; }
   int GetHeight() const { return m_Height; }
   int GetDeviceClass() const { return m_DeviceClass; }
@@ -308,10 +314,7 @@
                          int top,
                          int dest_width,
                          int dest_height,
-                         uint32_t color) {
-    return StretchBitMaskWithFlags(pBitmap, left, top, dest_width, dest_height,
-                                   color, 0);
-  }
+                         uint32_t color);
   FX_BOOL StretchBitMaskWithFlags(const CFX_DIBSource* pBitmap,
                                   int left,
                                   int top,
@@ -421,35 +424,29 @@
 
 class IFX_RenderDeviceDriver {
  public:
+  virtual ~IFX_RenderDeviceDriver();
+
   static IFX_RenderDeviceDriver* CreateFxgeDriver(CFX_DIBitmap* pBitmap,
                                                   FX_BOOL bRgbByteOrder,
                                                   CFX_DIBitmap* pOriDevice,
                                                   FX_BOOL bGroupKnockout);
 
-  virtual ~IFX_RenderDeviceDriver() {}
 
   virtual int GetDeviceCaps(int caps_id) = 0;
 
-  virtual CFX_Matrix GetCTM() const { return CFX_Matrix(); }
+  virtual CFX_Matrix GetCTM() const;
 
-  virtual FX_BOOL StartRendering() { return TRUE; }
-
-  virtual void EndRendering() {}
-
+  virtual FX_BOOL StartRendering();
+  virtual void EndRendering();
   virtual void SaveState() = 0;
-
   virtual void RestoreState(bool bKeepSaved) = 0;
 
   virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
                                    const CFX_Matrix* pObject2Device,
                                    int fill_mode) = 0;
-
   virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
                                      const CFX_Matrix* pObject2Device,
-                                     const CFX_GraphStateData* pGraphState) {
-    return FALSE;
-  }
-
+                                     const CFX_GraphStateData* pGraphState);
   virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
                            const CFX_Matrix* pObject2Device,
                            const CFX_GraphStateData* pGraphState,
@@ -457,38 +454,26 @@
                            uint32_t stroke_color,
                            int fill_mode,
                            int blend_type) = 0;
-
-  virtual FX_BOOL SetPixel(int x, int y, uint32_t color) { return FALSE; }
-
+  virtual FX_BOOL SetPixel(int x, int y, uint32_t color);
   virtual FX_BOOL FillRectWithBlend(const FX_RECT* pRect,
                                     uint32_t fill_color,
-                                    int blend_type) {
-    return FALSE;
-  }
-
+                                    int blend_type);
   virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1,
                                    FX_FLOAT y1,
                                    FX_FLOAT x2,
                                    FX_FLOAT y2,
                                    uint32_t color,
-                                   int blend_type) {
-    return FALSE;
-  }
+                                   int blend_type);
 
   virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;
-
-  virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top) {
-    return FALSE;
-  }
-  virtual CFX_DIBitmap* GetBackDrop() { return nullptr; }
-
+  virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top);
+  virtual CFX_DIBitmap* GetBackDrop();
   virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap,
                             uint32_t color,
                             const FX_RECT* pSrcRect,
                             int dest_left,
                             int dest_top,
                             int blend_type) = 0;
-
   virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap,
                                 uint32_t color,
                                 int dest_left,
@@ -498,7 +483,6 @@
                                 const FX_RECT* pClipRect,
                                 uint32_t flags,
                                 int blend_type) = 0;
-
   virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap,
                               int bitmap_alpha,
                               uint32_t color,
@@ -506,34 +490,23 @@
                               uint32_t flags,
                               void*& handle,
                               int blend_type) = 0;
-
-  virtual FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause) {
-    return FALSE;
-  }
-
-  virtual void CancelDIBits(void* handle) {}
-
+  virtual FX_BOOL ContinueDIBits(void* handle, IFX_Pause* pPause);
+  virtual void CancelDIBits(void* handle);
   virtual FX_BOOL DrawDeviceText(int nChars,
                                  const FXTEXT_CHARPOS* pCharPos,
                                  CFX_Font* pFont,
                                  CFX_FontCache* pCache,
                                  const CFX_Matrix* pObject2Device,
                                  FX_FLOAT font_size,
-                                 uint32_t color) {
-    return FALSE;
-  }
-
-  virtual void* GetPlatformSurface() const { return nullptr; }
-  virtual int GetDriverType() const { return 0; }
-  virtual void ClearDriver() {}
-
+                                 uint32_t color);
+  virtual void* GetPlatformSurface() const;
+  virtual int GetDriverType() const;
+  virtual void ClearDriver();
   virtual FX_BOOL DrawShading(const CPDF_ShadingPattern* pPattern,
                               const CFX_Matrix* pMatrix,
                               const FX_RECT& clip_rect,
                               int alpha,
-                              FX_BOOL bAlphaMode) {
-    return false;
-  }
+                              FX_BOOL bAlphaMode);
 };
 
 #endif  // CORE_FXGE_INCLUDE_FX_GE_H_
diff --git a/core/fxge/include/fx_ge_win32.h b/core/fxge/include/fx_ge_win32.h
index e7207a5..703093d 100644
--- a/core/fxge/include/fx_ge_win32.h
+++ b/core/fxge/include/fx_ge_win32.h
@@ -25,42 +25,29 @@
 
 class CFX_WindowsDIB : public CFX_DIBitmap {
  public:
+  CFX_WindowsDIB(HDC hDC, int width, int height);
+  ~CFX_WindowsDIB() override;
+
   static CFX_ByteString GetBitmapInfo(const CFX_DIBitmap* pBitmap);
-
   static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);
-
   static HBITMAP GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);
-
   static CFX_DIBitmap* LoadFromDDB(HDC hDC,
                                    HBITMAP hBitmap,
                                    uint32_t* pPalette = nullptr,
                                    uint32_t size = 256);
-
   static CFX_DIBitmap* LoadFromFile(const FX_WCHAR* filename);
-
-  static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename) {
-    return LoadFromFile(CFX_WideString::FromLocal(filename).c_str());
-  }
-
+  static CFX_DIBitmap* LoadFromFile(const FX_CHAR* filename);
   static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
 
-  CFX_WindowsDIB(HDC hDC, int width, int height);
-
-  ~CFX_WindowsDIB();
-
   HDC GetDC() const { return m_hMemDC; }
-
   HBITMAP GetWindowsBitmap() const { return m_hBitmap; }
 
   void LoadFromDevice(HDC hDC, int left, int top);
-
   void SetToDevice(HDC hDC, int left, int top);
 
  protected:
   HDC m_hMemDC;
-
   HBITMAP m_hBitmap;
-
   HBITMAP m_hOldBitmap;
 };
 
@@ -69,7 +56,7 @@
   static IFX_RenderDeviceDriver* CreateDriver(HDC hDC);
 
   explicit CFX_WindowsDevice(HDC hDC);
-  ~CFX_WindowsDevice();
+  ~CFX_WindowsDevice() override;
 
   HDC GetDC() const;
 };
@@ -77,7 +64,7 @@
 class CFX_WinBitmapDevice : public CFX_RenderDevice {
  public:
   CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);
-  ~CFX_WinBitmapDevice();
+  ~CFX_WinBitmapDevice() override;
 
   HDC GetDC() { return m_hDC; }
 
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index c2084f2..2df5c1c 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -939,6 +939,10 @@
   return ::GetClipBox(m_hDC, (RECT*)pRect);
 }
 
+void* CGdiDeviceDriver::GetPlatformSurface() const {
+  return (void*)m_hDC;
+}
+
 void CGdiDeviceDriver::DrawLine(FX_FLOAT x1,
                                 FX_FLOAT y1,
                                 FX_FLOAT x2,
@@ -1363,6 +1367,16 @@
                            dest_height, flags, nullptr);
 }
 
+FX_BOOL CGdiDisplayDriver::StartDIBits(const CFX_DIBSource* pBitmap,
+                                       int bitmap_alpha,
+                                       uint32_t color,
+                                       const CFX_Matrix* pMatrix,
+                                       uint32_t render_flags,
+                                       void*& handle,
+                                       int blend_type) {
+  return FALSE;
+}
+
 CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC) {
   SetDeviceDriver(CreateDriver(hDC));
 }
diff --git a/core/fxge/win32/fx_win32_dib.cpp b/core/fxge/win32/fx_win32_dib.cpp
index 7221d10..0e79399 100644
--- a/core/fxge/win32/fx_win32_dib.cpp
+++ b/core/fxge/win32/fx_win32_dib.cpp
@@ -51,6 +51,7 @@
   result.ReleaseBuffer(len);
   return result;
 }
+
 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi,
                                          LPVOID pData,
                                          FX_BOOL bAlpha) {
@@ -97,21 +98,25 @@
   }
   return pBitmap;
 }
+
 CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData) {
   return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
 }
+
 HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC) {
   CFX_ByteString info = GetBitmapInfo(pBitmap);
   return CreateDIBitmap(hDC, (BITMAPINFOHEADER*)info.c_str(), CBM_INIT,
                         pBitmap->GetBuffer(), (BITMAPINFO*)info.c_str(),
                         DIB_RGB_COLORS);
 }
+
 void GetBitmapSize(HBITMAP hBitmap, int& w, int& h) {
   BITMAP bmp;
   GetObject(hBitmap, sizeof bmp, &bmp);
   w = bmp.bmWidth;
   h = bmp.bmHeight;
 }
+
 CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_WCHAR* filename) {
   CWin32Platform* pPlatform =
       (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
@@ -145,6 +150,11 @@
   DeleteDC(hDC);
   return pDIBitmap;
 }
+
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(const FX_CHAR* filename) {
+  return LoadFromFile(CFX_WideString::FromLocal(filename).c_str());
+}
+
 CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args) {
   CWin32Platform* pPlatform =
       (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
@@ -178,6 +188,7 @@
   DeleteDC(hDC);
   return pDIBitmap;
 }
+
 CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC,
                                           HBITMAP hBitmap,
                                           uint32_t* pPalette,
@@ -259,6 +270,7 @@
   }
   return pDIBitmap;
 }
+
 CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height) {
   Create(width, height, FXDIB_Rgb, (uint8_t*)1);
   BITMAPINFOHEADER bmih;
@@ -273,14 +285,17 @@
   m_hMemDC = CreateCompatibleDC(hDC);
   m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
 }
+
 CFX_WindowsDIB::~CFX_WindowsDIB() {
   SelectObject(m_hMemDC, m_hOldBitmap);
   DeleteDC(m_hMemDC);
   DeleteObject(m_hBitmap);
 }
+
 void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top) {
   ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
 }
+
 void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top) {
   ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
 }
diff --git a/core/fxge/win32/fx_win32_dwrite.cpp b/core/fxge/win32/fx_win32_dwrite.cpp
index 5f620cb..b3ba28c 100644
--- a/core/fxge/win32/fx_win32_dwrite.cpp
+++ b/core/fxge/win32/fx_win32_dwrite.cpp
@@ -30,22 +30,29 @@
   }
   return newObject;
 }
+
 class CDwFontFileStream final : public IDWriteFontFileStream {
  public:
   explicit CDwFontFileStream(void const* fontFileReferenceKey,
                              UINT32 fontFileReferenceKeySize);
-  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
-                                                   void** ppvObject);
-  virtual ULONG STDMETHODCALLTYPE AddRef();
-  virtual ULONG STDMETHODCALLTYPE Release();
-  virtual HRESULT STDMETHODCALLTYPE
+
+  // IUnknown.
+  HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
+                                           void** ppvObject) override;
+  ULONG STDMETHODCALLTYPE AddRef() override;
+  ULONG STDMETHODCALLTYPE Release() override;
+
+  // IDWriteFontFileStream.
+  HRESULT STDMETHODCALLTYPE
   ReadFileFragment(void const** fragmentStart,
                    UINT64 fileOffset,
                    UINT64 fragmentSize,
-                   OUT void** fragmentContext);
-  virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
-  virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
-  virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
+                   OUT void** fragmentContext) override;
+  void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext) override;
+  HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize) override;
+  HRESULT STDMETHODCALLTYPE
+  GetLastWriteTime(OUT UINT64* lastWriteTime) override;
+
   bool IsInitialized() { return !!resourcePtr_; }
 
  private:
@@ -53,16 +60,20 @@
   void const* resourcePtr_;
   DWORD resourceSize_;
 };
+
 class CDwFontFileLoader final : public IDWriteFontFileLoader {
  public:
-  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
-                                                   void** ppvObject);
-  virtual ULONG STDMETHODCALLTYPE AddRef();
-  virtual ULONG STDMETHODCALLTYPE Release();
-  virtual HRESULT STDMETHODCALLTYPE
+  // IUnknown.
+  HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
+                                           void** ppvObject) override;
+  ULONG STDMETHODCALLTYPE AddRef() override;
+  ULONG STDMETHODCALLTYPE Release() override;
+
+  // IDWriteFontFileLoader.
+  HRESULT STDMETHODCALLTYPE
   CreateStreamFromKey(void const* fontFileReferenceKey,
                       UINT32 fontFileReferenceKeySize,
-                      OUT IDWriteFontFileStream** fontFileStream);
+                      OUT IDWriteFontFileStream** fontFileStream) override;
 
   static IDWriteFontFileLoader* GetLoader() {
     if (!instance_) {
@@ -77,10 +88,12 @@
   ULONG refCount_;
   static IDWriteFontFileLoader* instance_;
 };
+
 class CDwFontContext {
  public:
   CDwFontContext(IDWriteFactory* dwriteFactory);
   ~CDwFontContext();
+
   HRESULT Initialize();
 
  private:
@@ -89,12 +102,14 @@
   HRESULT hr_;
   IDWriteFactory* dwriteFactory_;
 };
+
 class CDwGdiTextRenderer {
  public:
   CDwGdiTextRenderer(CFX_DIBitmap* pBitmap,
                      IDWriteBitmapRenderTarget* bitmapRenderTarget,
                      IDWriteRenderingParams* renderingParams);
   ~CDwGdiTextRenderer();
+
   HRESULT STDMETHODCALLTYPE DrawGlyphRun(const FX_RECT& text_bbox,
                                          __in_opt CFX_ClipRgn* pClipRgn,
                                          __in_opt DWRITE_MATRIX const* pMatrix,
@@ -109,13 +124,15 @@
   IDWriteBitmapRenderTarget* pRenderTarget_;
   IDWriteRenderingParams* pRenderingParams_;
 };
-CDWriteExt::CDWriteExt() {
-  m_hModule = nullptr;
-  m_pDWriteFactory = nullptr;
-  m_pDwFontContext = nullptr;
-  m_pDwTextRenderer = nullptr;
-}
+
+CDWriteExt::CDWriteExt()
+    : m_hModule(nullptr),
+      m_pDWriteFactory(nullptr),
+      m_pDwFontContext(nullptr),
+      m_pDwTextRenderer(nullptr) {}
+
 void CDWriteExt::Load() {}
+
 void CDWriteExt::Unload() {
   if (m_pDwFontContext) {
     delete (CDwFontContext*)m_pDwFontContext;
@@ -123,9 +140,11 @@
   }
   SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
 }
+
 CDWriteExt::~CDWriteExt() {
   Unload();
 }
+
 LPVOID CDWriteExt::DwCreateFontFaceFromStream(uint8_t* pData,
                                               uint32_t size,
                                               int simulation_style) {
@@ -162,6 +181,7 @@
   SafeRelease(&pDwFontFile);
   return nullptr;
 }
+
 FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap,
                                             void** renderTarget) {
   if (pBitmap->GetFormat() > FXDIB_Argb) {
@@ -203,6 +223,7 @@
   SafeRelease(&pRenderingParams);
   return FALSE;
 }
+
 FX_BOOL CDWriteExt::DwRendingString(void* renderTarget,
                                     CFX_ClipRgn* pClipRgn,
                                     FX_RECT& stringRect,
@@ -245,20 +266,24 @@
       RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color)));
   return SUCCEEDED(hr);
 }
+
 void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget) {
   delete (CDwGdiTextRenderer*)renderTarget;
 }
+
 void CDWriteExt::DwDeleteFont(void* pFont) {
   if (pFont) {
     SafeRelease((IDWriteFontFace**)&pFont);
   }
 }
+
 CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey,
                                      UINT32 fontFileReferenceKeySize) {
   refCount_ = 0;
   resourcePtr_ = fontFileReferenceKey;
   resourceSize_ = fontFileReferenceKeySize;
 }
+
 HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid,
                                                             void** ppvObject) {
   if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
@@ -269,9 +294,11 @@
   *ppvObject = nullptr;
   return E_NOINTERFACE;
 }
+
 ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef() {
   return InterlockedIncrement((long*)(&refCount_));
 }
+
 ULONG STDMETHODCALLTYPE CDwFontFileStream::Release() {
   ULONG newCount = InterlockedDecrement((long*)(&refCount_));
   if (newCount == 0) {
@@ -279,6 +306,7 @@
   }
   return newCount;
 }
+
 HRESULT STDMETHODCALLTYPE
 CDwFontFileStream::ReadFileFragment(void const** fragmentStart,
                                     UINT64 fileOffset,
@@ -295,17 +323,20 @@
   *fragmentContext = nullptr;
   return E_FAIL;
 }
+
 void STDMETHODCALLTYPE
 CDwFontFileStream::ReleaseFileFragment(void* fragmentContext) {}
 HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize) {
   *fileSize = resourceSize_;
   return S_OK;
 }
+
 HRESULT STDMETHODCALLTYPE
 CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime) {
   *lastWriteTime = 0;
   return E_NOTIMPL;
 }
+
 IDWriteFontFileLoader* CDwFontFileLoader::instance_ = nullptr;
 CDwFontFileLoader::CDwFontFileLoader() : refCount_(0) {}
 HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid,
@@ -318,9 +349,11 @@
   *ppvObject = nullptr;
   return E_NOINTERFACE;
 }
+
 ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef() {
   return InterlockedIncrement((long*)(&refCount_));
 }
+
 ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release() {
   ULONG newCount = InterlockedDecrement((long*)(&refCount_));
   if (newCount == 0) {
@@ -329,6 +362,7 @@
   }
   return newCount;
 }
+
 HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
     void const* fontFileReferenceKey,
     UINT32 fontFileReferenceKeySize,
@@ -343,14 +377,17 @@
   *fontFileStream = SafeAcquire(stream);
   return S_OK;
 }
+
 CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory)
     : hr_(S_FALSE), dwriteFactory_(SafeAcquire(dwriteFactory)) {}
+
 CDwFontContext::~CDwFontContext() {
   if (dwriteFactory_ && hr_ == S_OK) {
     dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
   }
   SafeRelease(&dwriteFactory_);
 }
+
 HRESULT CDwFontContext::Initialize() {
   if (hr_ == S_FALSE) {
     return hr_ = dwriteFactory_->RegisterFontFileLoader(
@@ -358,6 +395,7 @@
   }
   return hr_;
 }
+
 CDwGdiTextRenderer::CDwGdiTextRenderer(
     CFX_DIBitmap* pBitmap,
     IDWriteBitmapRenderTarget* bitmapRenderTarget,
@@ -369,6 +407,7 @@
   SafeRelease(&pRenderTarget_);
   SafeRelease(&pRenderingParams_);
 }
+
 STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
     const FX_RECT& text_bbox,
     __in_opt CFX_ClipRgn* pClipRgn,
diff --git a/core/fxge/win32/fx_win32_gdipext.cpp b/core/fxge/win32/fx_win32_gdipext.cpp
index 68b9aaa..3de1b5a 100644
--- a/core/fxge/win32/fx_win32_gdipext.cpp
+++ b/core/fxge/win32/fx_win32_gdipext.cpp
@@ -1258,18 +1258,14 @@
   CallFunc(GdipDeleteGraphics)(pGraphics);
   return TRUE;
 }
-class GpStream final : public IStream {
-  LONG m_RefCount;
-  int m_ReadPos;
-  CFX_ByteTextBuf m_InterStream;
 
+class GpStream final : public IStream {
  public:
-  GpStream() {
-    m_RefCount = 1;
-    m_ReadPos = 0;
-  }
-  virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
-                                                   void** ppvObject) {
+  GpStream() : m_RefCount(1), m_ReadPos(0) {}
+
+  // IUnknown
+  HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid,
+                                           void** ppvObject) override {
     if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
         iid == __uuidof(ISequentialStream)) {
       *ppvObject = static_cast<IStream*>(this);
@@ -1278,10 +1274,10 @@
     }
     return E_NOINTERFACE;
   }
-  virtual ULONG STDMETHODCALLTYPE AddRef(void) {
+  ULONG STDMETHODCALLTYPE AddRef(void) override {
     return (ULONG)InterlockedIncrement(&m_RefCount);
   }
-  virtual ULONG STDMETHODCALLTYPE Release(void) {
+  ULONG STDMETHODCALLTYPE Release(void) override {
     ULONG res = (ULONG)InterlockedDecrement(&m_RefCount);
     if (res == 0) {
       delete this;
@@ -1289,10 +1285,10 @@
     return res;
   }
 
- public:
-  virtual HRESULT STDMETHODCALLTYPE Read(void* Output,
-                                         ULONG cb,
-                                         ULONG* pcbRead) {
+  // ISequentialStream
+  HRESULT STDMETHODCALLTYPE Read(void* Output,
+                                 ULONG cb,
+                                 ULONG* pcbRead) override {
     size_t bytes_left;
     size_t bytes_out;
     if (pcbRead) {
@@ -1310,9 +1306,9 @@
     }
     return S_OK;
   }
-  virtual HRESULT STDMETHODCALLTYPE Write(void const* Input,
-                                          ULONG cb,
-                                          ULONG* pcbWritten) {
+  HRESULT STDMETHODCALLTYPE Write(void const* Input,
+                                  ULONG cb,
+                                  ULONG* pcbWritten) override {
     if (cb <= 0) {
       if (pcbWritten) {
         *pcbWritten = 0;
@@ -1326,34 +1322,34 @@
     return S_OK;
   }
 
- public:
-  virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER) {
+  // IStream
+  HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER) override {
     return E_NOTIMPL;
   }
-  virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*,
-                                           ULARGE_INTEGER,
-                                           ULARGE_INTEGER*,
-                                           ULARGE_INTEGER*) {
+  HRESULT STDMETHODCALLTYPE CopyTo(IStream*,
+                                   ULARGE_INTEGER,
+                                   ULARGE_INTEGER*,
+                                   ULARGE_INTEGER*) override {
     return E_NOTIMPL;
   }
-  virtual HRESULT STDMETHODCALLTYPE Commit(DWORD) { return E_NOTIMPL; }
-  virtual HRESULT STDMETHODCALLTYPE Revert(void) { return E_NOTIMPL; }
-  virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER,
-                                               ULARGE_INTEGER,
-                                               DWORD) {
+  HRESULT STDMETHODCALLTYPE Commit(DWORD) override { return E_NOTIMPL; }
+  HRESULT STDMETHODCALLTYPE Revert(void) override { return E_NOTIMPL; }
+  HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER,
+                                       ULARGE_INTEGER,
+                                       DWORD) override {
     return E_NOTIMPL;
   }
-  virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER,
-                                                 ULARGE_INTEGER,
-                                                 DWORD) {
+  HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER,
+                                         ULARGE_INTEGER,
+                                         DWORD) override {
     return E_NOTIMPL;
   }
-  virtual HRESULT STDMETHODCALLTYPE Clone(IStream** stream) {
+  HRESULT STDMETHODCALLTYPE Clone(IStream** stream) override {
     return E_NOTIMPL;
   }
-  virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove,
-                                         DWORD dwOrigin,
-                                         ULARGE_INTEGER* lpNewFilePointer) {
+  HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove,
+                                 DWORD dwOrigin,
+                                 ULARGE_INTEGER* lpNewFilePointer) override {
     long start = 0;
     long new_read_position;
     switch (dwOrigin) {
@@ -1381,7 +1377,8 @@
     }
     return S_OK;
   }
-  virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag) {
+  HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg,
+                                 DWORD grfStatFlag) override {
     if (!pStatstg) {
       return STG_E_INVALIDFUNCTION;
     }
@@ -1389,7 +1386,13 @@
     pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
     return S_OK;
   }
+
+ private:
+  LONG m_RefCount;
+  int m_ReadPos;
+  CFX_ByteTextBuf m_InterStream;
 };
+
 typedef struct {
   BITMAPINFO* pbmi;
   int Stride;
@@ -1398,6 +1401,7 @@
   BitmapData* pBitmapData;
   GpStream* pStream;
 } PREVIEW3_DIBITMAP;
+
 static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args) {
   GpBitmap* pBitmap;
   GpStream* pStream = nullptr;
@@ -1477,6 +1481,7 @@
   pInfo->pStream = pStream;
   return pInfo;
 }
+
 static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo) {
   CGdiplusExt& GdiplusExt =
       ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
@@ -1489,6 +1494,7 @@
   }
   FX_Free(pInfo);
 }
+
 CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi,
                                          LPVOID pData,
                                          FX_BOOL bAlpha);
diff --git a/core/fxge/win32/win32_int.h b/core/fxge/win32/win32_int.h
index e095270..b09c4eb 100644
--- a/core/fxge/win32/win32_int.h
+++ b/core/fxge/win32/win32_int.h
@@ -137,7 +137,7 @@
                            uint32_t color,
                            int blend_type) override;
   FX_BOOL GetClipBox(FX_RECT* pRect) override;
-  void* GetPlatformSurface() const override { return (void*)m_hDC; }
+  void* GetPlatformSurface() const override;
 
   void DrawLine(FX_FLOAT x1,
                 FX_FLOAT y1,
@@ -203,9 +203,7 @@
                       const CFX_Matrix* pMatrix,
                       uint32_t render_flags,
                       void*& handle,
-                      int blend_type) override {
-    return FALSE;
-  }
+                      int blend_type) override;
   FX_BOOL UseFoxitStretchEngine(const CFX_DIBSource* pSource,
                                 uint32_t color,
                                 int dest_left,
diff --git a/pdfium.gyp b/pdfium.gyp
index cebeb73..153864a 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -212,6 +212,8 @@
       'target_name': 'fpdfdoc',
       'type': 'static_library',
       'sources': [
+        'core/fpdfdoc/clines.cpp',
+        'core/fpdfdoc/clines.h',
         'core/fpdfdoc/include/fpdf_doc.h',
         'core/fpdfdoc/include/fpdf_tagged.h',
         'core/fpdfdoc/cpdf_variabletext.cpp',
