diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpdf_variabletext.cpp
index 3c71ed8..118efa6 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpdf_variabletext.cpp
@@ -4,10 +4,11 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "core/fpdfdoc/include/cpdf_variabletext.h"
+
 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
 #include "core/fpdfdoc/cpvt_wordinfo.h"
 #include "core/fpdfdoc/csection.h"
-#include "core/fpdfdoc/include/cpdf_variabletext.h"
 #include "core/fpdfdoc/include/cpvt_section.h"
 #include "core/fpdfdoc/include/cpvt_word.h"
 #include "core/fpdfdoc/include/ipvt_fontmap.h"
@@ -70,11 +71,8 @@
 }
 
 FX_BOOL CPDF_VariableText::Provider::IsLatinWord(uint16_t word) {
-  if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) ||
-      word == 0x2D || word == 0x27) {
-    return TRUE;
-  }
-  return FALSE;
+  return (word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) ||
+         word == 0x2D || word == 0x27;
 }
 
 int32_t CPDF_VariableText::Provider::GetDefaultFontIndex() {
@@ -1051,22 +1049,20 @@
   return (FX_FLOAT)gFontSizeSteps[nMid];
 }
 
-FX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) {
-  FX_BOOL bBigger = FALSE;
-  CPVT_Size szTotal;
+bool CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) const {
+  CFX_SizeF szTotal;
   for (int32_t s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
     if (CSection* pSection = m_SectionArray.GetAt(s)) {
-      CPVT_Size size = pSection->GetSectionSize(fFontSize);
+      CFX_SizeF size = pSection->GetSectionSize(fFontSize);
       szTotal.x = std::max(size.x, szTotal.x);
       szTotal.y += size.y;
       if (IsFloatBigger(szTotal.x, GetPlateWidth()) ||
           IsFloatBigger(szTotal.y, GetPlateHeight())) {
-        bBigger = TRUE;
-        break;
+        return true;
       }
     }
   }
-  return bBigger;
+  return false;
 }
 
 CPVT_FloatRect CPDF_VariableText::RearrangeSections(
diff --git a/core/fpdfdoc/csection.h b/core/fpdfdoc/csection.h
index d8974cb..4ac345c 100644
--- a/core/fpdfdoc/csection.h
+++ b/core/fpdfdoc/csection.h
@@ -18,10 +18,11 @@
 struct CPVT_WordLine;
 struct CPVT_WordPlace;
 
-class CSection {
+class CSection final {
  public:
   explicit CSection(CPDF_VariableText* pVT);
-  virtual ~CSection();
+  ~CSection();
+
   void ResetAll();
   void ResetLineArray();
   void ResetWordArray();
@@ -32,7 +33,7 @@
   void ClearWords(const CPVT_WordRange& PlaceRange);
   void ClearWord(const CPVT_WordPlace& place);
   CPVT_FloatRect Rearrange();
-  CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
+  CFX_SizeF GetSectionSize(FX_FLOAT fFontSize);
   CPVT_WordPlace GetBeginWordPlace() const;
   CPVT_WordPlace GetEndWordPlace() const;
   CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
@@ -56,7 +57,7 @@
   void ClearRightWords(int32_t nWordIndex);
   void ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex);
 
-  CPDF_VariableText* m_pVT;
+  CPDF_VariableText* const m_pVT;
 };
 
 #endif  // CORE_FPDFDOC_CSECTION_H_
diff --git a/core/fpdfdoc/ctypeset.h b/core/fpdfdoc/ctypeset.h
index 25bb31a..1ead422 100644
--- a/core/fpdfdoc/ctypeset.h
+++ b/core/fpdfdoc/ctypeset.h
@@ -13,11 +13,12 @@
 class CPDF_VariableText;
 class CSection;
 
-class CTypeset {
+class CTypeset final {
  public:
   explicit CTypeset(CSection* pSection);
-  virtual ~CTypeset();
-  CPVT_Size GetEditSize(FX_FLOAT fFontSize);
+  ~CTypeset();
+
+  CFX_SizeF GetEditSize(FX_FLOAT fFontSize);
   CPVT_FloatRect Typeset();
   CPVT_FloatRect CharArray();
 
@@ -26,7 +27,7 @@
   void OutputLines();
 
   CPVT_FloatRect m_rcRet;
-  CPDF_VariableText* m_pVT;
+  CPDF_VariableText* const m_pVT;
   CSection* const m_pSection;
 };
 
diff --git a/core/fpdfdoc/doc_vt.cpp b/core/fpdfdoc/doc_vt.cpp
index 88a4636..7ca279b 100644
--- a/core/fpdfdoc/doc_vt.cpp
+++ b/core/fpdfdoc/doc_vt.cpp
@@ -82,7 +82,7 @@
   }
   return CTypeset(this).Typeset();
 }
-CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize) {
+CFX_SizeF CSection::GetSectionSize(FX_FLOAT fFontSize) {
   return CTypeset(this).GetEditSize(fFontSize);
 }
 CPVT_WordPlace CSection::GetBeginWordPlace() const {
@@ -376,11 +376,11 @@
   }
   return m_rcRet = CPVT_FloatRect(0, 0, x, y);
 }
-CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize) {
+CFX_SizeF CTypeset::GetEditSize(FX_FLOAT fFontSize) {
   ASSERT(m_pSection);
   ASSERT(m_pVT);
   SplitLines(FALSE, fFontSize);
-  return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
+  return CFX_SizeF(m_rcRet.Width(), m_rcRet.Height());
 }
 CPVT_FloatRect CTypeset::Typeset() {
   ASSERT(m_pVT);
diff --git a/core/fpdfdoc/include/cpdf_variabletext.h b/core/fpdfdoc/include/cpdf_variabletext.h
index c9184bc..30bff84 100644
--- a/core/fpdfdoc/include/cpdf_variabletext.h
+++ b/core/fpdfdoc/include/cpdf_variabletext.h
@@ -228,7 +228,7 @@
 
   CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange);
   FX_FLOAT GetAutoFontSize();
-  FX_BOOL IsBigger(FX_FLOAT fFontSize);
+  bool IsBigger(FX_FLOAT fFontSize) const;
   CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange);
 
   void ResetSectionArray();
diff --git a/core/fpdfdoc/pdf_vt.h b/core/fpdfdoc/pdf_vt.h
index a3b7883..9026eee 100644
--- a/core/fpdfdoc/pdf_vt.h
+++ b/core/fpdfdoc/pdf_vt.h
@@ -20,22 +20,6 @@
 #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
 #define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb))
 
-class CPVT_Size {
- public:
-  CPVT_Size() : x(0.0f), y(0.0f) {}
-  CPVT_Size(FX_FLOAT other_x, FX_FLOAT other_y) {
-    x = other_x;
-    y = other_y;
-  }
-  FX_FLOAT x, y;
-};
-
-struct CPVT_FloatRange {
-  CPVT_FloatRange() : fMin(0.0f), fMax(0.0f) {}
-  CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max) {}
-  FX_FLOAT Range() const { return fMax - fMin; }
-  FX_FLOAT fMin, fMax;
-};
 template <class TYPE>
 class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE> {
  public:
@@ -52,10 +36,11 @@
     }
   }
 };
-class CLine {
+class CLine final {
  public:
   CLine();
-  virtual ~CLine();
+  ~CLine();
+
   CPVT_WordPlace GetBeginWordPlace() const;
   CPVT_WordPlace GetEndWordPlace() const;
   CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
@@ -63,10 +48,12 @@
   CPVT_WordPlace LinePlace;
   CPVT_LineInfo m_LineInfo;
 };
-class CLines {
+
+class CLines final {
  public:
   CLines() : m_nTotal(0) {}
-  virtual ~CLines() { RemoveAll(); }
+  ~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; }
@@ -103,6 +90,7 @@
  public:
   CPDF_EditContainer() : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {}
   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) {
@@ -111,8 +99,8 @@
   virtual CFX_FloatRect GetContentRect() const { return m_rcContent; }
   FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; }
   FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; }
-  CPVT_Size GetPlateSize() const {
-    return CPVT_Size(GetPlateWidth(), GetPlateHeight());
+  CFX_SizeF GetPlateSize() const {
+    return CFX_SizeF(GetPlateWidth(), GetPlateHeight());
   }
   CFX_FloatPoint GetBTPoint() const {
     return CFX_FloatPoint(m_rcPlate.left, m_rcPlate.top);
