diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp
index 574fa1b..d2a8422 100644
--- a/core/fpdfdoc/cpdf_interform.cpp
+++ b/core/fpdfdoc/cpdf_interform.cpp
@@ -96,68 +96,6 @@
     pFormDict->SetStringFor("DA", csDA);
 }
 
-uint32_t CountFonts(CPDF_Dictionary* pFormDict) {
-  if (!pFormDict)
-    return 0;
-
-  CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
-  if (!pDR)
-    return 0;
-
-  CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
-  if (!pFonts)
-    return 0;
-
-  uint32_t dwCount = 0;
-  for (const auto& it : *pFonts) {
-    CPDF_Object* pObj = it.second;
-    if (!pObj)
-      continue;
-
-    if (CPDF_Dictionary* pDirect = ToDictionary(pObj->GetDirect())) {
-      if (pDirect->GetStringFor("Type") == "Font")
-        dwCount++;
-    }
-  }
-  return dwCount;
-}
-
-CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
-                   CPDF_Document* pDocument,
-                   uint32_t index,
-                   CFX_ByteString& csNameTag) {
-  if (!pFormDict)
-    return nullptr;
-
-  CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
-  if (!pDR)
-    return nullptr;
-
-  CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
-  if (!pFonts)
-    return nullptr;
-
-  uint32_t dwCount = 0;
-  for (const auto& it : *pFonts) {
-    const CFX_ByteString& csKey = it.first;
-    CPDF_Object* pObj = it.second;
-    if (!pObj)
-      continue;
-
-    CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
-    if (!pElement)
-      continue;
-    if (pElement->GetStringFor("Type") != "Font")
-      continue;
-    if (dwCount == index) {
-      csNameTag = csKey;
-      return pDocument->LoadFont(pElement);
-    }
-    dwCount++;
-  }
-  return nullptr;
-}
-
 CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
                    CPDF_Document* pDocument,
                    CFX_ByteString csNameTag) {
@@ -182,48 +120,6 @@
   return nullptr;
 }
 
-CPDF_Font* GetFont(CPDF_Dictionary* pFormDict,
-                   CPDF_Document* pDocument,
-                   CFX_ByteString csFontName,
-                   CFX_ByteString& csNameTag) {
-  if (!pFormDict || csFontName.IsEmpty())
-    return nullptr;
-
-  CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
-  if (!pDR)
-    return nullptr;
-
-  CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
-  if (!pFonts)
-    return nullptr;
-
-  for (const auto& it : *pFonts) {
-    const CFX_ByteString& csKey = it.first;
-    CPDF_Object* pObj = it.second;
-    if (!pObj)
-      continue;
-
-    CPDF_Dictionary* pElement = ToDictionary(pObj->GetDirect());
-    if (!pElement)
-      continue;
-    if (pElement->GetStringFor("Type") != "Font")
-      continue;
-
-    CPDF_Font* pFind = pDocument->LoadFont(pElement);
-    if (!pFind)
-      continue;
-
-    CFX_ByteString csBaseFont;
-    csBaseFont = pFind->GetBaseFont();
-    csBaseFont.Remove(' ');
-    if (csBaseFont == csFontName) {
-      csNameTag = csKey;
-      return pFind;
-    }
-  }
-  return nullptr;
-}
-
 CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict,
                          CPDF_Document* pDocument,
                          uint8_t charSet,
@@ -266,18 +162,6 @@
   return nullptr;
 }
 
-CPDF_Font* GetDefaultFont(CPDF_Dictionary* pFormDict,
-                          CPDF_Document* pDocument) {
-  if (!pFormDict)
-    return nullptr;
-
-  CPDF_DefaultAppearance cDA(pFormDict->GetStringFor("DA"));
-  CFX_ByteString csFontNameTag;
-  FX_FLOAT fFontSize;
-  cDA.GetFont(csFontNameTag, fFontSize);
-  return GetFont(pFormDict, pDocument, csFontNameTag);
-}
-
 FX_BOOL FindFont(CPDF_Dictionary* pFormDict,
                  const CPDF_Font* pFont,
                  CFX_ByteString& csNameTag) {
@@ -311,22 +195,6 @@
   return FALSE;
 }
 
-CPDF_Font* GetNativeFont(CPDF_Dictionary* pFormDict,
-                         CPDF_Document* pDocument,
-                         CFX_ByteString& csNameTag) {
-  csNameTag.clear();
-  uint8_t charSet = CPDF_InterForm::GetNativeCharSet();
-  CPDF_Font* pFont = GetDefaultFont(pFormDict, pDocument);
-  if (pFont) {
-    CFX_SubstFont* pSubst = pFont->GetSubstFont();
-    if (pSubst && pSubst->m_Charset == (int)charSet) {
-      FindFont(pFormDict, pFont, csNameTag);
-      return pFont;
-    }
-  }
-  return GetNativeFont(pFormDict, pDocument, charSet, csNameTag);
-}
-
 FX_BOOL FindFont(CPDF_Dictionary* pFormDict,
                  CPDF_Document* pDocument,
                  CFX_ByteString csFontName,
@@ -422,7 +290,7 @@
     csNameTag = csTemp;
     return pFont;
   }
-  CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
+  CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, nullptr);
   if (!csFontName.IsEmpty() &&
       FindFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
     return pFont;
@@ -434,34 +302,6 @@
   return pFont;
 }
 
-void RemoveFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont) {
-  if (!pFormDict || !pFont)
-    return;
-
-  CFX_ByteString csTag;
-  if (!FindFont(pFormDict, pFont, csTag))
-    return;
-
-  CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
-  CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
-  pFonts->RemoveFor(csTag);
-}
-
-void RemoveFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag) {
-  if (!pFormDict || csNameTag.IsEmpty())
-    return;
-
-  CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR");
-  if (!pDR)
-    return;
-
-  CPDF_Dictionary* pFonts = pDR->GetDictFor("Font");
-  if (!pFonts)
-    return;
-
-  pFonts->RemoveFor(csNameTag);
-}
-
 class CFieldNameExtractor {
  public:
   explicit CFieldNameExtractor(const CFX_WideString& full_name)
@@ -533,6 +373,22 @@
 }
 #endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 
+int CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2) {
+  const FX_WCHAR* ptr1 = name1.c_str();
+  const FX_WCHAR* ptr2 = name2.c_str();
+  if (name1.GetLength() == name2.GetLength())
+    return name1 == name2 ? 1 : 0;
+
+  int i = 0;
+  while (ptr1[i] == ptr2[i])
+    i++;
+  if (i == name1.GetLength())
+    return 2;
+  if (i == name2.GetLength())
+    return 3;
+  return 0;
+}
+
 }  // namespace
 
 class CFieldTree {
@@ -551,12 +407,12 @@
     Node* GetChildAt(size_t i) { return m_Children[i]; }
     const Node* GetChildAt(size_t i) const { return m_Children[i]; }
 
-    CPDF_FormField* GetFieldAtIndex(int index) {
-      int nFieldsToGo = index;
+    CPDF_FormField* GetFieldAtIndex(size_t index) {
+      size_t nFieldsToGo = index;
       return GetFieldInternal(&nFieldsToGo);
     }
 
-    int CountFields() const { return CountFieldsInternal(0); }
+    size_t CountFields() const { return CountFieldsInternal(0); }
 
     void SetField(CPDF_FormField* pField) { m_pField = pField; }
 
@@ -566,7 +422,7 @@
     const CFX_WideString& GetShortName() const { return m_ShortName; }
 
    private:
-    CPDF_FormField* GetFieldInternal(int* pFieldsToGo) {
+    CPDF_FormField* GetFieldInternal(size_t* pFieldsToGo) {
       if (m_pField) {
         if (*pFieldsToGo == 0)
           return m_pField;
@@ -582,13 +438,13 @@
       return nullptr;
     }
 
-    int CountFieldsInternal(int nLevel) const {
+    size_t CountFieldsInternal(int nLevel) const {
       if (nLevel > nMaxRecursion)
         return 0;
       if (m_pField)
         return 1;
 
-      int count = 0;
+      size_t count = 0;
       for (size_t i = 0; i < GetChildrenCount(); ++i)
         count += GetChildAt(i)->CountFieldsInternal(nLevel + 1);
       return count;
@@ -810,26 +666,26 @@
   if (!pFields)
     return;
 
-  for (size_t i = 0; i < pFields->GetCount(); i++)
-    LoadField(pFields->GetDictAt(i));
+  for (size_t i = 0; i < pFields->GetCount(); ++i)
+    LoadField(pFields->GetDictAt(i), 0);
 }
 
 CPDF_InterForm::~CPDF_InterForm() {
   for (auto it : m_ControlMap)
     delete it.second;
 
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; ++i)
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i)
     delete m_pFieldTree->m_Root.GetFieldAtIndex(i);
 }
 
-FX_BOOL CPDF_InterForm::s_bUpdateAP = TRUE;
+bool CPDF_InterForm::s_bUpdateAP = true;
 
-FX_BOOL CPDF_InterForm::IsUpdateAPEnabled() {
+bool CPDF_InterForm::IsUpdateAPEnabled() {
   return s_bUpdateAP;
 }
 
-void CPDF_InterForm::SetUpdateAP(FX_BOOL bUpdateAP) {
+void CPDF_InterForm::SetUpdateAP(bool bUpdateAP) {
   s_bUpdateAP = bUpdateAP;
 }
 
@@ -941,14 +797,6 @@
   return csFontName;
 }
 
-CFX_ByteString CPDF_InterForm::GetNativeFont(void* pLogFont) {
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-  return GetNativeFont(GetNativeCharSet(), pLogFont);
-#else
-  return CFX_ByteString();
-#endif
-}
-
 CPDF_Font* CPDF_InterForm::AddNativeFont(uint8_t charSet,
                                          CPDF_Document* pDocument) {
   if (!pDocument)
@@ -970,18 +818,18 @@
   return pDocument ? AddNativeFont(GetNativeCharSet(), pDocument) : nullptr;
 }
 
-FX_BOOL CPDF_InterForm::ValidateFieldName(
+bool CPDF_InterForm::ValidateFieldName(
     CFX_WideString& csNewFieldName,
     int iType,
     const CPDF_FormField* pExcludedField,
-    const CPDF_FormControl* pExcludedControl) {
+    const CPDF_FormControl* pExcludedControl) const {
   if (csNewFieldName.IsEmpty())
-    return FALSE;
+    return false;
 
   int iPos = 0;
   int iLength = csNewFieldName.GetLength();
   CFX_WideString csSub;
-  while (TRUE) {
+  while (true) {
     while (iPos < iLength &&
            (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
       iPos++;
@@ -991,113 +839,54 @@
     while (iPos < iLength && csNewFieldName[iPos] != L'.')
       csSub += csNewFieldName[iPos++];
     for (int i = csSub.GetLength() - 1; i > -1; i--) {
-      if (csSub[i] == L' ' || csSub[i] == L'.')
-        csSub.SetAt(i, L'\0');
-      else
+      if (csSub[i] != L' ' && csSub[i] != L'.')
         break;
+
+      csSub.SetAt(i, L'\0');
     }
-    uint32_t dwCount = m_pFieldTree->m_Root.CountFields();
-    for (uint32_t m = 0; m < dwCount; m++) {
+    size_t dwCount = m_pFieldTree->m_Root.CountFields();
+    for (size_t m = 0; m < dwCount; ++m) {
       CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(m);
       if (!pField)
         continue;
       if (pField == pExcludedField) {
-        if (pExcludedControl) {
-          if (pField->CountControls() < 2)
-            continue;
-        } else {
+        if (!pExcludedControl || pField->CountControls() < 2)
           continue;
-        }
       }
       CFX_WideString csFullName = pField->GetFullName();
       int iRet = CompareFieldName(csSub, csFullName);
       if (iRet == 1) {
         if (pField->GetFieldType() != iType)
-          return FALSE;
+          return false;
       } else if (iRet == 2 && csSub == csNewFieldName) {
         if (csFullName[iPos] == L'.')
-          return FALSE;
+          return false;
       } else if (iRet == 3 && csSub == csNewFieldName) {
         if (csNewFieldName[csFullName.GetLength()] == L'.')
-          return FALSE;
+          return false;
       }
     }
     if (iPos >= iLength)
       break;
   }
   if (csSub.IsEmpty())
-    return FALSE;
+    return false;
 
   csNewFieldName = csSub;
-  return TRUE;
+  return true;
 }
 
-FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName,
-                                          int iType) {
-  return ValidateFieldName(csNewFieldName, iType, nullptr, nullptr);
-}
-
-FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField,
-                                          CFX_WideString& csNewFieldName) {
-  return pField && !csNewFieldName.IsEmpty() &&
-         ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField,
-                           nullptr);
-}
-
-FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl,
-                                          CFX_WideString& csNewFieldName) {
-  if (!pControl || csNewFieldName.IsEmpty())
-    return FALSE;
-
-  CPDF_FormField* pField = pControl->GetField();
-  return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField,
-                           pControl);
-}
-
-int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1,
-                                     const CFX_ByteString& name2) {
-  if (name1.GetLength() == name2.GetLength())
-    return name1 == name2 ? 1 : 0;
-
-  const FX_CHAR* ptr1 = name1.c_str();
-  const FX_CHAR* ptr2 = name2.c_str();
-  int i = 0;
-  while (ptr1[i] == ptr2[i])
-    i++;
-  if (i == name1.GetLength())
-    return 2;
-  if (i == name2.GetLength())
-    return 3;
-  return 0;
-}
-
-int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1,
-                                     const CFX_WideString& name2) {
-  const FX_WCHAR* ptr1 = name1.c_str();
-  const FX_WCHAR* ptr2 = name2.c_str();
-  if (name1.GetLength() == name2.GetLength())
-    return name1 == name2 ? 1 : 0;
-
-  int i = 0;
-  while (ptr1[i] == ptr2[i])
-    i++;
-  if (i == name1.GetLength())
-    return 2;
-  if (i == name2.GetLength())
-    return 3;
-  return 0;
-}
-
-uint32_t CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) {
+size_t CPDF_InterForm::CountFields(const CFX_WideString& csFieldName) const {
   if (csFieldName.IsEmpty())
-    return (uint32_t)m_pFieldTree->m_Root.CountFields();
+    return m_pFieldTree->m_Root.CountFields();
 
   CFieldTree::Node* pNode = m_pFieldTree->FindNode(csFieldName);
   return pNode ? pNode->CountFields() : 0;
 }
 
-CPDF_FormField* CPDF_InterForm::GetField(uint32_t index,
-                                         const CFX_WideString& csFieldName) {
+CPDF_FormField* CPDF_InterForm::GetField(
+    uint32_t index,
+    const CFX_WideString& csFieldName) const {
   if (csFieldName.IsEmpty())
     return m_pFieldTree->m_Root.GetFieldAtIndex(index);
 
@@ -1190,77 +979,17 @@
   return -1;
 }
 
-uint32_t CPDF_InterForm::CountFormFonts() {
-  return CountFonts(m_pFormDict);
-}
-
-CPDF_Font* CPDF_InterForm::GetFormFont(uint32_t index,
-                                       CFX_ByteString& csNameTag) {
-  return GetFont(m_pFormDict, m_pDocument, index, csNameTag);
-}
-
 CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag) {
   return GetFont(m_pFormDict, m_pDocument, csNameTag);
 }
 
-CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName,
-                                       CFX_ByteString& csNameTag) {
-  return GetFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
-}
-
-CPDF_Font* CPDF_InterForm::GetNativeFormFont(uint8_t charSet,
-                                             CFX_ByteString& csNameTag) {
-  return ::GetNativeFont(m_pFormDict, m_pDocument, charSet, csNameTag);
-}
-
-CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag) {
-  return ::GetNativeFont(m_pFormDict, m_pDocument, csNameTag);
-}
-
-FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont,
-                                     CFX_ByteString& csNameTag) {
-  return FindFont(m_pFormDict, pFont, csNameTag);
-}
-
-FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName,
-                                     CPDF_Font*& pFont,
-                                     CFX_ByteString& csNameTag) {
-  return FindFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
-}
-
-void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont,
-                                 CFX_ByteString& csNameTag) {
-  AddFont(m_pFormDict, m_pDocument, pFont, csNameTag);
-}
-
-CPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet,
-                                             CFX_ByteString& csNameTag) {
-  return ::AddNativeFont(m_pFormDict, m_pDocument, charSet, csNameTag);
-}
-
-CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) {
-  return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
-}
-
-void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) {
-  RemoveFont(m_pFormDict, pFont);
-}
-
-void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) {
-  RemoveFont(m_pFormDict, csNameTag);
-}
-
-CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() {
+CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance() const {
   if (!m_pFormDict)
     return CPDF_DefaultAppearance();
   return CPDF_DefaultAppearance(m_pFormDict->GetStringFor("DA"));
 }
 
-CPDF_Font* CPDF_InterForm::GetDefaultFormFont() {
-  return GetDefaultFont(m_pFormDict, m_pDocument);
-}
-
-int CPDF_InterForm::GetFormAlignment() {
+int CPDF_InterForm::GetFormAlignment() const {
   return m_pFormDict ? m_pFormDict->GetIntegerFor("Q", 0) : 0;
 }
 
@@ -1270,8 +999,8 @@
   if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
     return false;
 
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; ++i) {
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i) {
     CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
     if (!pField)
       continue;
@@ -1288,8 +1017,8 @@
   if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormReset(this) < 0)
     return false;
 
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; ++i) {
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i) {
     CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
     if (!pField)
       continue;
@@ -1347,7 +1076,7 @@
   for (size_t i = 0; i < pAnnots->GetCount(); i++) {
     CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i);
     if (pAnnot && pAnnot->GetStringFor("Subtype") == "Widget")
-      LoadField(pAnnot);
+      LoadField(pAnnot, 0);
   }
 }
 
@@ -1430,8 +1159,8 @@
 CPDF_FormField* CPDF_InterForm::CheckRequiredFields(
     const std::vector<CPDF_FormField*>* fields,
     bool bIncludeOrExclude) const {
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; ++i) {
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i) {
     CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
     if (!pField)
       continue;
@@ -1461,8 +1190,8 @@
 CFDF_Document* CPDF_InterForm::ExportToFDF(const CFX_WideStringC& pdf_path,
                                            bool bSimpleFileSpec) const {
   std::vector<CPDF_FormField*> fields;
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; ++i)
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i)
     fields.push_back(m_pFieldTree->m_Root.GetFieldAtIndex(i));
   return ExportToFDF(pdf_path, fields, true, bSimpleFileSpec);
 }
@@ -1491,8 +1220,8 @@
 
   CPDF_Array* pFields = new CPDF_Array;
   pMainDict->SetFor("Fields", pFields);
-  int nCount = m_pFieldTree->m_Root.CountFields();
-  for (int i = 0; i < nCount; i++) {
+  size_t nCount = m_pFieldTree->m_Root.CountFields();
+  for (size_t i = 0; i < nCount; ++i) {
     CPDF_FormField* pField = m_pFieldTree->m_Root.GetFieldAtIndex(i);
     if (!pField || pField->GetType() == CPDF_FormField::PushButton)
       continue;
@@ -1586,35 +1315,6 @@
   }
 }
 
-FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF,
-                                      FX_BOOL bNotify) {
-  if (!pFDF)
-    return FALSE;
-
-  CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictFor("FDF");
-  if (!pMainDict)
-    return FALSE;
-
-  CPDF_Array* pFields = pMainDict->GetArrayFor("Fields");
-  if (!pFields)
-    return FALSE;
-
-  m_bsEncoding = pMainDict->GetStringFor("Encoding");
-  if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormImportData(this) < 0)
-    return FALSE;
-
-  for (size_t i = 0; i < pFields->GetCount(); i++) {
-    CPDF_Dictionary* pField = pFields->GetDictAt(i);
-    if (!pField)
-      continue;
-
-    FDF_ImportField(pField, L"", bNotify);
-  }
-  if (bNotify && m_pFormNotify)
-    m_pFormNotify->AfterFormImportData(this);
-  return TRUE;
-}
-
 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) {
   m_pFormNotify = pNotify;
 }
diff --git a/core/fpdfdoc/include/cpdf_interform.h b/core/fpdfdoc/include/cpdf_interform.h
index 6d9d616..9c07ee9 100644
--- a/core/fpdfdoc/include/cpdf_interform.h
+++ b/core/fpdfdoc/include/cpdf_interform.h
@@ -36,30 +36,22 @@
   explicit CPDF_InterForm(CPDF_Document* pDocument);
   ~CPDF_InterForm();
 
-  static void SetUpdateAP(FX_BOOL bUpdateAP);
-  static FX_BOOL IsUpdateAPEnabled();
+  static void SetUpdateAP(bool bUpdateAP);
+  static bool IsUpdateAPEnabled();
   static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
                                                 const FX_CHAR* csType,
-                                                int iMinLen = 2,
-                                                const FX_CHAR* csPrefix = "");
+                                                int iMinLen,
+                                                const FX_CHAR* csPrefix);
   static CPDF_Font* AddStandardFont(CPDF_Document* pDocument,
                                     CFX_ByteString csFontName);
-  static CFX_ByteString GetNativeFont(uint8_t iCharSet,
-                                      void* pLogFont = nullptr);
-  static CFX_ByteString GetNativeFont(void* pLogFont = nullptr);
+  static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont);
   static uint8_t GetNativeCharSet();
   static CPDF_Font* AddNativeFont(uint8_t iCharSet, CPDF_Document* pDocument);
   static CPDF_Font* AddNativeFont(CPDF_Document* pDocument);
 
-  FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
-  FX_BOOL ValidateFieldName(const CPDF_FormField* pField,
-                            CFX_WideString& csNewFieldName);
-  FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl,
-                            CFX_WideString& csNewFieldName);
-
-  uint32_t CountFields(const CFX_WideString& csFieldName = L"");
+  size_t CountFields(const CFX_WideString& csFieldName) const;
   CPDF_FormField* GetField(uint32_t index,
-                           const CFX_WideString& csFieldName = L"");
+                           const CFX_WideString& csFieldName) const;
   CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
 
   CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
@@ -68,57 +60,30 @@
                                       int* z_order) const;
   CPDF_FormControl* GetControlByDict(const CPDF_Dictionary* pWidgetDict) const;
 
-  CPDF_Document* GetDocument() const { return m_pDocument; }
-  CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
   FX_BOOL NeedConstructAP() const;
   int CountFieldsInCalculationOrder();
   CPDF_FormField* GetFieldInCalculationOrder(int index);
   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
 
-  uint32_t CountFormFonts();
-  CPDF_Font* GetFormFont(uint32_t index, CFX_ByteString& csNameTag);
   CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
-  CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
-  CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
-  CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
-  FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-  FX_BOOL FindFormFont(CFX_ByteString csFontName,
-                       CPDF_Font*& pFont,
-                       CFX_ByteString& csNameTag);
-
-  FX_BOOL FindFormFont(CFX_WideString csFontName,
-                       CPDF_Font*& pFont,
-                       CFX_ByteString& csNameTag) {
-    return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
-  }
-
-  void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
-  CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
-  CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
-
-  void RemoveFormFont(const CPDF_Font* pFont);
-  void RemoveFormFont(CFX_ByteString csNameTag);
-
-  CPDF_DefaultAppearance GetDefaultAppearance();
-  CPDF_Font* GetDefaultFormFont();
-  int GetFormAlignment();
+  CPDF_DefaultAppearance GetDefaultAppearance() const;
+  int GetFormAlignment() const;
 
   CPDF_FormField* CheckRequiredFields(
       const std::vector<CPDF_FormField*>* fields,
       bool bIncludeOrExclude) const;
 
   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
-                             bool bSimpleFileSpec = false) const;
+                             bool bSimpleFileSpec) const;
   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
                              const std::vector<CPDF_FormField*>& fields,
-                             bool bIncludeOrExclude = true,
-                             bool bSimpleFileSpec = false) const;
-  FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
+                             bool bIncludeOrExclude,
+                             bool bSimpleFileSpec) const;
 
   bool ResetForm(const std::vector<CPDF_FormField*>& fields,
-                 bool bIncludeOrExclude = true,
-                 bool bNotify = false);
-  bool ResetForm(bool bNotify = false);
+                 bool bIncludeOrExclude,
+                 bool bNotify);
+  bool ResetForm(bool bNotify);
 
   void SetFormNotify(IPDF_FormNotify* pNotify);
   FX_BOOL HasXFAForm() const;
@@ -128,8 +93,7 @@
   friend class CPDF_FormControl;
   friend class CPDF_FormField;
 
-  void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
-  CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
+  void LoadField(CPDF_Dictionary* pFieldDict, int nLevel);
   CPDF_FormField* AddTerminalField(CPDF_Dictionary* pFieldDict);
   CPDF_FormControl* AddControl(CPDF_FormField* pField,
                                CPDF_Dictionary* pWidgetDict);
@@ -137,16 +101,12 @@
                        const CFX_WideString& parent_name,
                        FX_BOOL bNotify = FALSE,
                        int nLevel = 0);
-  FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName,
-                            int iType,
-                            const CPDF_FormField* pExcludedField,
-                            const CPDF_FormControl* pExcludedControl);
-  int CompareFieldName(const CFX_WideString& name1,
-                       const CFX_WideString& name2);
-  int CompareFieldName(const CFX_ByteString& name1,
-                       const CFX_ByteString& name2);
+  bool ValidateFieldName(CFX_WideString& csNewFieldName,
+                         int iType,
+                         const CPDF_FormField* pExcludedField,
+                         const CPDF_FormControl* pExcludedControl) const;
 
-  static FX_BOOL s_bUpdateAP;
+  static bool s_bUpdateAP;
 
   CPDF_Document* const m_pDocument;
   CPDF_Dictionary* m_pFormDict;
diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index ce6206a..01889d5 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -8,6 +8,7 @@
 
 #include <algorithm>
 #include <memory>
+#include <vector>
 
 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
@@ -524,7 +525,7 @@
     bool bIncludeOrExclude,
     CFX_ByteTextBuf& textBuf) {
   std::unique_ptr<CFDF_Document> pFDF(m_pInterForm->ExportToFDF(
-      m_pDocument->GetPath().AsStringC(), fields, bIncludeOrExclude));
+      m_pDocument->GetPath().AsStringC(), fields, bIncludeOrExclude, false));
   return pFDF ? pFDF->WriteBuf(textBuf) : FALSE;
 }
 
@@ -543,7 +544,8 @@
 
   CPDFSDK_Environment* pEnv = m_pDocument->GetEnv();
   CFX_WideString wsPDFFilePath = m_pDocument->GetPath();
-  CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath.AsStringC());
+  CFDF_Document* pFDFDoc =
+      m_pInterForm->ExportToFDF(wsPDFFilePath.AsStringC(), false);
   if (!pFDFDoc)
     return FALSE;
 
@@ -569,7 +571,7 @@
 
 FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf) {
   CFDF_Document* pFDF =
-      m_pInterForm->ExportToFDF(m_pDocument->GetPath().AsStringC());
+      m_pInterForm->ExportToFDF(m_pDocument->GetPath().AsStringC(), false);
   if (!pFDF)
     return FALSE;
 
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 900ea48..f546e38 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -6,6 +6,9 @@
 
 #include "fpdfsdk/include/cpdfsdk_pageview.h"
 
+#include <memory>
+#include <vector>
+
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/fpdf_render/include/cpdf_renderoptions.h"
 #include "core/fpdfdoc/include/cpdf_annotlist.h"
@@ -488,9 +491,9 @@
 
   CPDF_Page* pPage = GetPDFPage();
   ASSERT(pPage);
-  FX_BOOL bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
+  bool bUpdateAP = CPDF_InterForm::IsUpdateAPEnabled();
   // Disable the default AP construction.
-  CPDF_InterForm::SetUpdateAP(FALSE);
+  CPDF_InterForm::SetUpdateAP(false);
   m_pAnnotList.reset(new CPDF_AnnotList(pPage));
   CPDF_InterForm::SetUpdateAP(bUpdateAP);
 
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index ea225f0..b7b03b2 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -6,6 +6,7 @@
 
 #include "fpdfsdk/javascript/Document.h"
 
+#include <utility>
 #include <vector>
 
 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
@@ -174,7 +175,7 @@
   }
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
   CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-  vp << (int)pPDFForm->CountFields();
+  vp << static_cast<int>(pPDFForm->CountFields(CFX_WideString()));
   return TRUE;
 }
 
@@ -337,7 +338,7 @@
   }
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
   CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-  CPDF_FormField* pField = pPDFForm->GetField(nIndex);
+  CPDF_FormField* pField = pPDFForm->GetField(nIndex, CFX_WideString());
   if (!pField)
     return FALSE;
 
@@ -616,7 +617,6 @@
                              const std::vector<CJS_Value>& params,
                              CJS_Value& vRet,
                              CFX_WideString& sError) {
-
   int nSize = params.size();
   if (nSize < 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
@@ -1234,7 +1234,6 @@
                           const std::vector<CJS_Value>& params,
                           CJS_Value& vRet,
                           CFX_WideString& sError) {
-
   if (params.size() != 2) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
