diff --git a/BUILD.gn b/BUILD.gn
index 916ba25..afedfd2 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -223,6 +223,7 @@
     "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",
@@ -234,7 +235,6 @@
     "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 6788740..33451de 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() {
@@ -164,28 +162,36 @@
 
 FX_BOOL CPDF_VariableText::Iterator::GetWord(CPVT_Word& word) const {
   word.WordPlace = m_CurPos;
-  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;
+  CSection* pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex);
+  if (!pSection)
+    return FALSE;
 
-        word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
-        word.fFontSize = m_pVT->GetWordFontSize(*pWord);
-        return TRUE;
-      }
-    }
+  if (!pSection->m_LineArray.GetAt(m_CurPos.nLineIndex))
+    return FALSE;
+
+  if (m_CurPos.nWordIndex < 0 ||
+      m_CurPos.nWordIndex >= pSection->m_WordArray.GetSize()) {
+    return FALSE;
   }
-  return FALSE;
+
+  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;
 }
 
 FX_BOOL CPDF_VariableText::Iterator::SetWord(const CPVT_Word& word) {
@@ -729,7 +735,7 @@
 
 CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace& place,
                                           const CPVT_LineInfo& lineinfo) {
-  if (m_SectionArray.IsEmpty())
+  if (m_SectionArray.GetSize() == 0)
     return place;
   if (CSection* pSection = m_SectionArray.GetAt(place.nSecIndex))
     return pSection->AddLine(lineinfo);
@@ -738,9 +744,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);
@@ -1053,22 +1059,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_PointF 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_PointF 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/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index ec1b9fb..3a7fedd 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 d8974cb..f6a9f3b 100644
--- a/core/fpdfdoc/csection.h
+++ b/core/fpdfdoc/csection.h
@@ -21,7 +21,8 @@
 class CSection {
  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_PointF GetSectionSize(FX_FLOAT fFontSize);
   CPVT_WordPlace GetBeginWordPlace() const;
   CPVT_WordPlace GetEndWordPlace() const;
   CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace& place) const;
@@ -47,7 +48,7 @@
   CPVT_WordPlace SecPlace;
   CPVT_SectionInfo m_SecInfo;
   CLines m_LineArray;
-  CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
+  CFX_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
 
  private:
   friend class CTypeset;
diff --git a/core/fpdfdoc/ctypeset.h b/core/fpdfdoc/ctypeset.h
index 25bb31a..1401050 100644
--- a/core/fpdfdoc/ctypeset.h
+++ b/core/fpdfdoc/ctypeset.h
@@ -16,14 +16,17 @@
 class CTypeset {
  public:
   explicit CTypeset(CSection* pSection);
-  virtual ~CTypeset();
-  CPVT_Size GetEditSize(FX_FLOAT fFontSize);
+  ~CTypeset();
+
+  CFX_PointF 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 88a4636..985ffa5 100644
--- a/core/fpdfdoc/doc_vt.cpp
+++ b/core/fpdfdoc/doc_vt.cpp
@@ -4,16 +4,19 @@
 
 // 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);
 }
@@ -61,102 +64,104 @@
     }
   }
 }
+
 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();
 }
-CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize) {
+
+CFX_PointF 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 (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
-        return pPrevLine->GetEndWordPlace();
-      }
-    } else {
+
+    if (place.nWordIndex >= pLine->m_LineInfo.nBeginWordIndex)
       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 (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
-        return pNextLine->GetBeginWordPlace();
-      }
-    } else {
+    if (place.nWordIndex < pLine->m_LineInfo.nEndWordIndex)
       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) {
-    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;
-      }
+    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;
     } else {
-      break;
+      place.nLineIndex = nMid;
+      return;
     }
   }
 }
+
 CPVT_WordPlace CSection::SearchWordPlace(const CFX_FloatPoint& point) const {
   ASSERT(m_pVT);
   CPVT_WordPlace place = GetBeginWordPlace();
@@ -172,81 +177,78 @@
       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;
-      } else if (IsFloatBigger(point.y, fBottom)) {
+      }
+      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 {
-  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();
+  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()));
 }
+
 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;
     }
-    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 {
+
+    CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid);
+    if (!pWord)
       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) {
@@ -255,24 +257,28 @@
   }
   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();
@@ -289,15 +295,19 @@
     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 =
@@ -376,12 +386,14 @@
   }
   return m_rcRet = CPVT_FloatRect(0, 0, x, y);
 }
-CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize) {
+
+CFX_PointF 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_PointF(m_rcRet.Width(), m_rcRet.Height());
 }
+
 CPVT_FloatRect CTypeset::Typeset() {
   ASSERT(m_pVT);
   m_pSection->m_LineArray.Empty();
@@ -693,77 +705,103 @@
   }
   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:
-      fMinX = 0.0f;
-      break;
+      return 0;
     case 1:
-      fMinX = (fTypesetWidth - m_rcRet.Width()) * VARIABLETEXT_HALF;
-      break;
+      return (fTypesetWidth - fLineWidth) * VARIABLETEXT_HALF;
     case 2:
-      fMinX = fTypesetWidth - m_rcRet.Width();
-      break;
+      return fTypesetWidth - fLineWidth;
   }
-  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);
+}
+
+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);
 }
diff --git a/core/fpdfdoc/doc_vt.h b/core/fpdfdoc/doc_vt.h
new file mode 100644
index 0000000..09be92b
--- /dev/null
+++ b/core/fpdfdoc/doc_vt.h
@@ -0,0 +1,103 @@
+// 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 b73d3df..e438223 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:
-    Provider(IPVT_FontMap* pFontMap);
+    explicit 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();
-  FX_BOOL IsBigger(FX_FLOAT fFontSize);
+  bool IsBigger(FX_FLOAT fFontSize) const;
   CPVT_FloatRect RearrangeSections(const CPVT_WordRange& PlaceRange);
 
   void ResetSectionArray();
 
-  CPVT_ArrayTemplate<CSection*> m_SectionArray;
+  CFX_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
deleted file mode 100644
index a3b7883..0000000
--- a/core/fpdfdoc/pdf_vt.h
+++ /dev/null
@@ -1,149 +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_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 10bba9d..ba0744b 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -252,6 +252,7 @@
         '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',
@@ -261,7 +262,6 @@
         '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',
       ],
     },
