Revert of Remove unneeded CPVT classes. (patchset #7 id:140001 of https://codereview.chromium.org/1919283008/ )

Reason for revert:
Causing segv on certain PDFs which make the PDF load tests hang.  crbug.com/608901

Original issue's description:
> Remove unneeded CPVT classes.
>
> - CPVT_Size is the same as CFX_PointF
> - CPVT_FloatRange is unused.
> - CPVT_ArrayTemplate is just a wrapper for CFX_ArrayTemplate.
>
> Committed: https://pdfium.googlesource.com/pdfium/+/a354eb517429e10d84abff65e455f0c183fe58e0

TBR=thestig@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.

Review-Url: https://codereview.chromium.org/1947093002
diff --git a/BUILD.gn b/BUILD.gn
index e67e17f..587bd40 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -223,7 +223,6 @@
     "core/fpdfdoc/doc_utils.h",
     "core/fpdfdoc/doc_viewerPreferences.cpp",
     "core/fpdfdoc/doc_vt.cpp",
-    "core/fpdfdoc/doc_vt.h",
     "core/fpdfdoc/include/cpdf_variabletext.h",
     "core/fpdfdoc/include/cpvt_line.h",
     "core/fpdfdoc/include/cpvt_secprops.h",
@@ -235,6 +234,7 @@
     "core/fpdfdoc/include/fpdf_doc.h",
     "core/fpdfdoc/include/fpdf_tagged.h",
     "core/fpdfdoc/ipvt_fontmap.h",
+    "core/fpdfdoc/pdf_vt.h",
     "core/fpdfdoc/tagged_int.h",
   ]
   configs += [ ":pdfium_config" ]
diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpdf_variabletext.cpp
index 33451de..6788740 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpdf_variabletext.cpp
@@ -4,11 +4,10 @@
 
 // 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"
@@ -71,8 +70,11 @@
 }
 
 FX_BOOL CPDF_VariableText::Provider::IsLatinWord(uint16_t word) {
-  return (word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) ||
-         word == 0x2D || word == 0x27;
+  if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) ||
+      word == 0x2D || word == 0x27) {
+    return TRUE;
+  }
+  return FALSE;
 }
 
 int32_t CPDF_VariableText::Provider::GetDefaultFontIndex() {
@@ -162,36 +164,28 @@
 
 FX_BOOL CPDF_VariableText::Iterator::GetWord(CPVT_Word& word) const {
   word.WordPlace = m_CurPos;
-  CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex);
-  if (!pSection)
-    return FALSE;
+  if (CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+    if (pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
+      if (CPVT_WordInfo* pWord =
+              pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
+        word.Word = pWord->Word;
+        word.nCharset = pWord->nCharset;
+        word.fWidth = m_pVT->GetWordWidth(*pWord);
+        word.ptWord = m_pVT->InToOut(
+            CFX_FloatPoint(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
+                           pWord->fWordY + pSection->m_SecInfo.rcSection.top));
+        word.fAscent = m_pVT->GetWordAscent(*pWord);
+        word.fDescent = m_pVT->GetWordDescent(*pWord);
+        if (pWord->pWordProps)
+          word.WordProps = *pWord->pWordProps;
 
-  if (!pSection->m_LineArray.GetAt(m_CurPos.nLineIndex))
-    return FALSE;
-
-  if (m_CurPos.nWordIndex < 0 ||
-      m_CurPos.nWordIndex >= pSection->m_WordArray.GetSize()) {
-    return FALSE;
+        word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
+        word.fFontSize = m_pVT->GetWordFontSize(*pWord);
+        return TRUE;
+      }
+    }
   }
-
-  CPVT_WordInfo* pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex);
-  if (!pWord)
-    return FALSE;
-
-  word.Word = pWord->Word;
-  word.nCharset = pWord->nCharset;
-  word.fWidth = m_pVT->GetWordWidth(*pWord);
-  word.ptWord = m_pVT->InToOut(
-      CFX_FloatPoint(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
-                     pWord->fWordY + pSection->m_SecInfo.rcSection.top));
-  word.fAscent = m_pVT->GetWordAscent(*pWord);
-  word.fDescent = m_pVT->GetWordDescent(*pWord);
-  if (pWord->pWordProps)
-    word.WordProps = *pWord->pWordProps;
-
-  word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
-  word.fFontSize = m_pVT->GetWordFontSize(*pWord);
-  return TRUE;
+  return FALSE;
 }
 
 FX_BOOL CPDF_VariableText::Iterator::SetWord(const CPVT_Word& word) {
@@ -735,7 +729,7 @@
 
 CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace& place,
                                           const CPVT_LineInfo& lineinfo) {
-  if (m_SectionArray.GetSize() == 0)
+  if (m_SectionArray.IsEmpty())
     return place;
   if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex))
     return pSection->AddLine(lineinfo);
@@ -744,9 +738,9 @@
 
 CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace& place,
                                           const CPVT_WordInfo& wordinfo) {
-  if (m_SectionArray.GetSize() <= 0)
+  if (m_SectionArray.GetSize() <= 0) {
     return place;
-
+  }
   CPVT_WordPlace newplace = place;
   newplace.nSecIndex =
       std::max(std::min(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
@@ -1059,20 +1053,22 @@
   return (FX_FLOAT)gFontSizeSteps[nMid];
 }
 
-bool CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) const {
-  CFX_PointF szTotal;
+FX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize) {
+  FX_BOOL bBigger = FALSE;
+  CPVT_Size szTotal;
   for (int32_t s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
     if (CSection* pSection = m_SectionArray.GetAt(s)) {
-      CFX_PointF size = pSection->GetSectionSize(fFontSize);
+      CPVT_Size 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())) {
-        return true;
+        bBigger = TRUE;
+        break;
       }
     }
   }
-  return false;
+  return bBigger;
 }
 
 CPVT_FloatRect CPDF_VariableText::RearrangeSections(
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 3a7fedd..ec1b9fb 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -13,9 +13,9 @@
 #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h"
 #include "core/fpdfdoc/cpvt_color.h"
 #include "core/fpdfdoc/cpvt_fontmap.h"
-#include "core/fpdfdoc/doc_vt.h"
 #include "core/fpdfdoc/include/cpvt_word.h"
 #include "core/fpdfdoc/include/fpdf_doc.h"
+#include "core/fpdfdoc/pdf_vt.h"
 
 namespace {
 
diff --git a/core/fpdfdoc/csection.h b/core/fpdfdoc/csection.h
index f6a9f3b..d8974cb 100644
--- a/core/fpdfdoc/csection.h
+++ b/core/fpdfdoc/csection.h
@@ -21,8 +21,7 @@
 class CSection {
  public:
   explicit CSection(CPDF_VariableText* pVT);
-  ~CSection();
-
+  virtual ~CSection();
   void ResetAll();
   void ResetLineArray();
   void ResetWordArray();
@@ -33,7 +32,7 @@
   void ClearWords(const CPVT_WordRange& PlaceRange);
   void ClearWord(const CPVT_WordPlace& place);
   CPVT_FloatRect Rearrange();
-  CFX_PointF GetSectionSize(FX_FLOAT fFontSize);
+  CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
   CPVT_WordPlace GetBeginWordPlace() const;
   CPVT_WordPlace GetEndWordPlace() const;
   CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
@@ -48,7 +47,7 @@
   CPVT_WordPlace SecPlace;
   CPVT_SectionInfo m_SecInfo;
   CLines m_LineArray;
-  CFX_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
+  CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
 
  private:
   friend class CTypeset;
diff --git a/core/fpdfdoc/ctypeset.h b/core/fpdfdoc/ctypeset.h
index 1401050..25bb31a 100644
--- a/core/fpdfdoc/ctypeset.h
+++ b/core/fpdfdoc/ctypeset.h
@@ -16,17 +16,14 @@
 class CTypeset {
  public:
   explicit CTypeset(CSection* pSection);
-  ~CTypeset();
-
-  CFX_PointF GetEditSize(FX_FLOAT fFontSize);
+  virtual ~CTypeset();
+  CPVT_Size GetEditSize(FX_FLOAT fFontSize);
   CPVT_FloatRect Typeset();
   CPVT_FloatRect CharArray();
 
  private:
   void SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
   void OutputLines();
-  FX_FLOAT GetXPosForAlignment(FX_FLOAT fTypesetWidth,
-                               FX_FLOAT fLineWidth) const;
 
   CPVT_FloatRect m_rcRet;
   CPDF_VariableText* m_pVT;
diff --git a/core/fpdfdoc/doc_vt.cpp b/core/fpdfdoc/doc_vt.cpp
index 985ffa5..88a4636 100644
--- a/core/fpdfdoc/doc_vt.cpp
+++ b/core/fpdfdoc/doc_vt.cpp
@@ -4,19 +4,16 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfdoc/doc_vt.h"
-
 #include <algorithm>
 
 #include "core/fpdfdoc/cpvt_wordinfo.h"
 #include "core/fpdfdoc/csection.h"
 #include "core/fpdfdoc/include/cpdf_variabletext.h"
 #include "core/fpdfdoc/include/fpdf_doc.h"
+#include "core/fpdfdoc/pdf_vt.h"
 
 CLine::CLine() {}
-
 CLine::~CLine() {}
-
 CPVT_WordPlace CLine::GetBeginWordPlace() const {
   return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
 }
@@ -64,104 +61,102 @@
     }
   }
 }
-
 CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace& place,
                                  const CPVT_WordInfo& wordinfo) {
   CPVT_WordInfo* pWord = new CPVT_WordInfo(wordinfo);
   int32_t nWordIndex =
       std::max(std::min(place.nWordIndex, m_WordArray.GetSize()), 0);
-  if (nWordIndex == m_WordArray.GetSize())
+  if (nWordIndex == m_WordArray.GetSize()) {
     m_WordArray.Add(pWord);
-  else
+  } else {
     m_WordArray.InsertAt(nWordIndex, pWord);
+  }
   return place;
 }
-
 CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo& lineinfo) {
   return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
 }
-
 CPVT_FloatRect CSection::Rearrange() {
-  if (m_pVT->m_nCharArray > 0)
+  if (m_pVT->m_nCharArray > 0) {
     return CTypeset(this).CharArray();
+  }
   return CTypeset(this).Typeset();
 }
-
-CFX_PointF CSection::GetSectionSize(FX_FLOAT fFontSize) {
+CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize) {
   return CTypeset(this).GetEditSize(fFontSize);
 }
-
 CPVT_WordPlace CSection::GetBeginWordPlace() const {
-  if (CLine* pLine = m_LineArray.GetAt(0))
+  if (CLine* pLine = m_LineArray.GetAt(0)) {
     return pLine->GetBeginWordPlace();
+  }
   return SecPlace;
 }
-
 CPVT_WordPlace CSection::GetEndWordPlace() const {
-  if (CLine* pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1))
+  if (CLine* pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
     return pLine->GetEndWordPlace();
+  }
   return SecPlace;
 }
-
 CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace& place) const {
-  if (place.nLineIndex < 0)
+  if (place.nLineIndex < 0) {
     return GetBeginWordPlace();
-
-  if (place.nLineIndex >= m_LineArray.GetSize())
+  }
+  if (place.nLineIndex >= m_LineArray.GetSize()) {
     return GetEndWordPlace();
-
+  }
   if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) {
-    if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex)
+    if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {
       return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
-
-    if (place.nWordIndex >= pLine->m_LineInfo.nBeginWordIndex)
+    }
+    if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+      if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
+        return pPrevLine->GetEndWordPlace();
+      }
+    } else {
       return pLine->GetPrevWordPlace(place);
-
-    if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1))
-      return pPrevLine->GetEndWordPlace();
+    }
   }
   return place;
 }
-
 CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace& place) const {
-  if (place.nLineIndex < 0)
+  if (place.nLineIndex < 0) {
     return GetBeginWordPlace();
-
-  if (place.nLineIndex >= m_LineArray.GetSize())
+  }
+  if (place.nLineIndex >= m_LineArray.GetSize()) {
     return GetEndWordPlace();
-
+  }
   if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) {
-    if (place.nWordIndex < pLine->m_LineInfo.nEndWordIndex)
+    if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
+      if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
+        return pNextLine->GetBeginWordPlace();
+      }
+    } else {
       return pLine->GetNextWordPlace(place);
-
-    if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1))
-      return pNextLine->GetBeginWordPlace();
+    }
   }
   return place;
 }
-
 void CSection::UpdateWordPlace(CPVT_WordPlace& place) const {
   int32_t nLeft = 0;
   int32_t nRight = m_LineArray.GetSize() - 1;
   int32_t nMid = (nLeft + nRight) / 2;
   while (nLeft <= nRight) {
-    CLine* pLine = m_LineArray.GetAt(nMid);
-    if (!pLine)
-      return;
-
-    if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
-      nRight = nMid - 1;
-      nMid = (nLeft + nRight) / 2;
-    } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
-      nLeft = nMid + 1;
-      nMid = (nLeft + nRight) / 2;
+    if (CLine* pLine = m_LineArray.GetAt(nMid)) {
+      if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+        nRight = nMid - 1;
+        nMid = (nLeft + nRight) / 2;
+      } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
+        nLeft = nMid + 1;
+        nMid = (nLeft + nRight) / 2;
+      } else {
+        place.nLineIndex = nMid;
+        return;
+      }
     } else {
-      place.nLineIndex = nMid;
-      return;
+      break;
     }
   }
 }
-
 CPVT_WordPlace CSection::SearchWordPlace(const CFX_FloatPoint& point) const {
   ASSERT(m_pVT);
   CPVT_WordPlace place = GetBeginWordPlace();
@@ -177,78 +172,81 @@
       fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent -
              m_pVT->GetLineLeading(m_SecInfo);
       fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
-      if (IsFloatBigger(point.y, fTop))
+      if (IsFloatBigger(point.y, fTop)) {
         bUp = FALSE;
-
-      if (IsFloatSmaller(point.y, fBottom))
+      }
+      if (IsFloatSmaller(point.y, fBottom)) {
         bDown = FALSE;
-
+      }
       if (IsFloatSmaller(point.y, fTop)) {
         nRight = nMid - 1;
         nMid = (nLeft + nRight) / 2;
         continue;
-      }
-      if (IsFloatBigger(point.y, fBottom)) {
+      } else if (IsFloatBigger(point.y, fBottom)) {
         nLeft = nMid + 1;
         nMid = (nLeft + nRight) / 2;
         continue;
+      } else {
+        place = SearchWordPlace(
+            point.x,
+            CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
+                           pLine->GetEndWordPlace()));
+        place.nLineIndex = nMid;
+        return place;
       }
-
-      place = SearchWordPlace(
-          point.x,
-          CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
-                         pLine->GetEndWordPlace()));
-      place.nLineIndex = nMid;
-      return place;
     }
   }
-  if (bUp)
+  if (bUp) {
     place = GetBeginWordPlace();
-  if (bDown)
+  }
+  if (bDown) {
     place = GetEndWordPlace();
+  }
   return place;
 }
-
 CPVT_WordPlace CSection::SearchWordPlace(
     FX_FLOAT fx,
     const CPVT_WordPlace& lineplace) const {
-  CLine* pLine = m_LineArray.GetAt(lineplace.nLineIndex);
-  if (!pLine)
-    return GetBeginWordPlace();
-  return SearchWordPlace(
-      fx - m_SecInfo.rcSection.left,
-      CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
-                     pLine->GetEndWordPlace()));
+  if (CLine* pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {
+    return SearchWordPlace(
+        fx - m_SecInfo.rcSection.left,
+        CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
+                       pLine->GetEndWordPlace()));
+  }
+  return GetBeginWordPlace();
 }
-
 CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx,
                                          const CPVT_WordRange& range) const {
   CPVT_WordPlace wordplace = range.BeginPos;
   wordplace.nWordIndex = -1;
-  if (!m_pVT)
+  if (!m_pVT) {
     return wordplace;
-
+  }
   int32_t nLeft = range.BeginPos.nWordIndex;
   int32_t nRight = range.EndPos.nWordIndex + 1;
   int32_t nMid = (nLeft + nRight) / 2;
   while (nLeft < nRight) {
-    if (nMid == nLeft)
+    if (nMid == nLeft) {
       break;
-
+    }
     if (nMid == nRight) {
       nMid--;
       break;
     }
-
-    CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid);
-    if (!pWord)
+    if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) {
+      if (fx >
+          pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) {
+        nLeft = nMid;
+        nMid = (nLeft + nRight) / 2;
+        continue;
+      } else {
+        nRight = nMid;
+        nMid = (nLeft + nRight) / 2;
+        continue;
+      }
+    } else {
       break;
-
-    if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF)
-      nLeft = nMid;
-    else
-      nRight = nMid;
-    nMid = (nLeft + nRight) / 2;
+    }
   }
   if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) {
     if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) {
@@ -257,28 +255,24 @@
   }
   return wordplace;
 }
-
 void CSection::ClearLeftWords(int32_t nWordIndex) {
   for (int32_t i = nWordIndex; i >= 0; i--) {
     delete m_WordArray.GetAt(i);
     m_WordArray.RemoveAt(i);
   }
 }
-
 void CSection::ClearRightWords(int32_t nWordIndex) {
   for (int32_t i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
     delete m_WordArray.GetAt(i);
     m_WordArray.RemoveAt(i);
   }
 }
-
 void CSection::ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex) {
   for (int32_t i = nEndIndex; i > nBeginIndex; i--) {
     delete m_WordArray.GetAt(i);
     m_WordArray.RemoveAt(i);
   }
 }
-
 void CSection::ClearWords(const CPVT_WordRange& PlaceRange) {
   CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
   CPVT_WordPlace SecEndPos = GetEndWordPlace();
@@ -295,19 +289,15 @@
     ResetWordArray();
   }
 }
-
 void CSection::ClearWord(const CPVT_WordPlace& place) {
   delete m_WordArray.GetAt(place.nWordIndex);
   m_WordArray.RemoveAt(place.nWordIndex);
 }
-
 CTypeset::CTypeset(CSection* pSection)
     : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f),
       m_pVT(pSection->m_pVT),
       m_pSection(pSection) {}
-
 CTypeset::~CTypeset() {}
-
 CPVT_FloatRect CTypeset::CharArray() {
   ASSERT(m_pSection);
   FX_FLOAT fLineAscent =
@@ -386,14 +376,12 @@
   }
   return m_rcRet = CPVT_FloatRect(0, 0, x, y);
 }
-
-CFX_PointF CTypeset::GetEditSize(FX_FLOAT fFontSize) {
+CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize) {
   ASSERT(m_pSection);
   ASSERT(m_pVT);
   SplitLines(FALSE, fFontSize);
-  return CFX_PointF(m_rcRet.Width(), m_rcRet.Height());
+  return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
 }
-
 CPVT_FloatRect CTypeset::Typeset() {
   ASSERT(m_pVT);
   m_pSection->m_LineArray.Empty();
@@ -705,103 +693,77 @@
   }
   m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
 }
-
 void CTypeset::OutputLines() {
+  ASSERT(m_pVT);
+  ASSERT(m_pSection);
+  FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
+  FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
   FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
   FX_FLOAT fTypesetWidth = std::max(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
-  FX_FLOAT fMinX = GetXPosForAlignment(fTypesetWidth, m_rcRet.Width());
-  FX_FLOAT fMinY = 0.0f;
-  FX_FLOAT fMaxX = fMinX + m_rcRet.Width();
-  FX_FLOAT fMaxY = m_rcRet.Height();
-
-  int32_t nTotalLines = m_pSection->m_LineArray.GetSize();
-  if (nTotalLines <= 0) {
-    m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
-    return;
-  }
-
-  FX_FLOAT fPosX = 0.0f;
-  FX_FLOAT fPosY = 0.0f;
-  m_pSection->m_SecInfo.nTotalLine = nTotalLines;
-  for (int32_t l = 0; l < nTotalLines; l++) {
-    CLine* pLine = m_pSection->m_LineArray.GetAt(l);
-    if (!pLine)
-      continue;
-
-    fPosX = GetXPosForAlignment(fTypesetWidth, pLine->m_LineInfo.fLineWidth);
-    switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
-      default:
-      case 0:
-        fPosX = 0;
-        break;
-      case 1:
-        fPosX =
-            (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * VARIABLETEXT_HALF;
-        break;
-      case 2:
-        fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
-        break;
-    }
-    fPosX += fLineIndent;
-    fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
-    fPosY += pLine->m_LineInfo.fLineAscent;
-    pLine->m_LineInfo.fLineX = fPosX - fMinX;
-    pLine->m_LineInfo.fLineY = fPosY - fMinY;
-    for (int32_t w = pLine->m_LineInfo.nBeginWordIndex;
-         w <= pLine->m_LineInfo.nEndWordIndex; w++) {
-      if (w < 0 || w >= m_pSection->m_WordArray.GetSize())
-        continue;
-
-      CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w);
-      if (!pWord)
-        continue;
-
-      pWord->fWordX = fPosX - fMinX;
-      if (pWord->pWordProps) {
-        switch (pWord->pWordProps->nScriptType) {
-          default:
-          case CPDF_VariableText::ScriptType::Normal:
-            pWord->fWordY = fPosY - fMinY;
-            break;
-          case CPDF_VariableText::ScriptType::Super:
-            pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
-            break;
-          case CPDF_VariableText::ScriptType::Sub:
-            pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
-            break;
-        }
-      } else {
-        pWord->fWordY = fPosY - fMinY;
-      }
-      fPosX += m_pVT->GetWordWidth(*pWord);
-    }
-    fPosY -= pLine->m_LineInfo.fLineDescent;
-  }
-  m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
-}
-
-FX_FLOAT CTypeset::GetXPosForAlignment(FX_FLOAT fTypesetWidth,
-                                       FX_FLOAT fLineWidth) const {
   switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
     default:
     case 0:
-      return 0;
+      fMinX = 0.0f;
+      break;
     case 1:
-      return (fTypesetWidth - fLineWidth) * VARIABLETEXT_HALF;
+      fMinX = (fTypesetWidth - m_rcRet.Width()) * VARIABLETEXT_HALF;
+      break;
     case 2:
-      return fTypesetWidth - fLineWidth;
+      fMinX = fTypesetWidth - m_rcRet.Width();
+      break;
   }
-}
-
-CPDF_EditContainer::CPDF_EditContainer()
-    : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {}
-
-CPDF_EditContainer::~CPDF_EditContainer() {}
-
-CFX_FloatRect CPDF_EditContainer::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);
+  fMaxX = fMinX + m_rcRet.Width();
+  fMinY = 0.0f;
+  fMaxY = m_rcRet.Height();
+  int32_t nTotalLines = m_pSection->m_LineArray.GetSize();
+  if (nTotalLines > 0) {
+    m_pSection->m_SecInfo.nTotalLine = nTotalLines;
+    for (int32_t l = 0; l < nTotalLines; l++) {
+      if (CLine* pLine = m_pSection->m_LineArray.GetAt(l)) {
+        switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+          default:
+          case 0:
+            fPosX = 0;
+            break;
+          case 1:
+            fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) *
+                    VARIABLETEXT_HALF;
+            break;
+          case 2:
+            fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
+            break;
+        }
+        fPosX += fLineIndent;
+        fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
+        fPosY += pLine->m_LineInfo.fLineAscent;
+        pLine->m_LineInfo.fLineX = fPosX - fMinX;
+        pLine->m_LineInfo.fLineY = fPosY - fMinY;
+        for (int32_t w = pLine->m_LineInfo.nBeginWordIndex;
+             w <= pLine->m_LineInfo.nEndWordIndex; w++) {
+          if (CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w)) {
+            pWord->fWordX = fPosX - fMinX;
+            if (pWord->pWordProps) {
+              switch (pWord->pWordProps->nScriptType) {
+                default:
+                case CPDF_VariableText::ScriptType::Normal:
+                  pWord->fWordY = fPosY - fMinY;
+                  break;
+                case CPDF_VariableText::ScriptType::Super:
+                  pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
+                  break;
+                case CPDF_VariableText::ScriptType::Sub:
+                  pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
+                  break;
+              }
+            } else {
+              pWord->fWordY = fPosY - fMinY;
+            }
+            fPosX += m_pVT->GetWordWidth(*pWord);
+          }
+        }
+        fPosY -= pLine->m_LineInfo.fLineDescent;
+      }
+    }
+  }
+  m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
 }
diff --git a/core/fpdfdoc/doc_vt.h b/core/fpdfdoc/doc_vt.h
deleted file mode 100644
index 09be92b..0000000
--- a/core/fpdfdoc/doc_vt.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FPDFDOC_DOC_VT_H_
-#define CORE_FPDFDOC_DOC_VT_H_
-
-#include "core/fpdfdoc/cpvt_floatrect.h"
-#include "core/fpdfdoc/cpvt_lineinfo.h"
-#include "core/fpdfdoc/include/cpvt_wordrange.h"
-
-class CPDF_VariableText;
-
-struct CPVT_WordInfo;
-
-#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
-#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
-#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb))
-
-class CLine {
- public:
-  CLine();
-  ~CLine();
-
-  CPVT_WordPlace GetBeginWordPlace() const;
-  CPVT_WordPlace GetEndWordPlace() const;
-  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
-  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
-  CPVT_WordPlace LinePlace;
-  CPVT_LineInfo m_LineInfo;
-};
-
-class CLines {
- 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:
-  CFX_ArrayTemplate<CLine*> m_Lines;
-  int32_t m_nTotal;
-};
-
-class CPDF_EditContainer {
- public:
-  CPDF_EditContainer();
-  virtual ~CPDF_EditContainer();
-
-  virtual const CFX_FloatRect& GetPlateRect() const { return m_rcPlate; }
-  virtual void SetPlateRect(const CFX_FloatRect& rect) { m_rcPlate = rect; }
-  virtual CFX_FloatRect GetContentRect() const { return m_rcContent; }
-  virtual void SetContentRect(const CPVT_FloatRect& rect) {
-    m_rcContent = rect;
-  }
-
-  FX_FLOAT GetPlateWidth() const { return m_rcPlate.right - m_rcPlate.left; }
-  FX_FLOAT GetPlateHeight() const { return m_rcPlate.top - m_rcPlate.bottom; }
-  CFX_FloatPoint GetBTPoint() const {
-    return CFX_FloatPoint(m_rcPlate.left, m_rcPlate.top);
-  }
-  CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const {
-    return CFX_FloatPoint(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
-  }
-  CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const {
-    return CFX_FloatPoint(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
-  }
-  CFX_FloatRect InToOut(const CPVT_FloatRect& rect) const;
-
- private:
-  CFX_FloatRect m_rcPlate;
-  CPVT_FloatRect m_rcContent;
-};
-
-#endif  // CORE_FPDFDOC_DOC_VT_H_
diff --git a/core/fpdfdoc/include/cpdf_variabletext.h b/core/fpdfdoc/include/cpdf_variabletext.h
index e438223..b73d3df 100644
--- a/core/fpdfdoc/include/cpdf_variabletext.h
+++ b/core/fpdfdoc/include/cpdf_variabletext.h
@@ -9,10 +9,10 @@
 
 #include "core/fpdfdoc/cpvt_floatrect.h"
 #include "core/fpdfdoc/cpvt_lineinfo.h"
-#include "core/fpdfdoc/doc_vt.h"
 #include "core/fpdfdoc/include/cpvt_line.h"
 #include "core/fpdfdoc/include/cpvt_wordplace.h"
 #include "core/fpdfdoc/include/cpvt_wordrange.h"
+#include "core/fpdfdoc/pdf_vt.h"
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
@@ -60,7 +60,7 @@
 
   class Provider {
    public:
-    explicit Provider(IPVT_FontMap* pFontMap);
+    Provider(IPVT_FontMap* pFontMap);
     virtual ~Provider();
 
     virtual int32_t GetCharWidth(int32_t nFontIndex,
@@ -227,12 +227,12 @@
 
   CPVT_FloatRect Rearrange(const CPVT_WordRange& PlaceRange);
   FX_FLOAT GetAutoFontSize();
-  bool IsBigger(FX_FLOAT fFontSize) const;
+  FX_BOOL IsBigger(FX_FLOAT fFontSize);
   CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange);
 
   void ResetSectionArray();
 
-  CFX_ArrayTemplate<CSection*> m_SectionArray;
+  CPVT_ArrayTemplate<CSection*> m_SectionArray;
   int32_t m_nLimitChar;
   int32_t m_nCharArray;
   FX_BOOL m_bMultiLine;
diff --git a/core/fpdfdoc/pdf_vt.h b/core/fpdfdoc/pdf_vt.h
new file mode 100644
index 0000000..a3b7883
--- /dev/null
+++ b/core/fpdfdoc/pdf_vt.h
@@ -0,0 +1,149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_FPDFDOC_PDF_VT_H_
+#define CORE_FPDFDOC_PDF_VT_H_
+
+#include "core/fpdfdoc/cpvt_floatrect.h"
+#include "core/fpdfdoc/cpvt_lineinfo.h"
+#include "core/fpdfdoc/include/cpvt_wordrange.h"
+
+class CPDF_VariableText;
+
+struct CPVT_WordInfo;
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#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:
+  FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }
+  TYPE GetAt(int nIndex) const {
+    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+      return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
+    }
+    return NULL;
+  }
+  void RemoveAt(int nIndex) {
+    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+      CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
+    }
+  }
+};
+class CLine {
+ public:
+  CLine();
+  virtual ~CLine();
+  CPVT_WordPlace GetBeginWordPlace() const;
+  CPVT_WordPlace GetEndWordPlace() const;
+  CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
+  CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace& place) const;
+  CPVT_WordPlace LinePlace;
+  CPVT_LineInfo m_LineInfo;
+};
+class CLines {
+ public:
+  CLines() : m_nTotal(0) {}
+  virtual ~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() {}
+  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; }
+  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_FloatPoint GetBTPoint() const {
+    return CFX_FloatPoint(m_rcPlate.left, m_rcPlate.top);
+  }
+  CFX_FloatPoint GetETPoint() const {
+    return CFX_FloatPoint(m_rcPlate.right, m_rcPlate.bottom);
+  }
+  inline 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 {
+    return CFX_FloatPoint(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
+  }
+  inline 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 {
+    CFX_FloatPoint ptLeftTop = OutToIn(CFX_FloatPoint(rect.left, rect.top));
+    CFX_FloatPoint ptRightBottom =
+        OutToIn(CFX_FloatPoint(rect.right, rect.bottom));
+    return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x,
+                          ptRightBottom.y);
+  }
+
+ private:
+  CFX_FloatRect m_rcPlate;
+  CPVT_FloatRect m_rcContent;
+};
+
+#endif  // CORE_FPDFDOC_PDF_VT_H_
diff --git a/pdfium.gyp b/pdfium.gyp
index ba0744b..10bba9d 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -252,7 +252,6 @@
         'core/fpdfdoc/doc_utils.h',
         'core/fpdfdoc/doc_viewerPreferences.cpp',
         'core/fpdfdoc/doc_vt.cpp',
-        'core/fpdfdoc/doc_vt.h',
         'core/fpdfdoc/include/cpdf_variabletext.h',
         'core/fpdfdoc/include/cpvt_line.h',
         'core/fpdfdoc/include/cpvt_secprops.h',
@@ -262,6 +261,7 @@
         'core/fpdfdoc/include/cpvt_wordprops.h',
         'core/fpdfdoc/include/cpvt_wordrange.h',
         'core/fpdfdoc/include/ipvt_fontmap.h',
+        'core/fpdfdoc/pdf_vt.h',
         'core/fpdfdoc/tagged_int.h',
       ],
     },