diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 7aa8534..8912fa5 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -28,11 +28,6 @@
 #include "fpdfsdk/pdfwindow/PWL_Edit.h"
 #include "fpdfsdk/pdfwindow/PWL_EditCtrl.h"
 
-#define PVTWORD_STYLE_UNDERLINE 0x0002L
-#define PVTWORD_STYLE_CROSSOUT 0x0004L
-#define PVTWORD_STYLE_BOLD 0x0020L
-#define PVTWORD_STYLE_ITALIC 0x0040L
-
 namespace {
 
 const int kEditUndoMaxItems = 10000;
@@ -58,20 +53,6 @@
   return sRet.MakeString();
 }
 
-CFX_FloatRect GetUnderLineRect(const CPVT_Word& word) {
-  return CFX_FloatRect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
-                       word.ptWord.x + word.fWidth,
-                       word.ptWord.y + word.fDescent * 0.25f);
-}
-
-CFX_FloatRect GetCrossoutRect(const CPVT_Word& word) {
-  return CFX_FloatRect(word.ptWord.x,
-                       word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f +
-                           word.fDescent * 0.25f,
-                       word.ptWord.x + word.fWidth,
-                       word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);
-}
-
 void DrawTextString(CFX_RenderDevice* pDevice,
                     const CFX_FloatPoint& pt,
                     CPDF_Font* pFont,
@@ -133,25 +114,6 @@
   }
 }
 
-void AddRectToPageObjects(CPDF_PageObjectHolder* pObjectHolder,
-                          FX_COLORREF crFill,
-                          const CFX_FloatRect& rcFill) {
-  std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject);
-  pPathObj->m_Path.AppendRect(rcFill.left, rcFill.bottom, rcFill.right,
-                              rcFill.top);
-
-  FX_FLOAT rgb[3];
-  rgb[0] = FXARGB_R(crFill) / 255.0f;
-  rgb[1] = FXARGB_G(crFill) / 255.0f;
-  rgb[2] = FXARGB_B(crFill) / 255.0f;
-  pPathObj->m_ColorState.SetFillColor(
-      CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
-
-  pPathObj->m_FillType = FXFILL_ALTERNATE;
-  pPathObj->m_bStroke = FALSE;
-  pObjectHolder->GetPageObjectList()->push_back(std::move(pPathObj));
-}
-
 CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjectHolder* pObjectHolder,
                                          FX_COLORREF crText,
                                          CPDF_Font* pFont,
@@ -202,26 +164,10 @@
   return m_pVTIterator->NextWord();
 }
 
-FX_BOOL CFX_Edit_Iterator::NextLine() {
-  return m_pVTIterator->NextLine();
-}
-
-FX_BOOL CFX_Edit_Iterator::NextSection() {
-  return m_pVTIterator->NextSection();
-}
-
 FX_BOOL CFX_Edit_Iterator::PrevWord() {
   return m_pVTIterator->PrevWord();
 }
 
-FX_BOOL CFX_Edit_Iterator::PrevLine() {
-  return m_pVTIterator->PrevLine();
-}
-
-FX_BOOL CFX_Edit_Iterator::PrevSection() {
-  return m_pVTIterator->PrevSection();
-}
-
 FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word& word) const {
   ASSERT(m_pEdit);
 
@@ -264,10 +210,6 @@
   return m_pVTIterator->GetAt();
 }
 
-CFX_Edit* CFX_Edit_Iterator::GetEdit() const {
-  return m_pEdit;
-}
-
 CFX_Edit_Provider::CFX_Edit_Provider(IPVT_FontMap* pFontMap)
     : CPDF_VariableText::Provider(pFontMap), m_pFontMap(pFontMap) {
   ASSERT(m_pFontMap);
@@ -414,10 +356,6 @@
   m_bWorking = FALSE;
 }
 
-FX_BOOL CFX_Edit_Undo::IsWorking() const {
-  return m_bWorking;
-}
-
 void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem) {
   ASSERT(!m_bWorking);
   ASSERT(pItem);
@@ -441,13 +379,6 @@
   return m_bVirgin ? m_bModified : TRUE;
 }
 
-IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(int32_t nIndex) {
-  if (nIndex >= 0 && nIndex < m_UndoItemStack.GetSize())
-    return m_UndoItemStack.GetAt(nIndex);
-
-  return nullptr;
-}
-
 void CFX_Edit_Undo::RemoveHeads() {
   ASSERT(m_UndoItemStack.GetSize() > 1);
 
@@ -482,10 +413,6 @@
   m_bFirst = bFirst;
 }
 
-FX_BOOL CFX_Edit_UndoItem::IsFirst() {
-  return m_bFirst;
-}
-
 void CFX_Edit_UndoItem::SetLast(FX_BOOL bLast) {
   m_bLast = bLast;
 }
@@ -884,54 +811,6 @@
 }
 
 // static
-void CFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice,
-                             CFX_Matrix* pUser2Device,
-                             CFX_Edit* pEdit,
-                             FX_COLORREF color,
-                             const CFX_FloatRect& rcClip,
-                             const CFX_FloatPoint& ptOffset,
-                             const CPVT_WordRange* pRange) {
-  pDevice->SaveState();
-
-  if (!rcClip.IsEmpty()) {
-    CFX_FloatRect rcTemp = rcClip;
-    pUser2Device->TransformRect(rcTemp);
-    pDevice->SetClip_Rect(rcTemp.ToFxRect());
-  }
-
-  CFX_Edit_Iterator* pIterator = pEdit->GetIterator();
-  if (pEdit->GetFontMap()) {
-    if (pRange)
-      pIterator->SetAt(pRange->BeginPos);
-    else
-      pIterator->SetAt(0);
-
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
-      if (pRange && place.WordCmp(pRange->EndPos) > 0)
-        break;
-
-      CPVT_Word word;
-      if (pIterator->GetWord(word)) {
-        CFX_PathData pathUnderline;
-        CFX_FloatRect rcUnderline = GetUnderLineRect(word);
-        rcUnderline.left += ptOffset.x;
-        rcUnderline.right += ptOffset.x;
-        rcUnderline.top += ptOffset.y;
-        rcUnderline.bottom += ptOffset.y;
-        pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom,
-                                 rcUnderline.right, rcUnderline.top);
-
-        pDevice->DrawPath(&pathUnderline, pUser2Device, nullptr, color, 0,
-                          FXFILL_WINDING);
-      }
-    }
-  }
-
-  pDevice->RestoreState(false);
-}
-
-// static
 void CFX_Edit::DrawEdit(CFX_RenderDevice* pDevice,
                         CFX_Matrix* pUser2Device,
                         CFX_Edit* pEdit,
@@ -1057,132 +936,6 @@
 }
 
 // static
-void CFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice,
-                            CFX_Matrix* pUser2Device,
-                            CFX_Edit* pEdit,
-                            const CFX_FloatRect& rcClip,
-                            const CFX_FloatPoint& ptOffset,
-                            const CPVT_WordRange* pRange) {
-  CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
-
-  FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
-  FX_COLORREF crOld = crCurText;
-  FX_BOOL bSelect = FALSE;
-  const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255);
-  const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113);
-
-  CFX_ByteTextBuf sTextBuf;
-  CPVT_WordProps wp;
-  CFX_FloatPoint ptBT(0.0f, 0.0f);
-
-  pDevice->SaveState();
-
-  if (!rcClip.IsEmpty()) {
-    CFX_FloatRect rcTemp = rcClip;
-    pUser2Device->TransformRect(rcTemp);
-    pDevice->SetClip_Rect(rcTemp.ToFxRect());
-  }
-
-  CFX_Edit_Iterator* pIterator = pEdit->GetIterator();
-  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-    if (pRange)
-      pIterator->SetAt(pRange->BeginPos);
-    else
-      pIterator->SetAt(0);
-
-    CPVT_WordPlace oldplace;
-
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
-      if (pRange && place.WordCmp(pRange->EndPos) > 0)
-        break;
-
-      CPVT_Word word;
-      if (pIterator->GetWord(word)) {
-        word.WordProps.fFontSize = word.fFontSize;
-
-        crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
-
-        if (wrSelect.IsExist()) {
-          bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
-                    place.WordCmp(wrSelect.EndPos) <= 0;
-          if (bSelect) {
-            crCurText = crWhite;
-          }
-        }
-
-        if (bSelect) {
-          CPVT_Line line;
-          pIterator->GetLine(line);
-
-          CFX_PathData pathSelBK;
-          pathSelBK.AppendRect(word.ptWord.x + ptOffset.x,
-                               line.ptLine.y + line.fLineDescent + ptOffset.y,
-                               word.ptWord.x + word.fWidth + ptOffset.x,
-                               line.ptLine.y + line.fLineAscent + ptOffset.y);
-
-          pDevice->DrawPath(&pathSelBK, pUser2Device, nullptr, crSelBK, 0,
-                            FXFILL_WINDING);
-        }
-
-        if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f ||
-            word.WordProps.nHorzScale != 100 ||
-            FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
-            crOld != crCurText) {
-          if (sTextBuf.GetLength() > 0) {
-            DrawTextString(
-                pDevice,
-                CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-                pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, pUser2Device,
-                sTextBuf.MakeString(), crOld, 0, wp.nHorzScale);
-
-            sTextBuf.Clear();
-          }
-          wp = word.WordProps;
-          ptBT = word.ptWord;
-          crOld = crCurText;
-        }
-
-        sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex,
-                                     word.Word, 0)
-                        .AsStringC();
-
-        if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) {
-          CFX_PathData pathUnderline;
-          CFX_FloatRect rcUnderline = GetUnderLineRect(word);
-          pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom,
-                                   rcUnderline.right, rcUnderline.top);
-
-          pDevice->DrawPath(&pathUnderline, pUser2Device, nullptr, crCurText, 0,
-                            FXFILL_WINDING);
-        }
-
-        if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) {
-          CFX_PathData pathCrossout;
-          CFX_FloatRect rcCrossout = GetCrossoutRect(word);
-          pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom,
-                                  rcCrossout.right, rcCrossout.top);
-
-          pDevice->DrawPath(&pathCrossout, pUser2Device, nullptr, crCurText, 0,
-                            FXFILL_WINDING);
-        }
-
-        oldplace = place;
-      }
-    }
-
-    if (sTextBuf.GetLength() > 0) {
-      DrawTextString(
-          pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-          pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, pUser2Device,
-          sTextBuf.MakeString(), crOld, 0, wp.nHorzScale);
-    }
-  }
-
-  pDevice->RestoreState(false);
-}
-
-// static
 void CFX_Edit::GeneratePageObjects(
     CPDF_PageObjectHolder* pObjectHolder,
     CFX_Edit* pEdit,
@@ -1245,132 +998,6 @@
   }
 }
 
-// static
-void CFX_Edit::GenerateRichPageObjects(
-    CPDF_PageObjectHolder* pObjectHolder,
-    CFX_Edit* pEdit,
-    const CFX_FloatPoint& ptOffset,
-    const CPVT_WordRange* pRange,
-    CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) {
-  FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
-  FX_COLORREF crOld = crCurText;
-
-  CFX_ByteTextBuf sTextBuf;
-  CPVT_WordProps wp;
-  CFX_FloatPoint ptBT(0.0f, 0.0f);
-
-  ObjArray.RemoveAll();
-
-  CFX_Edit_Iterator* pIterator = pEdit->GetIterator();
-  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-    if (pRange)
-      pIterator->SetAt(pRange->BeginPos);
-    else
-      pIterator->SetAt(0);
-
-    CPVT_WordPlace oldplace;
-
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
-      if (pRange && place.WordCmp(pRange->EndPos) > 0)
-        break;
-
-      CPVT_Word word;
-      if (pIterator->GetWord(word)) {
-        word.WordProps.fFontSize = word.fFontSize;
-
-        crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
-
-        if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f ||
-            word.WordProps.nHorzScale != 100 ||
-            FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
-            crOld != crCurText) {
-          if (sTextBuf.GetLength() > 0) {
-            ObjArray.Add(AddTextObjToPageObjects(
-                pObjectHolder, crOld, pFontMap->GetPDFFont(wp.nFontIndex),
-                wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
-                CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-                sTextBuf.MakeString()));
-
-            sTextBuf.Clear();
-          }
-
-          wp = word.WordProps;
-          ptBT = word.ptWord;
-          crOld = crCurText;
-        }
-
-        sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex,
-                                     word.Word, 0)
-                        .AsStringC();
-
-        if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) {
-          CFX_FloatRect rcUnderline = GetUnderLineRect(word);
-          rcUnderline.left += ptOffset.x;
-          rcUnderline.right += ptOffset.x;
-          rcUnderline.top += ptOffset.y;
-          rcUnderline.bottom += ptOffset.y;
-
-          AddRectToPageObjects(pObjectHolder, crCurText, rcUnderline);
-        }
-
-        if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) {
-          CFX_FloatRect rcCrossout = GetCrossoutRect(word);
-          rcCrossout.left += ptOffset.x;
-          rcCrossout.right += ptOffset.x;
-          rcCrossout.top += ptOffset.y;
-          rcCrossout.bottom += ptOffset.y;
-
-          AddRectToPageObjects(pObjectHolder, crCurText, rcCrossout);
-        }
-
-        oldplace = place;
-      }
-    }
-
-    if (sTextBuf.GetLength() > 0) {
-      ObjArray.Add(AddTextObjToPageObjects(
-          pObjectHolder, crOld, pFontMap->GetPDFFont(wp.nFontIndex),
-          wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
-          CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-          sTextBuf.MakeString()));
-    }
-  }
-}
-
-// static
-void CFX_Edit::GenerateUnderlineObjects(CPDF_PageObjectHolder* pObjectHolder,
-                                        CFX_Edit* pEdit,
-                                        const CFX_FloatPoint& ptOffset,
-                                        const CPVT_WordRange* pRange,
-                                        FX_COLORREF color) {
-  CFX_Edit_Iterator* pIterator = pEdit->GetIterator();
-  if (pEdit->GetFontMap()) {
-    if (pRange)
-      pIterator->SetAt(pRange->BeginPos);
-    else
-      pIterator->SetAt(0);
-
-    CPVT_WordPlace oldplace;
-
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
-      if (pRange && place.WordCmp(pRange->EndPos) > 0)
-        break;
-
-      CPVT_Word word;
-      if (pIterator->GetWord(word)) {
-        CFX_FloatRect rcUnderline = GetUnderLineRect(word);
-        rcUnderline.left += ptOffset.x;
-        rcUnderline.right += ptOffset.x;
-        rcUnderline.top += ptOffset.y;
-        rcUnderline.bottom += ptOffset.y;
-        AddRectToPageObjects(pObjectHolder, color, rcUnderline);
-      }
-    }
-  }
-}
-
 CFX_Edit::CFX_Edit()
     : m_pVT(new CPDF_VariableText),
       m_pNotify(nullptr),
@@ -1421,10 +1048,6 @@
   return m_pIterator.get();
 }
 
-CPDF_VariableText* CFX_Edit::GetVariableText() {
-  return m_pVT.get();
-}
-
 IPVT_FontMap* CFX_Edit::GetFontMap() {
   return m_pVTProvider ? m_pVTProvider->GetFontMap() : nullptr;
 }
@@ -1651,25 +1274,6 @@
   return m_SelState.ConvertToWordRange();
 }
 
-CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange& wr1,
-                                          const CPVT_WordRange& wr2) {
-  CPVT_WordRange wrRet;
-
-  if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) {
-    wrRet.BeginPos = wr1.BeginPos;
-  } else {
-    wrRet.BeginPos = wr2.BeginPos;
-  }
-
-  if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) {
-    wrRet.EndPos = wr2.EndPos;
-  } else {
-    wrRet.EndPos = wr1.EndPos;
-  }
-
-  return wrRet;
-}
-
 void CFX_Edit::SetText(const CFX_WideString& sText) {
   Empty();
   DoInsertText(CPVT_WordPlace(0, 0, -1), sText, DEFAULT_CHARSET);
@@ -1712,10 +1316,6 @@
   return m_pVT->GetCharArray();
 }
 
-CFX_FloatRect CFX_Edit::GetPlateRect() const {
-  return m_pVT->GetPlateRect();
-}
-
 CFX_FloatRect CFX_Edit::GetContentRect() const {
   return VTToEdit(m_pVT->GetContentRect());
 }
@@ -1883,15 +1483,6 @@
                        ptRightTop.y);
 }
 
-CFX_FloatRect CFX_Edit::EditToVT(const CFX_FloatRect& rect) const {
-  CFX_FloatPoint ptLeftBottom =
-      EditToVT(CFX_FloatPoint(rect.left, rect.bottom));
-  CFX_FloatPoint ptRightTop = EditToVT(CFX_FloatPoint(rect.right, rect.top));
-
-  return CFX_FloatRect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x,
-                       ptRightTop.y);
-}
-
 void CFX_Edit::SetScrollInfo() {
   if (m_pNotify) {
     CFX_FloatRect rcPlate = m_pVT->GetPlateRect();
@@ -2084,50 +1675,6 @@
   } while (pIterator->NextLine());
 }
 
-void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange& wr) {
-  if (!m_pVT->IsValid())
-    return;
-
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
-  CPVT_WordRange wrTemp = wr;
-
-  m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-  m_pVT->UpdateWordPlace(wrTemp.EndPos);
-  pIterator->SetAt(wrTemp.BeginPos);
-
-  CPVT_Word wordinfo;
-  CPVT_Line lineinfo;
-  CPVT_WordPlace place;
-
-  while (pIterator->NextWord()) {
-    place = pIterator->GetAt();
-    if (place.WordCmp(wrTemp.EndPos) > 0)
-      break;
-
-    pIterator->GetWord(wordinfo);
-    pIterator->GetLine(lineinfo);
-
-    if (place.LineCmp(wrTemp.BeginPos) == 0 ||
-        place.LineCmp(wrTemp.EndPos) == 0) {
-      CFX_FloatRect rcWord(wordinfo.ptWord.x,
-                           lineinfo.ptLine.y + lineinfo.fLineDescent,
-                           wordinfo.ptWord.x + wordinfo.fWidth,
-                           lineinfo.ptLine.y + lineinfo.fLineAscent);
-
-      m_Refresh.AddRefresh(VTToEdit(rcWord));
-    } else {
-      CFX_FloatRect rcLine(lineinfo.ptLine.x,
-                           lineinfo.ptLine.y + lineinfo.fLineDescent,
-                           lineinfo.ptLine.x + lineinfo.fLineWidth,
-                           lineinfo.ptLine.y + lineinfo.fLineAscent);
-
-      m_Refresh.AddRefresh(VTToEdit(rcLine));
-
-      pIterator->NextLine();
-    }
-  }
-}
-
 void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr) {
   CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   CPVT_WordRange wrTemp = wr;
@@ -2802,23 +2349,6 @@
   return FALSE;
 }
 
-CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace& place) const {
-  return m_pVT->GetLineBeginPlace(place);
-}
-
-CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace& place) const {
-  return m_pVT->GetLineEndPlace(place);
-}
-
-CPVT_WordPlace CFX_Edit::GetSectionBeginPlace(
-    const CPVT_WordPlace& place) const {
-  return m_pVT->GetSectionBeginPlace(place);
-}
-
-CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace& place) const {
-  return m_pVT->GetSectionEndPlace(place);
-}
-
 FX_BOOL CFX_Edit::CanUndo() const {
   if (m_bEnableUndo) {
     return m_Undo.CanUndo();
@@ -2835,14 +2365,6 @@
   return FALSE;
 }
 
-FX_BOOL CFX_Edit::IsModified() const {
-  if (m_bEnableUndo) {
-    return m_Undo.IsModified();
-  }
-
-  return FALSE;
-}
-
 void CFX_Edit::EnableRefresh(FX_BOOL bRefresh) {
   m_bEnableRefresh = bRefresh;
 }
@@ -2855,32 +2377,6 @@
   m_bOprNotify = bNotify;
 }
 
-FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const {
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
-  CPVT_WordPlace wpOld = pIterator->GetAt();
-
-  pIterator->SetAt(place);
-  CPVT_Line line;
-  pIterator->GetLine(line);
-
-  pIterator->SetAt(wpOld);
-
-  return line.ptLine.y + line.fLineAscent;
-}
-
-FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const {
-  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
-  CPVT_WordPlace wpOld = pIterator->GetAt();
-
-  pIterator->SetAt(place);
-  CPVT_Line line;
-  pIterator->GetLine(line);
-
-  pIterator->SetAt(wpOld);
-
-  return line.ptLine.y + line.fLineDescent;
-}
-
 CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place,
                                       const CFX_WideString& sText,
                                       int32_t charset) {
@@ -2919,18 +2415,6 @@
   return nOldCharset;
 }
 
-void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle) {
-  ASSERT(!m_pGroupUndoItem);
-
-  m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
-}
-
-void CFX_Edit::EndGroupUndo() {
-  m_pGroupUndoItem->UpdateItems();
-  m_Undo.AddItem(m_pGroupUndoItem);
-  m_pGroupUndoItem = nullptr;
-}
-
 void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem) {
   if (m_pGroupUndoItem) {
     m_pGroupUndoItem->AddUndoItem(pEditUndoItem);
@@ -2939,10 +2423,6 @@
   }
 }
 
-void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem) {
-  m_Undo.AddItem(pUndoItem);
-}
-
 CFX_Edit_LineRectArray::CFX_Edit_LineRectArray() {}
 
 CFX_Edit_LineRectArray::~CFX_Edit_LineRectArray() {
@@ -3022,10 +2502,6 @@
   return BeginPos != EndPos;
 }
 
-FX_BOOL CFX_Edit_Select::operator!=(const CPVT_WordRange& wr) const {
-  return wr.BeginPos != BeginPos || wr.EndPos != EndPos;
-}
-
 CFX_Edit_RectArray::CFX_Edit_RectArray() {}
 
 CFX_Edit_RectArray::~CFX_Edit_RectArray() {
diff --git a/fpdfsdk/fxedit/include/fxet_edit.h b/fpdfsdk/fxedit/include/fxet_edit.h
index e0fca92..9ef2e64 100644
--- a/fpdfsdk/fxedit/include/fxet_edit.h
+++ b/fpdfsdk/fxedit/include/fxet_edit.h
@@ -24,47 +24,10 @@
 class CFX_SystemHandler;
 class IFX_Edit_UndoItem;
 
-enum EDIT_PROPS_E {
-  EP_LINELEADING,
-  EP_LINEINDENT,
-  EP_ALIGNMENT,
-  EP_FONTINDEX,
-  EP_FONTSIZE,
-  EP_WORDCOLOR,
-  EP_SCRIPTTYPE,
-  EP_UNDERLINE,
-  EP_CROSSOUT,
-  EP_CHARSPACE,
-  EP_HORZSCALE,
-  EP_BOLD,
-  EP_ITALIC
-};
-
 struct CFX_Edit_LineRect {
   CFX_Edit_LineRect(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine)
       : m_wrLine(wrLine), m_rcLine(rcLine) {}
 
-  FX_BOOL operator!=(const CFX_Edit_LineRect& linerect) const {
-    return FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;
-  }
-
-  FX_BOOL IsSameHeight(const CFX_Edit_LineRect& linerect) const {
-    return IsFloatZero((m_rcLine.top - m_rcLine.bottom) -
-                       (linerect.m_rcLine.top - linerect.m_rcLine.bottom));
-  }
-
-  FX_BOOL IsSameTop(const CFX_Edit_LineRect& linerect) const {
-    return IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);
-  }
-
-  FX_BOOL IsSameLeft(const CFX_Edit_LineRect& linerect) const {
-    return IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);
-  }
-
-  FX_BOOL IsSameRight(const CFX_Edit_LineRect& linerect) const {
-    return IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);
-  }
-
   CPVT_WordRange m_wrLine;
   CFX_FloatRect m_rcLine;
 };
@@ -132,7 +95,6 @@
 
   CPVT_WordRange ConvertToWordRange() const;
   FX_BOOL IsExist() const;
-  FX_BOOL operator!=(const CPVT_WordRange& wr) const;
 
   CPVT_WordPlace BeginPos, EndPos;
 };
@@ -150,18 +112,10 @@
   FX_BOOL CanUndo() const;
   FX_BOOL CanRedo() const;
   FX_BOOL IsModified() const;
-  FX_BOOL IsWorking() const;
 
   void Reset();
 
-  IFX_Edit_UndoItem* GetItem(int32_t nIndex);
-  int32_t GetItemCount() { return m_UndoItemStack.GetSize(); }
-  int32_t GetCurUndoPos() { return m_nCurUndoPos; }
-
  private:
-  void SetBufSize(int32_t nSize) { m_nBufSize = nSize; }
-  int32_t GetBufSize() { return m_nBufSize; }
-
   void RemoveHeads();
   void RemoveTails();
 
@@ -192,7 +146,6 @@
   CFX_WideString GetUndoTitle() override;
 
   void SetFirst(FX_BOOL bFirst);
-  FX_BOOL IsFirst();
   void SetLast(FX_BOOL bLast);
   FX_BOOL IsLast();
 
@@ -380,19 +333,6 @@
                        const CPVT_WordRange* pRange,
                        CFX_SystemHandler* pSystemHandler,
                        void* pFFLData);
-  static void DrawUnderline(CFX_RenderDevice* pDevice,
-                            CFX_Matrix* pUser2Device,
-                            CFX_Edit* pEdit,
-                            FX_COLORREF color,
-                            const CFX_FloatRect& rcClip,
-                            const CFX_FloatPoint& ptOffset,
-                            const CPVT_WordRange* pRange);
-  static void DrawRichEdit(CFX_RenderDevice* pDevice,
-                           CFX_Matrix* pUser2Device,
-                           CFX_Edit* pEdit,
-                           const CFX_FloatRect& rcClip,
-                           const CFX_FloatPoint& ptOffset,
-                           const CPVT_WordRange* pRange);
   static void GeneratePageObjects(
       CPDF_PageObjectHolder* pObjectHolder,
       CFX_Edit* pEdit,
@@ -400,17 +340,6 @@
       const CPVT_WordRange* pRange,
       FX_COLORREF crText,
       CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
-  static void GenerateRichPageObjects(
-      CPDF_PageObjectHolder* pObjectHolder,
-      CFX_Edit* pEdit,
-      const CFX_FloatPoint& ptOffset,
-      const CPVT_WordRange* pRange,
-      CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
-  static void GenerateUnderlineObjects(CPDF_PageObjectHolder* pObjectHolder,
-                                       CFX_Edit* pEdit,
-                                       const CFX_FloatPoint& ptOffset,
-                                       const CPVT_WordRange* pRange,
-                                       FX_COLORREF color);
 
   CFX_Edit();
   ~CFX_Edit();
@@ -421,7 +350,6 @@
 
   // Returns an iterator for the contents. Should not be released.
   CFX_Edit_Iterator* GetIterator();
-  CPDF_VariableText* GetVariableText();
   IPVT_FontMap* GetFontMap();
   void Initialize();
 
@@ -447,21 +375,6 @@
   void SetAutoScroll(FX_BOOL bAuto, FX_BOOL bPaint);
   void SetFontSize(FX_FLOAT fFontSize);
   void SetTextOverflow(FX_BOOL bAllowed, FX_BOOL bPaint);
-  FX_BOOL IsRichText() const;
-  void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE);
-  FX_BOOL SetRichFontSize(FX_FLOAT fFontSize);
-  FX_BOOL SetRichFontIndex(int32_t nFontIndex);
-  FX_BOOL SetRichTextColor(FX_COLORREF dwColor);
-  FX_BOOL SetRichTextScript(CPDF_VariableText::ScriptType nScriptType);
-  FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE);
-  FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE);
-  FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE);
-  FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE);
-  FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace);
-  FX_BOOL SetRichTextHorzScale(int32_t nHorzScale = 100);
-  FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading);
-  FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent);
-  FX_BOOL SetRichTextAlignment(int32_t nAlignment);
   void OnMouseDown(const CFX_FloatPoint& point, FX_BOOL bShift, FX_BOOL bCtrl);
   void OnMouseMove(const CFX_FloatPoint& point, FX_BOOL bShift, FX_BOOL bCtrl);
   void OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl);
@@ -481,10 +394,6 @@
   FX_BOOL Undo();
   int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const;
   CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
-  CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace& place) const;
-  CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const;
-  CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace& place) const;
-  CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace& place) const;
   CPVT_WordPlace SearchWordPlace(const CFX_FloatPoint& point) const;
   int32_t GetCaret() const;
   CPVT_WordPlace GetCaretWordPlace() const;
@@ -494,7 +403,6 @@
   uint16_t GetPasswordChar() const;
   CFX_FloatPoint GetScrollPos() const;
   int32_t GetCharArray() const;
-  CFX_FloatRect GetPlateRect() const;
   CFX_FloatRect GetContentRect() const;
   CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
   int32_t GetHorzScale() const;
@@ -506,7 +414,6 @@
   void SelectNone();
   FX_BOOL IsSelected() const;
   void Paint();
-  void EnableNotify(FX_BOOL bNotify);
   void EnableRefresh(FX_BOOL bRefresh);
   void RefreshWordRange(const CPVT_WordRange& wr);
   void SetCaret(int32_t nPos);
@@ -518,9 +425,7 @@
   FX_BOOL IsTextOverflow() const;
   FX_BOOL CanUndo() const;
   FX_BOOL CanRedo() const;
-  FX_BOOL IsModified() const;
   CPVT_WordRange GetVisibleWordRange() const;
-  void AddUndoItem(IFX_Edit_UndoItem* pUndoItem);
 
   FX_BOOL Empty();
 
@@ -573,30 +478,16 @@
   inline CFX_FloatPoint VTToEdit(const CFX_FloatPoint& point) const;
   inline CFX_FloatPoint EditToVT(const CFX_FloatPoint& point) const;
   inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
-  inline CFX_FloatRect EditToVT(const CFX_FloatRect& rect) const;
 
   void Refresh();
   void RefreshPushLineRects(const CPVT_WordRange& wr);
-  void RefreshPushRandomRects(const CPVT_WordRange& wr);
 
   void SetCaret(const CPVT_WordPlace& place);
   void SetCaretInfo();
   void SetCaretOrigin();
 
-  CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace& place) const;
-  CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1,
-                                  const CPVT_WordRange& wr2);
-
-  void BeginGroupUndo(const CFX_WideString& sTitle);
-  void EndGroupUndo();
   void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
 
-  void SetPageInfo(const CPVT_WordPlace& place);
-  CPVT_WordPlace SearchPageEndPlace(const CPVT_WordPlace& wpPageBegin,
-                                    const CFX_FloatPoint& point) const;
-  FX_FLOAT GetLineTop(const CPVT_WordPlace& place) const;
-  FX_FLOAT GetLineBottom(const CPVT_WordPlace& place) const;
-
  private:
   std::unique_ptr<CPDF_VariableText> m_pVT;
   CPWL_EditCtrl* m_pNotify;
@@ -630,18 +521,13 @@
   ~CFX_Edit_Iterator();
 
   FX_BOOL NextWord();
-  FX_BOOL NextLine();
-  FX_BOOL NextSection();
   FX_BOOL PrevWord();
-  FX_BOOL PrevLine();
-  FX_BOOL PrevSection();
   FX_BOOL GetWord(CPVT_Word& word) const;
   FX_BOOL GetLine(CPVT_Line& line) const;
   FX_BOOL GetSection(CPVT_Section& section) const;
   void SetAt(int32_t nWordIndex);
   void SetAt(const CPVT_WordPlace& place);
   const CPVT_WordPlace& GetAt() const;
-  CFX_Edit* GetEdit() const;
 
  private:
   CFX_Edit* m_pEdit;
