diff --git a/core/fpdfdoc/BUILD.gn b/core/fpdfdoc/BUILD.gn
index 7d26906..0e4fa1d95 100644
--- a/core/fpdfdoc/BUILD.gn
+++ b/core/fpdfdoc/BUILD.gn
@@ -35,6 +35,8 @@
     "cpdf_formcontrol.h",
     "cpdf_formfield.cpp",
     "cpdf_formfield.h",
+    "cpdf_generateap.cpp",
+    "cpdf_generateap.h",
     "cpdf_icon.cpp",
     "cpdf_icon.h",
     "cpdf_iconfit.cpp",
@@ -57,19 +59,17 @@
     "cpdf_structelement.h",
     "cpdf_structtree.cpp",
     "cpdf_structtree.h",
-    "cpdf_variabletext.cpp",
-    "cpdf_variabletext.h",
     "cpdf_viewerpreferences.cpp",
     "cpdf_viewerpreferences.h",
     "cpvt_floatrect.h",
     "cpvt_fontmap.cpp",
     "cpvt_fontmap.h",
-    "cpvt_generateap.cpp",
-    "cpvt_generateap.h",
     "cpvt_line.h",
     "cpvt_lineinfo.h",
     "cpvt_section.cpp",
     "cpvt_section.h",
+    "cpvt_variabletext.cpp",
+    "cpvt_variabletext.h",
     "cpvt_word.h",
     "cpvt_wordinfo.cpp",
     "cpvt_wordinfo.h",
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index d19241b..be21cf3 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -21,7 +21,7 @@
 #include "core/fpdfapi/render/cpdf_pagerendercache.h"
 #include "core/fpdfapi/render/cpdf_rendercontext.h"
 #include "core/fpdfapi/render/cpdf_renderoptions.h"
-#include "core/fpdfdoc/cpvt_generateap.h"
+#include "core/fpdfdoc/cpdf_generateap.h"
 #include "core/fxge/cfx_fillrenderoptions.h"
 #include "core/fxge/cfx_graphstatedata.h"
 #include "core/fxge/cfx_pathdata.h"
@@ -122,7 +122,7 @@
 void CPDF_Annot::GenerateAPIfNeeded() {
   if (!ShouldGenerateAP())
     return;
-  if (!CPVT_GenerateAP::GenerateAnnotAP(m_pDocument.Get(), m_pAnnotDict.Get(),
+  if (!CPDF_GenerateAP::GenerateAnnotAP(m_pDocument.Get(), m_pAnnotDict.Get(),
                                         m_nSubtype)) {
     return;
   }
@@ -394,7 +394,7 @@
     return false;
 
   // It might happen that by the time this annotation instance was created,
-  // it was flagged as "hidden" (e.g. /F 2), and hence CPVT_GenerateAP decided
+  // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided
   // to not "generate" its AP.
   // If for a reason the object is no longer hidden, but still does not have
   // its "AP" generated, generate it now.
@@ -421,7 +421,7 @@
     return false;
 
   // It might happen that by the time this annotation instance was created,
-  // it was flagged as "hidden" (e.g. /F 2), and hence CPVT_GenerateAP decided
+  // it was flagged as "hidden" (e.g. /F 2), and hence CPDF_GenerateAP decided
   // to not "generate" its AP.
   // If for a reason the object is no longer hidden, but still does not have
   // its "AP" generated, generate it now.
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp
index 6814377..e8b4c09 100644
--- a/core/fpdfdoc/cpdf_annotlist.cpp
+++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -26,8 +26,8 @@
 #include "core/fpdfapi/render/cpdf_renderoptions.h"
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
+#include "core/fpdfdoc/cpdf_generateap.h"
 #include "core/fpdfdoc/cpdf_interactiveform.h"
-#include "core/fpdfdoc/cpvt_generateap.h"
 #include "core/fxge/cfx_renderdevice.h"
 
 namespace {
@@ -135,8 +135,8 @@
 
   ByteString field_type = pFieldTypeObj->GetString();
   if (field_type == pdfium::form_fields::kTx) {
-    CPVT_GenerateAP::GenerateFormAP(pDoc, pAnnotDict,
-                                    CPVT_GenerateAP::kTextField);
+    CPDF_GenerateAP::GenerateFormAP(pDoc, pAnnotDict,
+                                    CPDF_GenerateAP::kTextField);
     return;
   }
 
@@ -145,9 +145,9 @@
   uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0;
   if (field_type == pdfium::form_fields::kCh) {
     auto type = (flags & pdfium::form_flags::kChoiceCombo)
-                    ? CPVT_GenerateAP::kComboBox
-                    : CPVT_GenerateAP::kListBox;
-    CPVT_GenerateAP::GenerateFormAP(pDoc, pAnnotDict, type);
+                    ? CPDF_GenerateAP::kComboBox
+                    : CPDF_GenerateAP::kListBox;
+    CPDF_GenerateAP::GenerateFormAP(pDoc, pAnnotDict, type);
     return;
   }
 
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index f4bc700..31b7f7d 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -25,8 +25,8 @@
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fpdfdoc/cpdf_formcontrol.h"
+#include "core/fpdfdoc/cpdf_generateap.h"
 #include "core/fpdfdoc/cpdf_interactiveform.h"
-#include "core/fpdfdoc/cpvt_generateap.h"
 #include "third_party/base/check.h"
 #include "third_party/base/stl_util.h"
 
@@ -480,8 +480,7 @@
                                : IsSelectedOption(GetOptionValue(index));
 }
 
-bool CPDF_FormField::SetItemSelection(int index,
-                                      NotificationOption notify) {
+bool CPDF_FormField::SetItemSelection(int index, NotificationOption notify) {
   DCHECK(GetType() == kComboBox || GetType() == kListBox);
   if (index < 0 || index >= CountOptions())
     return false;
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
similarity index 98%
rename from core/fpdfdoc/cpvt_generateap.cpp
rename to core/fpdfdoc/cpdf_generateap.cpp
index cd88f3d..70bbcc9 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfdoc/cpvt_generateap.h"
+#include "core/fpdfdoc/cpdf_generateap.h"
 
 #include <algorithm>
 #include <memory>
@@ -30,8 +30,8 @@
 #include "core/fpdfdoc/cpdf_color_utils.h"
 #include "core/fpdfdoc/cpdf_defaultappearance.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
-#include "core/fpdfdoc/cpdf_variabletext.h"
 #include "core/fpdfdoc/cpvt_fontmap.h"
+#include "core/fpdfdoc/cpvt_variabletext.h"
 #include "core/fpdfdoc/cpvt_word.h"
 #include "core/fxge/cfx_renderdevice.h"
 
@@ -94,7 +94,7 @@
 }
 
 ByteString GenerateEditAP(IPVT_FontMap* pFontMap,
-                          CPDF_VariableText::Iterator* pIterator,
+                          CPVT_VariableText::Iterator* pIterator,
                           const CFX_PointF& ptOffset,
                           bool bContinuous,
                           uint16_t SubWord) {
@@ -374,8 +374,8 @@
   swValue += pAnnotDict.GetUnicodeTextFor(pdfium::annotation::kContents);
   CPVT_FontMap map(pDoc, nullptr, pDefFont, sFontName);
 
-  CPDF_VariableText::Provider prd(&map);
-  CPDF_VariableText vt;
+  CPVT_VariableText::Provider prd(&map);
+  CPVT_VariableText vt;
   vt.SetProvider(&prd);
   vt.SetPlateRect(pAnnotDict.GetRectFor(pdfium::annotation::kRect));
   vt.SetFontSize(12);
@@ -915,7 +915,7 @@
 }  // namespace
 
 // static
-void CPVT_GenerateAP::GenerateFormAP(CPDF_Document* pDoc,
+void CPDF_GenerateAP::GenerateFormAP(CPDF_Document* pDoc,
                                      CPDF_Dictionary* pAnnotDict,
                                      FormType type) {
   CPDF_Dictionary* pRootDict = pDoc->GetRoot();
@@ -1092,7 +1092,7 @@
     pStreamDict->SetRectFor("BBox", rcBBox);
   }
   switch (type) {
-    case CPVT_GenerateAP::kTextField: {
+    case CPDF_GenerateAP::kTextField: {
       const CPDF_Object* pV =
           CPDF_FormField::GetFieldAttr(pAnnotDict, pdfium::form_fields::kV);
       WideString swValue = pV ? pV->GetUnicodeText() : WideString();
@@ -1107,8 +1107,8 @@
       CPVT_FontMap map(
           pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
           pDefFont, font_name);
-      CPDF_VariableText::Provider prd(&map);
-      CPDF_VariableText vt;
+      CPVT_VariableText::Provider prd(&map);
+      CPVT_VariableText vt;
       vt.SetProvider(&prd);
       vt.SetPlateRect(rcBody);
       vt.SetAlignment(nAlign);
@@ -1160,15 +1160,15 @@
       }
       break;
     }
-    case CPVT_GenerateAP::kComboBox: {
+    case CPDF_GenerateAP::kComboBox: {
       const CPDF_Object* pV =
           CPDF_FormField::GetFieldAttr(pAnnotDict, pdfium::form_fields::kV);
       WideString swValue = pV ? pV->GetUnicodeText() : WideString();
       CPVT_FontMap map(
           pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
           pDefFont, font_name);
-      CPDF_VariableText::Provider prd(&map);
-      CPDF_VariableText vt;
+      CPVT_VariableText::Provider prd(&map);
+      CPVT_VariableText vt;
       vt.SetProvider(&prd);
       CFX_FloatRect rcButton = rcBody;
       rcButton.left = rcButton.right - 13;
@@ -1231,11 +1231,11 @@
       }
       break;
     }
-    case CPVT_GenerateAP::kListBox: {
+    case CPDF_GenerateAP::kListBox: {
       CPVT_FontMap map(
           pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
           pDefFont, font_name);
-      CPDF_VariableText::Provider prd(&map);
+      CPVT_VariableText::Provider prd(&map);
       CPDF_Array* pOpts =
           ToArray(CPDF_FormField::GetFieldAttr(pAnnotDict, "Opt"));
       CPDF_Array* pSels =
@@ -1268,7 +1268,7 @@
                 }
               }
             }
-            CPDF_VariableText vt;
+            CPVT_VariableText vt;
             vt.SetProvider(&prd);
             vt.SetPlateRect(
                 CFX_FloatRect(rcBody.left, 0.0f, rcBody.right, 0.0f));
@@ -1347,7 +1347,7 @@
 }
 
 // static
-void CPVT_GenerateAP::GenerateEmptyAP(CPDF_Document* pDoc,
+void CPDF_GenerateAP::GenerateEmptyAP(CPDF_Document* pDoc,
                                       CPDF_Dictionary* pAnnotDict) {
   auto pExtGStateDict = GenerateExtGStateDict(*pAnnotDict, "GS", "Normal");
   auto pResourceDict =
@@ -1359,7 +1359,7 @@
 }
 
 // static
-bool CPVT_GenerateAP::GenerateAnnotAP(CPDF_Document* pDoc,
+bool CPDF_GenerateAP::GenerateAnnotAP(CPDF_Document* pDoc,
                                       CPDF_Dictionary* pAnnotDict,
                                       CPDF_Annot::Subtype subtype) {
   switch (subtype) {
diff --git a/core/fpdfdoc/cpvt_generateap.h b/core/fpdfdoc/cpdf_generateap.h
similarity index 74%
rename from core/fpdfdoc/cpvt_generateap.h
rename to core/fpdfdoc/cpdf_generateap.h
index 78eebba..4934741 100644
--- a/core/fpdfdoc/cpvt_generateap.h
+++ b/core/fpdfdoc/cpdf_generateap.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FPDFDOC_CPVT_GENERATEAP_H_
-#define CORE_FPDFDOC_CPVT_GENERATEAP_H_
+#ifndef CORE_FPDFDOC_CPDF_GENERATEAP_H_
+#define CORE_FPDFDOC_CPDF_GENERATEAP_H_
 
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "core/fxcrt/fx_system.h"
@@ -13,7 +13,7 @@
 class CPDF_Dictionary;
 class CPDF_Document;
 
-class CPVT_GenerateAP {
+class CPDF_GenerateAP {
  public:
   enum FormType { kTextField, kComboBox, kListBox };
 
@@ -27,9 +27,9 @@
                               CPDF_Dictionary* pAnnotDict,
                               CPDF_Annot::Subtype subtype);
 
-  CPVT_GenerateAP() = delete;
-  CPVT_GenerateAP(const CPVT_GenerateAP&) = delete;
-  CPVT_GenerateAP& operator=(const CPVT_GenerateAP&) = delete;
+  CPDF_GenerateAP() = delete;
+  CPDF_GenerateAP(const CPDF_GenerateAP&) = delete;
+  CPDF_GenerateAP& operator=(const CPDF_GenerateAP&) = delete;
 };
 
-#endif  // CORE_FPDFDOC_CPVT_GENERATEAP_H_
+#endif  // CORE_FPDFDOC_CPDF_GENERATEAP_H_
diff --git a/core/fpdfdoc/cpvt_section.cpp b/core/fpdfdoc/cpvt_section.cpp
index c1983c1..3c8db5f 100644
--- a/core/fpdfdoc/cpvt_section.cpp
+++ b/core/fpdfdoc/cpvt_section.cpp
@@ -8,7 +8,7 @@
 
 #include <algorithm>
 
-#include "core/fpdfdoc/cpdf_variabletext.h"
+#include "core/fpdfdoc/cpvt_variabletext.h"
 #include "core/fpdfdoc/cpvt_wordinfo.h"
 #include "third_party/base/check.h"
 #include "third_party/base/stl_util.h"
@@ -206,7 +206,7 @@
                         place.nWordIndex + 1);
 }
 
-CPVT_Section::CPVT_Section(CPDF_VariableText* pVT) : m_pVT(pVT) {
+CPVT_Section::CPVT_Section(CPVT_VariableText* pVT) : m_pVT(pVT) {
   DCHECK(m_pVT);
 }
 
diff --git a/core/fpdfdoc/cpvt_section.h b/core/fpdfdoc/cpvt_section.h
index 84fc2b1..a212d63 100644
--- a/core/fpdfdoc/cpvt_section.h
+++ b/core/fpdfdoc/cpvt_section.h
@@ -18,7 +18,7 @@
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/unowned_ptr.h"
 
-class CPDF_VariableText;
+class CPVT_VariableText;
 struct CPVT_LineInfo;
 struct CPVT_WordLine;
 struct CPVT_WordPlace;
@@ -38,7 +38,7 @@
     CPVT_LineInfo m_LineInfo;
   };
 
-  explicit CPVT_Section(CPDF_VariableText* pVT);
+  explicit CPVT_Section(CPVT_VariableText* pVT);
   ~CPVT_Section();
 
   void ResetLinePlace();
@@ -85,7 +85,7 @@
   CPVT_FloatRect m_Rect;
   std::vector<std::unique_ptr<Line>> m_LineArray;
   std::vector<std::unique_ptr<CPVT_WordInfo>> m_WordArray;
-  UnownedPtr<CPDF_VariableText> const m_pVT;
+  UnownedPtr<CPVT_VariableText> const m_pVT;
 };
 
 #endif  // CORE_FPDFDOC_CPVT_SECTION_H_
diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpvt_variabletext.cpp
similarity index 83%
rename from core/fpdfdoc/cpdf_variabletext.cpp
rename to core/fpdfdoc/cpvt_variabletext.cpp
index 5b955e6..f658a17 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpvt_variabletext.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfdoc/cpdf_variabletext.h"
+#include "core/fpdfdoc/cpvt_variabletext.h"
 
 #include <algorithm>
 #include <utility>
@@ -30,14 +30,14 @@
 
 }  // namespace
 
-CPDF_VariableText::Provider::Provider(IPVT_FontMap* pFontMap)
+CPVT_VariableText::Provider::Provider(IPVT_FontMap* pFontMap)
     : m_pFontMap(pFontMap) {
   DCHECK(m_pFontMap);
 }
 
-CPDF_VariableText::Provider::~Provider() = default;
+CPVT_VariableText::Provider::~Provider() = default;
 
-int CPDF_VariableText::Provider::GetCharWidth(int32_t nFontIndex,
+int CPVT_VariableText::Provider::GetCharWidth(int32_t nFontIndex,
                                               uint16_t word) {
   RetainPtr<CPDF_Font> pPDFFont = m_pFontMap->GetPDFFont(nFontIndex);
   if (!pPDFFont)
@@ -50,17 +50,17 @@
   return pPDFFont->GetCharWidthF(charcode);
 }
 
-int32_t CPDF_VariableText::Provider::GetTypeAscent(int32_t nFontIndex) {
+int32_t CPVT_VariableText::Provider::GetTypeAscent(int32_t nFontIndex) {
   RetainPtr<CPDF_Font> pPDFFont = m_pFontMap->GetPDFFont(nFontIndex);
   return pPDFFont ? pPDFFont->GetTypeAscent() : 0;
 }
 
-int32_t CPDF_VariableText::Provider::GetTypeDescent(int32_t nFontIndex) {
+int32_t CPVT_VariableText::Provider::GetTypeDescent(int32_t nFontIndex) {
   RetainPtr<CPDF_Font> pPDFFont = m_pFontMap->GetPDFFont(nFontIndex);
   return pPDFFont ? pPDFFont->GetTypeDescent() : 0;
 }
 
-int32_t CPDF_VariableText::Provider::GetWordFontIndex(uint16_t word,
+int32_t CPVT_VariableText::Provider::GetWordFontIndex(uint16_t word,
                                                       int32_t charset,
                                                       int32_t nFontIndex) {
   if (RetainPtr<CPDF_Font> pDefFont = m_pFontMap->GetPDFFont(0)) {
@@ -74,25 +74,25 @@
   return -1;
 }
 
-int32_t CPDF_VariableText::Provider::GetDefaultFontIndex() {
+int32_t CPVT_VariableText::Provider::GetDefaultFontIndex() {
   return 0;
 }
 
-CPDF_VariableText::Iterator::Iterator(CPDF_VariableText* pVT) : m_pVT(pVT) {
+CPVT_VariableText::Iterator::Iterator(CPVT_VariableText* pVT) : m_pVT(pVT) {
   DCHECK(m_pVT);
 }
 
-CPDF_VariableText::Iterator::~Iterator() = default;
+CPVT_VariableText::Iterator::~Iterator() = default;
 
-void CPDF_VariableText::Iterator::SetAt(int32_t nWordIndex) {
+void CPVT_VariableText::Iterator::SetAt(int32_t nWordIndex) {
   m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);
 }
 
-void CPDF_VariableText::Iterator::SetAt(const CPVT_WordPlace& place) {
+void CPVT_VariableText::Iterator::SetAt(const CPVT_WordPlace& place) {
   m_CurPos = place;
 }
 
-bool CPDF_VariableText::Iterator::NextWord() {
+bool CPVT_VariableText::Iterator::NextWord() {
   if (m_CurPos == m_pVT->GetEndWordPlace())
     return false;
 
@@ -100,8 +100,7 @@
   return true;
 }
 
-
-bool CPDF_VariableText::Iterator::NextLine() {
+bool CPVT_VariableText::Iterator::NextLine() {
   if (!pdfium::IndexInBounds(m_pVT->m_SectionArray, m_CurPos.nSecIndex))
     return false;
 
@@ -119,7 +118,7 @@
   return false;
 }
 
-bool CPDF_VariableText::Iterator::GetWord(CPVT_Word& word) const {
+bool CPVT_VariableText::Iterator::GetWord(CPVT_Word& word) const {
   word.WordPlace = m_CurPos;
   if (!pdfium::IndexInBounds(m_pVT->m_SectionArray, m_CurPos.nSecIndex))
     return false;
@@ -145,7 +144,7 @@
   return true;
 }
 
-bool CPDF_VariableText::Iterator::GetLine(CPVT_Line& line) const {
+bool CPVT_VariableText::Iterator::GetLine(CPVT_Line& line) const {
   DCHECK(m_pVT);
   line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);
   if (!pdfium::IndexInBounds(m_pVT->m_SectionArray, m_CurPos.nSecIndex))
@@ -167,11 +166,11 @@
   return true;
 }
 
-CPDF_VariableText::CPDF_VariableText() = default;
+CPVT_VariableText::CPVT_VariableText() = default;
 
-CPDF_VariableText::~CPDF_VariableText() = default;
+CPVT_VariableText::~CPVT_VariableText() = default;
 
-void CPDF_VariableText::Initialize() {
+void CPVT_VariableText::Initialize() {
   if (m_bInitialized)
     return;
 
@@ -190,7 +189,7 @@
   m_bInitialized = true;
 }
 
-CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace& place,
+CPVT_WordPlace CPVT_VariableText::InsertWord(const CPVT_WordPlace& place,
                                              uint16_t word,
                                              int32_t charset) {
   int32_t nTotalWords = GetTotalWords();
@@ -207,7 +206,7 @@
   return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex));
 }
 
-CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::InsertSection(const CPVT_WordPlace& place) {
   int32_t nTotalWords = GetTotalWords();
   if (m_nLimitChar > 0 && nTotalWords >= m_nLimitChar)
     return place;
@@ -237,7 +236,7 @@
   return result;
 }
 
-CPVT_WordPlace CPDF_VariableText::DeleteWords(
+CPVT_WordPlace CPVT_VariableText::DeleteWords(
     const CPVT_WordRange& PlaceRange) {
   bool bLastSecPos =
       pdfium::IndexInBounds(m_SectionArray, PlaceRange.EndPos.nSecIndex) &&
@@ -253,15 +252,15 @@
   return PlaceRange.BeginPos;
 }
 
-CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::DeleteWord(const CPVT_WordPlace& place) {
   return ClearRightWord(AdjustLineHeader(place, true));
 }
 
-CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::BackSpaceWord(const CPVT_WordPlace& place) {
   return ClearLeftWord(AdjustLineHeader(place, true));
 }
 
-void CPDF_VariableText::SetText(const WideString& swText) {
+void CPVT_VariableText::SetText(const WideString& swText) {
   DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
   CPVT_WordPlace wp(0, 0, -1);
   if (!m_SectionArray.empty())
@@ -303,7 +302,7 @@
   }
 }
 
-void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace& place) const {
+void CPVT_VariableText::UpdateWordPlace(CPVT_WordPlace& place) const {
   if (place.nSecIndex < 0)
     place = GetBeginWordPlace();
   if (place.nSecIndex >= pdfium::CollectionSize<int32_t>(m_SectionArray))
@@ -314,7 +313,7 @@
     m_SectionArray[place.nSecIndex]->UpdateWordPlace(place);
 }
 
-int32_t CPDF_VariableText::WordPlaceToWordIndex(
+int32_t CPVT_VariableText::WordPlaceToWordIndex(
     const CPVT_WordPlace& place) const {
   CPVT_WordPlace newplace = place;
   UpdateWordPlace(newplace);
@@ -333,7 +332,7 @@
   return nIndex;
 }
 
-CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(int32_t index) const {
+CPVT_WordPlace CPVT_VariableText::WordIndexToWordPlace(int32_t index) const {
   CPVT_WordPlace place = GetBeginWordPlace();
   int32_t nOldIndex = 0;
   int32_t nIndex = 0;
@@ -363,17 +362,17 @@
   return place;
 }
 
-CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const {
+CPVT_WordPlace CPVT_VariableText::GetBeginWordPlace() const {
   return m_bInitialized ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();
 }
 
-CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const {
+CPVT_WordPlace CPVT_VariableText::GetEndWordPlace() const {
   if (m_SectionArray.empty())
     return CPVT_WordPlace();
   return m_SectionArray.back()->GetEndWordPlace();
 }
 
-CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(
+CPVT_WordPlace CPVT_VariableText::GetPrevWordPlace(
     const CPVT_WordPlace& place) const {
   if (place.nSecIndex < 0)
     return GetBeginWordPlace();
@@ -388,7 +387,7 @@
   return m_SectionArray[place.nSecIndex - 1]->GetEndWordPlace();
 }
 
-CPVT_WordPlace CPDF_VariableText::GetNextWordPlace(
+CPVT_WordPlace CPVT_VariableText::GetNextWordPlace(
     const CPVT_WordPlace& place) const {
   if (place.nSecIndex < 0)
     return GetBeginWordPlace();
@@ -403,7 +402,7 @@
   return m_SectionArray[place.nSecIndex + 1]->GetBeginWordPlace();
 }
 
-CPVT_WordPlace CPDF_VariableText::SearchWordPlace(
+CPVT_WordPlace CPVT_VariableText::SearchWordPlace(
     const CFX_PointF& point) const {
   CFX_PointF pt = OutToIn(point);
   CPVT_WordPlace place = GetBeginWordPlace();
@@ -442,7 +441,7 @@
   return place;
 }
 
-CPVT_WordPlace CPDF_VariableText::GetUpWordPlace(
+CPVT_WordPlace CPVT_VariableText::GetUpWordPlace(
     const CPVT_WordPlace& place,
     const CFX_PointF& point) const {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
@@ -466,7 +465,7 @@
   return place;
 }
 
-CPVT_WordPlace CPDF_VariableText::GetDownWordPlace(
+CPVT_WordPlace CPVT_VariableText::GetDownWordPlace(
     const CPVT_WordPlace& place,
     const CFX_PointF& point) const {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
@@ -487,12 +486,12 @@
       pt.x - pSection->GetRect().left, temp);
 }
 
-CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(
+CPVT_WordPlace CPVT_VariableText::GetLineBeginPlace(
     const CPVT_WordPlace& place) const {
   return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
 }
 
-CPVT_WordPlace CPDF_VariableText::GetLineEndPlace(
+CPVT_WordPlace CPVT_VariableText::GetLineEndPlace(
     const CPVT_WordPlace& place) const {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return place;
@@ -504,12 +503,12 @@
   return pSection->GetLineArray()[place.nLineIndex]->GetEndWordPlace();
 }
 
-CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(
+CPVT_WordPlace CPVT_VariableText::GetSectionBeginPlace(
     const CPVT_WordPlace& place) const {
   return CPVT_WordPlace(place.nSecIndex, 0, -1);
 }
 
-CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(
+CPVT_WordPlace CPVT_VariableText::GetSectionEndPlace(
     const CPVT_WordPlace& place) const {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return place;
@@ -517,7 +516,7 @@
   return m_SectionArray[place.nSecIndex]->GetEndWordPlace();
 }
 
-int32_t CPDF_VariableText::GetTotalWords() const {
+int32_t CPVT_VariableText::GetTotalWords() const {
   int32_t nTotal = 0;
   for (const auto& pSection : m_SectionArray) {
     nTotal += pdfium::CollectionSize<int32_t>(pSection->GetWordArray()) +
@@ -526,7 +525,7 @@
   return nTotal - kReturnLength;
 }
 
-CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::AddSection(const CPVT_WordPlace& place) {
   if (IsValid() && !m_bMultiLine)
     return place;
 
@@ -541,7 +540,7 @@
   return place;
 }
 
-CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace& place,
+CPVT_WordPlace CPVT_VariableText::AddLine(const CPVT_WordPlace& place,
                                           const CPVT_LineInfo& lineinfo) {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return place;
@@ -549,7 +548,7 @@
   return m_SectionArray[place.nSecIndex]->AddLine(lineinfo);
 }
 
-CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace& place,
+CPVT_WordPlace CPVT_VariableText::AddWord(const CPVT_WordPlace& place,
                                           const CPVT_WordInfo& wordinfo) {
   if (m_SectionArray.empty())
     return place;
@@ -561,23 +560,23 @@
   return m_SectionArray[newplace.nSecIndex]->AddWord(newplace, wordinfo);
 }
 
-void CPDF_VariableText::SetPlateRect(const CFX_FloatRect& rect) {
+void CPVT_VariableText::SetPlateRect(const CFX_FloatRect& rect) {
   m_rcPlate = rect;
 }
 
-CFX_FloatRect CPDF_VariableText::GetContentRect() const {
+CFX_FloatRect CPVT_VariableText::GetContentRect() const {
   return InToOut(m_rcContent);
 }
 
-const CFX_FloatRect& CPDF_VariableText::GetPlateRect() const {
+const CFX_FloatRect& CPVT_VariableText::GetPlateRect() const {
   return m_rcPlate;
 }
 
-float CPDF_VariableText::GetWordFontSize() {
+float CPVT_VariableText::GetWordFontSize() {
   return GetFontSize();
 }
 
-float CPDF_VariableText::GetWordWidth(int32_t nFontIndex,
+float CPVT_VariableText::GetWordWidth(int32_t nFontIndex,
                                       uint16_t Word,
                                       uint16_t SubWord,
                                       float fCharSpace,
@@ -587,60 +586,60 @@
          fCharSpace + fWordTail;
 }
 
-float CPDF_VariableText::GetWordWidth(const CPVT_WordInfo& WordInfo) {
+float CPVT_VariableText::GetWordWidth(const CPVT_WordInfo& WordInfo) {
   return GetWordWidth(WordInfo.nFontIndex, WordInfo.Word, GetSubWord(),
                       GetCharSpace(), GetWordFontSize(), WordInfo.fWordTail);
 }
 
-float CPDF_VariableText::GetLineAscent() {
+float CPVT_VariableText::GetLineAscent() {
   return GetFontAscent(GetDefaultFontIndex(), GetFontSize());
 }
 
-float CPDF_VariableText::GetLineDescent() {
+float CPVT_VariableText::GetLineDescent() {
   return GetFontDescent(GetDefaultFontIndex(), GetFontSize());
 }
 
-float CPDF_VariableText::GetFontAscent(int32_t nFontIndex, float fFontSize) {
+float CPVT_VariableText::GetFontAscent(int32_t nFontIndex, float fFontSize) {
   float ascent = m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;
   return ascent * fFontSize * kFontScale;
 }
 
-float CPDF_VariableText::GetFontDescent(int32_t nFontIndex, float fFontSize) {
+float CPVT_VariableText::GetFontDescent(int32_t nFontIndex, float fFontSize) {
   float descent = m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;
   return descent * fFontSize * kFontScale;
 }
 
-float CPDF_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo,
+float CPVT_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo,
                                        float fFontSize) {
   return GetFontAscent(WordInfo.nFontIndex, fFontSize);
 }
 
-float CPDF_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo,
+float CPVT_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo,
                                         float fFontSize) {
   return GetFontDescent(WordInfo.nFontIndex, fFontSize);
 }
 
-float CPDF_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo) {
+float CPVT_VariableText::GetWordAscent(const CPVT_WordInfo& WordInfo) {
   return GetFontAscent(WordInfo.nFontIndex, GetWordFontSize());
 }
 
-float CPDF_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo) {
+float CPVT_VariableText::GetWordDescent(const CPVT_WordInfo& WordInfo) {
   return GetFontDescent(WordInfo.nFontIndex, GetWordFontSize());
 }
 
-float CPDF_VariableText::GetLineLeading() {
+float CPVT_VariableText::GetLineLeading() {
   return m_fLineLeading;
 }
 
-float CPDF_VariableText::GetLineIndent() {
+float CPVT_VariableText::GetLineIndent() {
   return 0.0f;
 }
 
-int32_t CPDF_VariableText::GetAlignment() {
+int32_t CPVT_VariableText::GetAlignment() {
   return m_nAlignment;
 }
 
-void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace& place) {
+void CPVT_VariableText::ClearSectionRightWords(const CPVT_WordPlace& place) {
   CPVT_WordPlace wordplace = AdjustLineHeader(place, true);
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return;
@@ -649,14 +648,14 @@
   pSection->EraseWordsFrom(wordplace.nWordIndex + 1);
 }
 
-CPVT_WordPlace CPDF_VariableText::AdjustLineHeader(const CPVT_WordPlace& place,
+CPVT_WordPlace CPVT_VariableText::AdjustLineHeader(const CPVT_WordPlace& place,
                                                    bool bPrevOrNext) const {
   if (place.nWordIndex < 0 && place.nLineIndex > 0)
     return bPrevOrNext ? GetPrevWordPlace(place) : GetNextWordPlace(place);
   return place;
 }
 
-bool CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace& place) {
+bool CPVT_VariableText::ClearEmptySection(const CPVT_WordPlace& place) {
   if (place.nSecIndex == 0 && m_SectionArray.size() == 1)
     return false;
 
@@ -670,7 +669,7 @@
   return true;
 }
 
-void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange& PlaceRange) {
+void CPVT_VariableText::ClearEmptySections(const CPVT_WordRange& PlaceRange) {
   CPVT_WordPlace wordplace;
   for (int32_t s = PlaceRange.EndPos.nSecIndex;
        s > PlaceRange.BeginPos.nSecIndex; s--) {
@@ -679,7 +678,7 @@
   }
 }
 
-void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace& place) {
+void CPVT_VariableText::LinkLatterSection(const CPVT_WordPlace& place) {
   CPVT_WordPlace oldplace = AdjustLineHeader(place, true);
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex + 1))
     return;
@@ -695,7 +694,7 @@
   m_SectionArray.erase(m_SectionArray.begin() + place.nSecIndex + 1);
 }
 
-void CPDF_VariableText::ClearWords(const CPVT_WordRange& PlaceRange) {
+void CPVT_VariableText::ClearWords(const CPVT_WordRange& PlaceRange) {
   CPVT_WordRange NewRange;
   NewRange.BeginPos = AdjustLineHeader(PlaceRange.BeginPos, true);
   NewRange.EndPos = AdjustLineHeader(PlaceRange.EndPos, true);
@@ -706,7 +705,7 @@
   }
 }
 
-CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::ClearLeftWord(const CPVT_WordPlace& place) {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return place;
 
@@ -726,7 +725,7 @@
   return leftplace;
 }
 
-CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace& place) {
+CPVT_WordPlace CPVT_VariableText::ClearRightWord(const CPVT_WordPlace& place) {
   if (!pdfium::IndexInBounds(m_SectionArray, place.nSecIndex))
     return place;
 
@@ -742,15 +741,15 @@
   return place;
 }
 
-void CPDF_VariableText::RearrangeAll() {
+void CPVT_VariableText::RearrangeAll() {
   Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
 }
 
-void CPDF_VariableText::RearrangePart(const CPVT_WordRange& PlaceRange) {
+void CPVT_VariableText::RearrangePart(const CPVT_WordRange& PlaceRange) {
   Rearrange(PlaceRange);
 }
 
-void CPDF_VariableText::Rearrange(const CPVT_WordRange& PlaceRange) {
+void CPVT_VariableText::Rearrange(const CPVT_WordRange& PlaceRange) {
   CPVT_FloatRect rcRet;
   if (IsValid()) {
     if (m_bAutoFontSize) {
@@ -764,7 +763,7 @@
   m_rcContent = rcRet;
 }
 
-float CPDF_VariableText::GetAutoFontSize() {
+float CPVT_VariableText::GetAutoFontSize() {
   int32_t nTotal = sizeof(kFontSizeSteps) / sizeof(uint8_t);
   if (IsMultiLine())
     nTotal /= 4;
@@ -786,7 +785,7 @@
   return (float)kFontSizeSteps[nMid];
 }
 
-bool CPDF_VariableText::IsBigger(float fFontSize) const {
+bool CPVT_VariableText::IsBigger(float fFontSize) const {
   CFX_SizeF szTotal;
   for (const auto& pSection : m_SectionArray) {
     CFX_SizeF size = pSection->GetSectionSize(fFontSize);
@@ -800,7 +799,7 @@
   return false;
 }
 
-CPVT_FloatRect CPDF_VariableText::RearrangeSections(
+CPVT_FloatRect CPVT_VariableText::RearrangeSections(
     const CPVT_WordRange& PlaceRange) {
   float fPosY = 0;
   CPVT_FloatRect rcRet;
@@ -837,7 +836,7 @@
   return rcRet;
 }
 
-int CPDF_VariableText::GetCharWidth(int32_t nFontIndex,
+int CPVT_VariableText::GetCharWidth(int32_t nFontIndex,
                                     uint16_t Word,
                                     uint16_t SubWord) {
   if (!m_pVTProvider)
@@ -846,7 +845,7 @@
   return m_pVTProvider->GetCharWidth(nFontIndex, word);
 }
 
-int32_t CPDF_VariableText::GetWordFontIndex(uint16_t word,
+int32_t CPVT_VariableText::GetWordFontIndex(uint16_t word,
                                             int32_t charset,
                                             int32_t nFontIndex) {
   return m_pVTProvider
@@ -854,44 +853,44 @@
              : -1;
 }
 
-int32_t CPDF_VariableText::GetDefaultFontIndex() {
+int32_t CPVT_VariableText::GetDefaultFontIndex() {
   return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;
 }
 
-CPDF_VariableText::Iterator* CPDF_VariableText::GetIterator() {
+CPVT_VariableText::Iterator* CPVT_VariableText::GetIterator() {
   if (!m_pVTIterator)
-    m_pVTIterator = std::make_unique<CPDF_VariableText::Iterator>(this);
+    m_pVTIterator = std::make_unique<CPVT_VariableText::Iterator>(this);
   return m_pVTIterator.get();
 }
 
-void CPDF_VariableText::SetProvider(CPDF_VariableText::Provider* pProvider) {
+void CPVT_VariableText::SetProvider(CPVT_VariableText::Provider* pProvider) {
   m_pVTProvider = pProvider;
 }
 
-CFX_PointF CPDF_VariableText::GetBTPoint() const {
+CFX_PointF CPVT_VariableText::GetBTPoint() const {
   return CFX_PointF(m_rcPlate.left, m_rcPlate.top);
 }
 
-CFX_PointF CPDF_VariableText::GetETPoint() const {
+CFX_PointF CPVT_VariableText::GetETPoint() const {
   return CFX_PointF(m_rcPlate.right, m_rcPlate.bottom);
 }
 
-CFX_PointF CPDF_VariableText::InToOut(const CFX_PointF& point) const {
+CFX_PointF CPVT_VariableText::InToOut(const CFX_PointF& point) const {
   return CFX_PointF(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
 }
 
-CFX_PointF CPDF_VariableText::OutToIn(const CFX_PointF& point) const {
+CFX_PointF CPVT_VariableText::OutToIn(const CFX_PointF& point) const {
   return CFX_PointF(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
 }
 
-CFX_FloatRect CPDF_VariableText::InToOut(const CPVT_FloatRect& rect) const {
+CFX_FloatRect CPVT_VariableText::InToOut(const CPVT_FloatRect& rect) const {
   CFX_PointF ptLeftTop = InToOut(CFX_PointF(rect.left, rect.top));
   CFX_PointF ptRightBottom = InToOut(CFX_PointF(rect.right, rect.bottom));
   return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x,
                        ptLeftTop.y);
 }
 
-CPVT_FloatRect CPDF_VariableText::OutToIn(const CFX_FloatRect& rect) const {
+CPVT_FloatRect CPVT_VariableText::OutToIn(const CFX_FloatRect& rect) const {
   CFX_PointF ptLeftTop = OutToIn(CFX_PointF(rect.left, rect.top));
   CFX_PointF ptRightBottom = OutToIn(CFX_PointF(rect.right, rect.bottom));
   return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x,
diff --git a/core/fpdfdoc/cpdf_variabletext.h b/core/fpdfdoc/cpvt_variabletext.h
similarity index 93%
rename from core/fpdfdoc/cpdf_variabletext.h
rename to core/fpdfdoc/cpvt_variabletext.h
index a1affc6..db9675b 100644
--- a/core/fpdfdoc/cpdf_variabletext.h
+++ b/core/fpdfdoc/cpvt_variabletext.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FPDFDOC_CPDF_VARIABLETEXT_H_
-#define CORE_FPDFDOC_CPDF_VARIABLETEXT_H_
+#ifndef CORE_FPDFDOC_CPVT_VARIABLETEXT_H_
+#define CORE_FPDFDOC_CPVT_VARIABLETEXT_H_
 
 #include <memory>
 #include <vector>
@@ -27,11 +27,11 @@
 
 #define VARIABLETEXT_HALF 0.5f
 
-class CPDF_VariableText {
+class CPVT_VariableText {
  public:
   class Iterator {
    public:
-    explicit Iterator(CPDF_VariableText* pVT);
+    explicit Iterator(CPVT_VariableText* pVT);
     ~Iterator();
 
     bool NextWord();
@@ -44,7 +44,7 @@
 
    private:
     CPVT_WordPlace m_CurPos;
-    UnownedPtr<CPDF_VariableText> const m_pVT;
+    UnownedPtr<CPVT_VariableText> const m_pVT;
   };
 
   class Provider {
@@ -66,11 +66,11 @@
     UnownedPtr<IPVT_FontMap> const m_pFontMap;
   };
 
-  CPDF_VariableText();
-  ~CPDF_VariableText();
+  CPVT_VariableText();
+  ~CPVT_VariableText();
 
-  void SetProvider(CPDF_VariableText::Provider* pProvider);
-  CPDF_VariableText::Iterator* GetIterator();
+  void SetProvider(CPVT_VariableText::Provider* pProvider);
+  CPVT_VariableText::Iterator* GetIterator();
 
   CFX_FloatRect GetContentRect() const;
   void SetPlateRect(const CFX_FloatRect& rect);
@@ -198,10 +198,10 @@
   float m_fCharSpace = 0.0f;
   float m_fFontSize = 0.0f;
   std::vector<std::unique_ptr<CPVT_Section>> m_SectionArray;
-  UnownedPtr<CPDF_VariableText::Provider> m_pVTProvider;
-  std::unique_ptr<CPDF_VariableText::Iterator> m_pVTIterator;
+  UnownedPtr<CPVT_VariableText::Provider> m_pVTProvider;
+  std::unique_ptr<CPVT_VariableText::Iterator> m_pVTIterator;
   CFX_FloatRect m_rcPlate;
   CPVT_FloatRect m_rcContent;
 };
 
-#endif  // CORE_FPDFDOC_CPDF_VARIABLETEXT_H_
+#endif  // CORE_FPDFDOC_CPVT_VARIABLETEXT_H_
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index d68983c..d6b66f7 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -26,8 +26,8 @@
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "core/fpdfdoc/cpdf_color_utils.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
+#include "core/fpdfdoc/cpdf_generateap.h"
 #include "core/fpdfdoc/cpdf_interactiveform.h"
-#include "core/fpdfdoc/cpvt_generateap.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "core/fxge/cfx_color.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
@@ -536,7 +536,7 @@
   CPDF_Stream* pStream =
       GetAnnotAP(pAnnotDict, CPDF_Annot::AppearanceMode::Normal);
   if (!pStream) {
-    CPVT_GenerateAP::GenerateEmptyAP(pAnnot->GetPage()->GetDocument(),
+    CPDF_GenerateAP::GenerateEmptyAP(pAnnot->GetPage()->GetDocument(),
                                      pAnnotDict);
     pStream = GetAnnotAP(pAnnotDict, CPDF_Annot::AppearanceMode::Normal);
     if (!pStream)
@@ -685,7 +685,7 @@
   if (!pColor) {
     // Use default color. The default colors must be consistent with the ones
     // used to generate AP. See calls to GetColorStringWithDefault() in
-    // CPVT_GenerateAP::Generate*AP().
+    // CPDF_GenerateAP::Generate*AP().
     if (pAnnotDict->GetNameFor(pdfium::annotation::kSubtype) == "Highlight") {
       *R = 255;
       *G = 255;
diff --git a/fpdfsdk/pwl/cpwl_edit_impl.cpp b/fpdfsdk/pwl/cpwl_edit_impl.cpp
index 69620a2..f2fd92a 100644
--- a/fpdfsdk/pwl/cpwl_edit_impl.cpp
+++ b/fpdfsdk/pwl/cpwl_edit_impl.cpp
@@ -55,7 +55,7 @@
 
 CPWL_EditImpl_Iterator::CPWL_EditImpl_Iterator(
     CPWL_EditImpl* pEdit,
-    CPDF_VariableText::Iterator* pVTIterator)
+    CPVT_VariableText::Iterator* pVTIterator)
     : m_pEdit(pEdit), m_pVTIterator(pVTIterator) {}
 
 CPWL_EditImpl_Iterator::~CPWL_EditImpl_Iterator() = default;
@@ -97,7 +97,7 @@
 }
 
 CPWL_EditImpl_Provider::CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap)
-    : CPDF_VariableText::Provider(pFontMap) {}
+    : CPVT_VariableText::Provider(pFontMap) {}
 
 CPWL_EditImpl_Provider::~CPWL_EditImpl_Provider() = default;
 
@@ -534,7 +534,7 @@
   }
 }
 
-CPWL_EditImpl::CPWL_EditImpl() : m_pVT(std::make_unique<CPDF_VariableText>()) {}
+CPWL_EditImpl::CPWL_EditImpl() : m_pVT(std::make_unique<CPVT_VariableText>()) {}
 
 CPWL_EditImpl::~CPWL_EditImpl() = default;
 
@@ -703,7 +703,7 @@
   if (!m_pVT->IsValid())
     return swRet;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   pIterator->SetAt(0);
 
   CPVT_Word wordinfo;
@@ -724,7 +724,7 @@
   if (!m_pVT->IsValid())
     return swRet;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   CPVT_WordRange wrTemp = range;
   m_pVT->UpdateWordPlace(wrTemp.BeginPos);
   m_pVT->UpdateWordPlace(wrTemp.EndPos);
@@ -752,7 +752,7 @@
 int32_t CPWL_EditImpl::GetTotalLines() const {
   int32_t nLines = 1;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   pIterator->SetAt(0);
   while (pIterator->NextLine())
     ++nLines;
@@ -1060,7 +1060,7 @@
   if (!m_pVT->IsValid())
     return;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   pIterator->SetAt(m_wpCaret);
 
   CFX_PointF ptHead;
@@ -1132,7 +1132,7 @@
   if (!m_pVT->IsValid())
     return;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   CPVT_WordPlace wpBegin = wr.BeginPos;
   m_pVT->UpdateWordPlace(wpBegin);
   CPVT_WordPlace wpEnd = wr.EndPos;
@@ -1157,7 +1157,7 @@
 }
 
 void CPWL_EditImpl::RefreshWordRange(const CPVT_WordRange& wr) {
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   CPVT_WordRange wrTemp = wr;
 
   m_pVT->UpdateWordPlace(wrTemp.BeginPos);
@@ -1218,7 +1218,7 @@
 void CPWL_EditImpl::SetCaretInfo() {
   if (m_pNotify) {
     if (!m_bNotifyFlag) {
-      CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+      CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
       pIterator->SetAt(m_wpCaret);
 
       CFX_PointF ptHead;
@@ -1529,7 +1529,7 @@
 
   CPVT_Word word;
   if (bAddUndo) {
-    CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+    CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
     pIterator->SetAt(m_wpCaret);
     pIterator->GetWord(word);
   }
@@ -1557,7 +1557,7 @@
 
   CPVT_Word word;
   if (bAddUndo) {
-    CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+    CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
     pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
     pIterator->GetWord(word);
   }
@@ -1677,7 +1677,7 @@
   if (!m_pVT->IsValid())
     return;
 
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   pIterator->SetAt(m_wpCaret);
   CPVT_Word word;
   CPVT_Line line;
diff --git a/fpdfsdk/pwl/cpwl_edit_impl.h b/fpdfsdk/pwl/cpwl_edit_impl.h
index f8e5771..8a93549 100644
--- a/fpdfsdk/pwl/cpwl_edit_impl.h
+++ b/fpdfsdk/pwl/cpwl_edit_impl.h
@@ -12,7 +12,7 @@
 #include <utility>
 #include <vector>
 
-#include "core/fpdfdoc/cpdf_variabletext.h"
+#include "core/fpdfdoc/cpvt_variabletext.h"
 #include "core/fpdfdoc/cpvt_wordrange.h"
 #include "core/fxcrt/unowned_ptr.h"
 #include "core/fxge/dib/fx_dib.h"
@@ -397,7 +397,7 @@
   bool m_bEnableUndo = true;
   int32_t m_nAlignment = 0;
   std::unique_ptr<CPWL_EditImpl_Provider> m_pVTProvider;
-  std::unique_ptr<CPDF_VariableText> m_pVT;  // Must outlive |m_pVTProvider|.
+  std::unique_ptr<CPVT_VariableText> m_pVT;  // Must outlive |m_pVTProvider|.
   UnownedPtr<CPWL_Edit> m_pNotify;
   CPVT_WordPlace m_wpCaret;
   CPVT_WordPlace m_wpOldCaret;
@@ -414,7 +414,7 @@
 class CPWL_EditImpl_Iterator {
  public:
   CPWL_EditImpl_Iterator(CPWL_EditImpl* pEdit,
-                         CPDF_VariableText::Iterator* pVTIterator);
+                         CPVT_VariableText::Iterator* pVTIterator);
   ~CPWL_EditImpl_Iterator();
 
   bool NextWord();
@@ -426,15 +426,15 @@
 
  private:
   UnownedPtr<CPWL_EditImpl> m_pEdit;
-  UnownedPtr<CPDF_VariableText::Iterator> m_pVTIterator;
+  UnownedPtr<CPVT_VariableText::Iterator> m_pVTIterator;
 };
 
-class CPWL_EditImpl_Provider final : public CPDF_VariableText::Provider {
+class CPWL_EditImpl_Provider final : public CPVT_VariableText::Provider {
  public:
   explicit CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap);
   ~CPWL_EditImpl_Provider() override;
 
-  // CPDF_VariableText::Provider:
+  // CPVT_VariableText::Provider:
   int GetCharWidth(int32_t nFontIndex, uint16_t word) override;
   int32_t GetWordFontIndex(uint16_t word,
                            int32_t charset,
