diff --git a/core/fpdfdoc/cpdf_variabletext.cpp b/core/fpdfdoc/cpdf_variabletext.cpp
index 427cd5d..3c71ed8 100644
--- a/core/fpdfdoc/cpdf_variabletext.cpp
+++ b/core/fpdfdoc/cpdf_variabletext.cpp
@@ -256,11 +256,9 @@
       m_fFontSize(0.0f),
       m_bInitial(FALSE),
       m_bRichText(FALSE),
-      m_pVTProvider(nullptr),
-      m_pVTIterator(nullptr) {}
+      m_pVTProvider(nullptr) {}
 
 CPDF_VariableText::~CPDF_VariableText() {
-  delete m_pVTIterator;
   ResetAll();
 }
 
@@ -1149,8 +1147,8 @@
 
 CPDF_VariableText::Iterator* CPDF_VariableText::GetIterator() {
   if (!m_pVTIterator)
-    m_pVTIterator = new CPDF_VariableText::Iterator(this);
-  return m_pVTIterator;
+    m_pVTIterator.reset(new CPDF_VariableText::Iterator(this));
+  return m_pVTIterator.get();
 }
 
 void CPDF_VariableText::SetProvider(CPDF_VariableText::Provider* pProvider) {
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 5ec9513..7fcd909 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -507,76 +507,73 @@
   CFX_ByteTextBuf sEditStream, sLineStream, sWords;
   CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
   int32_t nCurFontIndex = -1;
-  if (pIterator) {
-    pIterator->SetAt(0);
+  pIterator->SetAt(0);
 
-    CPVT_WordPlace oldplace;
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
-      if (bContinuous) {
-        if (place.LineCmp(oldplace) != 0) {
-          if (sWords.GetSize() > 0) {
-            sLineStream << GetWordRenderString(sWords.AsStringC());
-            sEditStream << sLineStream;
-            sLineStream.Clear();
-            sWords.Clear();
-          }
-          CPVT_Word word;
-          if (pIterator->GetWord(word)) {
-            ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
-                                   word.ptWord.y + ptOffset.y);
-          } else {
-            CPVT_Line line;
-            pIterator->GetLine(line);
-            ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x,
-                                   line.ptLine.y + ptOffset.y);
-          }
-          if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
-            sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
-                        << " Td\n";
-            ptOld = ptNew;
-          }
+  CPVT_WordPlace oldplace;
+  while (pIterator->NextWord()) {
+    CPVT_WordPlace place = pIterator->GetAt();
+    if (bContinuous) {
+      if (place.LineCmp(oldplace) != 0) {
+        if (sWords.GetSize() > 0) {
+          sLineStream << GetWordRenderString(sWords.AsStringC());
+          sEditStream << sLineStream;
+          sLineStream.Clear();
+          sWords.Clear();
         }
         CPVT_Word word;
         if (pIterator->GetWord(word)) {
-          if (word.nFontIndex != nCurFontIndex) {
-            if (sWords.GetSize() > 0) {
-              sLineStream << GetWordRenderString(sWords.AsStringC());
-              sWords.Clear();
-            }
-            sLineStream << GetFontSetString(pFontMap, word.nFontIndex,
-                                            word.fFontSize);
-            nCurFontIndex = word.nFontIndex;
-          }
-          sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word,
-                                     SubWord);
-        }
-        oldplace = place;
-      } else {
-        CPVT_Word word;
-        if (pIterator->GetWord(word)) {
           ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
                                  word.ptWord.y + ptOffset.y);
-          if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
-            sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
-                        << " Td\n";
-            ptOld = ptNew;
-          }
-          if (word.nFontIndex != nCurFontIndex) {
-            sEditStream << GetFontSetString(pFontMap, word.nFontIndex,
-                                            word.fFontSize);
-            nCurFontIndex = word.nFontIndex;
-          }
-          sEditStream << GetWordRenderString(
-              GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
+        } else {
+          CPVT_Line line;
+          pIterator->GetLine(line);
+          ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x,
+                                 line.ptLine.y + ptOffset.y);
+        }
+        if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+          sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
+                      << " Td\n";
+          ptOld = ptNew;
         }
       }
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        if (word.nFontIndex != nCurFontIndex) {
+          if (sWords.GetSize() > 0) {
+            sLineStream << GetWordRenderString(sWords.AsStringC());
+            sWords.Clear();
+          }
+          sLineStream << GetFontSetString(pFontMap, word.nFontIndex,
+                                          word.fFontSize);
+          nCurFontIndex = word.nFontIndex;
+        }
+        sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
+      }
+      oldplace = place;
+    } else {
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
+                               word.ptWord.y + ptOffset.y);
+        if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+          sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
+                      << " Td\n";
+          ptOld = ptNew;
+        }
+        if (word.nFontIndex != nCurFontIndex) {
+          sEditStream << GetFontSetString(pFontMap, word.nFontIndex,
+                                          word.fFontSize);
+          nCurFontIndex = word.nFontIndex;
+        }
+        sEditStream << GetWordRenderString(
+            GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
+      }
     }
-    if (sWords.GetSize() > 0) {
-      sLineStream << GetWordRenderString(sWords.AsStringC());
-      sEditStream << sLineStream;
-      sWords.Clear();
-    }
+  }
+  if (sWords.GetSize() > 0) {
+    sLineStream << GetWordRenderString(sWords.AsStringC());
+    sEditStream << sLineStream;
+    sWords.Clear();
   }
   return sEditStream.AsStringC();
 }
diff --git a/core/fpdfdoc/include/cpdf_variabletext.h b/core/fpdfdoc/include/cpdf_variabletext.h
index a14ad52..c9184bc 100644
--- a/core/fpdfdoc/include/cpdf_variabletext.h
+++ b/core/fpdfdoc/include/cpdf_variabletext.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_
 #define CORE_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_
 
+#include <memory>
+
 #include "core/fpdfdoc/cpvt_floatrect.h"
 #include "core/fpdfdoc/cpvt_lineinfo.h"
 #include "core/fpdfdoc/include/cpvt_line.h"
@@ -246,7 +248,7 @@
   FX_BOOL m_bInitial;
   FX_BOOL m_bRichText;
   CPDF_VariableText::Provider* m_pVTProvider;
-  CPDF_VariableText::Iterator* m_pVTIterator;
+  std::unique_ptr<CPDF_VariableText::Iterator> m_pVTIterator;
 };
 
 #endif  // CORE_FPDFDOC_INCLUDE_CPDF_VARIABLETEXT_H_
diff --git a/fpdfsdk/fxedit/fxet_ap.cpp b/fpdfsdk/fxedit/fxet_ap.cpp
index 1a36c80..262f1e7 100644
--- a/fpdfsdk/fxedit/fxet_ap.cpp
+++ b/fpdfsdk/fxedit/fxet_ap.cpp
@@ -70,93 +70,92 @@
   CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
   int32_t nCurFontIndex = -1;
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (pRange)
-      pIterator->SetAt(pRange->BeginPos);
-    else
-      pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (pRange)
+    pIterator->SetAt(pRange->BeginPos);
+  else
+    pIterator->SetAt(0);
 
-    CPVT_WordPlace oldplace;
+  CPVT_WordPlace oldplace;
 
-    while (pIterator->NextWord()) {
-      CPVT_WordPlace place = pIterator->GetAt();
+  while (pIterator->NextWord()) {
+    CPVT_WordPlace place = pIterator->GetAt();
 
-      if (pRange && place.WordCmp(pRange->EndPos) > 0)
-        break;
+    if (pRange && place.WordCmp(pRange->EndPos) > 0)
+      break;
 
-      if (bContinuous) {
-        if (place.LineCmp(oldplace) != 0) {
-          if (sWords.GetSize() > 0) {
-            sEditStream << GetWordRenderString(sWords.AsStringC());
-            sWords.Clear();
-          }
-
-          CPVT_Word word;
-          if (pIterator->GetWord(word)) {
-            ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
-                                   word.ptWord.y + ptOffset.y);
-          } else {
-            CPVT_Line line;
-            pIterator->GetLine(line);
-            ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x,
-                                   line.ptLine.y + ptOffset.y);
-          }
-
-          if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
-            sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
-                        << " Td\n";
-
-            ptOld = ptNew;
-          }
+    if (bContinuous) {
+      if (place.LineCmp(oldplace) != 0) {
+        if (sWords.GetSize() > 0) {
+          sEditStream << GetWordRenderString(sWords.AsStringC());
+          sWords.Clear();
         }
 
         CPVT_Word word;
         if (pIterator->GetWord(word)) {
-          if (word.nFontIndex != nCurFontIndex) {
-            if (sWords.GetSize() > 0) {
-              sEditStream << GetWordRenderString(sWords.AsStringC());
-              sWords.Clear();
-            }
-            sEditStream << GetFontSetString(pEdit->GetFontMap(),
-                                            word.nFontIndex, word.fFontSize);
-            nCurFontIndex = word.nFontIndex;
-          }
-
-          sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex,
-                                     word.Word, SubWord);
-        }
-
-        oldplace = place;
-      } else {
-        CPVT_Word word;
-        if (pIterator->GetWord(word)) {
           ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
                                  word.ptWord.y + ptOffset.y);
+        } else {
+          CPVT_Line line;
+          pIterator->GetLine(line);
+          ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x,
+                                 line.ptLine.y + ptOffset.y);
+        }
 
-          if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
-            sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
-                        << " Td\n";
-            ptOld = ptNew;
-          }
+        if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+          sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
+                      << " Td\n";
 
-          if (word.nFontIndex != nCurFontIndex) {
-            sEditStream << GetFontSetString(pEdit->GetFontMap(),
-                                            word.nFontIndex, word.fFontSize);
-            nCurFontIndex = word.nFontIndex;
-          }
-
-          sEditStream << GetWordRenderString(GetPDFWordString(
-              pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord));
+          ptOld = ptNew;
         }
       }
-    }
 
-    if (sWords.GetSize() > 0) {
-      sEditStream << GetWordRenderString(sWords.AsStringC());
-      sWords.Clear();
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        if (word.nFontIndex != nCurFontIndex) {
+          if (sWords.GetSize() > 0) {
+            sEditStream << GetWordRenderString(sWords.AsStringC());
+            sWords.Clear();
+          }
+          sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex,
+                                          word.fFontSize);
+          nCurFontIndex = word.nFontIndex;
+        }
+
+        sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex,
+                                   word.Word, SubWord);
+      }
+
+      oldplace = place;
+    } else {
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x,
+                               word.ptWord.y + ptOffset.y);
+
+        if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+          sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
+                      << " Td\n";
+          ptOld = ptNew;
+        }
+
+        if (word.nFontIndex != nCurFontIndex) {
+          sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex,
+                                          word.fFontSize);
+          nCurFontIndex = word.nFontIndex;
+        }
+
+        sEditStream << GetWordRenderString(GetPDFWordString(
+            pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord));
+      }
     }
   }
 
+  if (sWords.GetSize() > 0) {
+    sEditStream << GetWordRenderString(sWords.AsStringC());
+    sWords.Clear();
+  }
+
   CFX_ByteTextBuf sAppStream;
   if (sEditStream.GetSize() > 0) {
     int32_t nHorzScale = pEdit->GetHorzScale();
@@ -182,22 +181,21 @@
   CFX_ByteTextBuf sRet;
 
   if (pRange && pRange->IsExist()) {
-    if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-      pIterator->SetAt(pRange->BeginPos);
+    IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+    pIterator->SetAt(pRange->BeginPos);
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
+    while (pIterator->NextWord()) {
+      CPVT_WordPlace place = pIterator->GetAt();
 
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+      if (pRange && place.WordCmp(pRange->EndPos) > 0)
+        break;
 
-        CPVT_Word word;
-        CPVT_Line line;
-        if (pIterator->GetWord(word) && pIterator->GetLine(line)) {
-          sRet << word.ptWord.x + ptOffset.x << " "
-               << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " "
-               << line.fLineAscent - line.fLineDescent << " re\nf\n";
-        }
+      CPVT_Word word;
+      CPVT_Line line;
+      if (pIterator->GetWord(word) && pIterator->GetLine(line)) {
+        sRet << word.ptWord.x + ptOffset.x << " "
+             << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " "
+             << line.fLineAscent - line.fLineDescent << " re\nf\n";
       }
     }
   }
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index a02a2a0..d2abb17 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -748,16 +748,15 @@
 
 CFX_Edit::CFX_Edit(CPDF_VariableText* pVT)
     : m_pVT(pVT),
-      m_pNotify(NULL),
-      m_pOprNotify(NULL),
-      m_pVTProvide(NULL),
+      m_pNotify(nullptr),
+      m_pOprNotify(nullptr),
       m_wpCaret(-1, -1, -1),
       m_wpOldCaret(-1, -1, -1),
       m_SelState(),
       m_ptScrollPos(0, 0),
       m_ptRefreshScrollPos(0, 0),
       m_bEnableScroll(FALSE),
-      m_pIterator(NULL),
+      m_pIterator(nullptr),
       m_ptCaret(0.0f, 0.0f),
       m_Undo(kEditUndoMaxItems),
       m_nAlignment(0),
@@ -768,15 +767,11 @@
       m_bEnableUndo(TRUE),
       m_bNotify(TRUE),
       m_bOprNotify(FALSE),
-      m_pGroupUndoItem(NULL) {
+      m_pGroupUndoItem(nullptr) {
   ASSERT(pVT);
 }
 
 CFX_Edit::~CFX_Edit() {
-  delete m_pVTProvide;
-  m_pVTProvide = NULL;
-  delete m_pIterator;
-  m_pIterator = NULL;
   ASSERT(!m_pGroupUndoItem);
 }
 
@@ -787,8 +782,8 @@
 }
 
 void CFX_Edit::SetFontMap(IPVT_FontMap* pFontMap) {
-  delete m_pVTProvide;
-  m_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap));
+  m_pVTProvider.reset(new CFX_Edit_Provider(pFontMap));
+  m_pVT->SetProvider(m_pVTProvider.get());
 }
 
 void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify) {
@@ -801,9 +796,8 @@
 
 IFX_Edit_Iterator* CFX_Edit::GetIterator() {
   if (!m_pIterator)
-    m_pIterator = new CFX_Edit_Iterator(this, m_pVT->GetIterator());
-
-  return m_pIterator;
+    m_pIterator.reset(new CFX_Edit_Iterator(this, m_pVT->GetIterator()));
+  return m_pIterator.get();
 }
 
 CPDF_VariableText* CFX_Edit::GetVariableText() {
@@ -811,10 +805,7 @@
 }
 
 IPVT_FontMap* CFX_Edit::GetFontMap() {
-  if (m_pVTProvide)
-    return m_pVTProvide->GetFontMap();
-
-  return NULL;
+  return m_pVTProvider ? m_pVTProvider->GetFontMap() : nullptr;
 }
 
 void CFX_Edit::SetPlateRect(const CFX_FloatRect& rect, FX_BOOL bPaint) {
@@ -980,33 +971,24 @@
 CFX_WideString CFX_Edit::GetText() const {
   CFX_WideString swRet;
 
-  if (m_pVT->IsValid()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      FX_BOOL bRich = m_pVT->IsRichText();
+  if (!m_pVT->IsValid())
+    return swRet;
 
-      pIterator->SetAt(0);
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  pIterator->SetAt(0);
 
-      CPVT_Word wordinfo;
-      CPVT_WordPlace oldplace = pIterator->GetAt();
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
+  CPVT_Word wordinfo;
+  CPVT_WordPlace oldplace = pIterator->GetAt();
+  while (pIterator->NextWord()) {
+    CPVT_WordPlace place = pIterator->GetAt();
 
-        if (pIterator->GetWord(wordinfo)) {
-          if (bRich) {
-            swRet += wordinfo.Word;
-          } else {
-            swRet += wordinfo.Word;
-          }
-        }
+    if (pIterator->GetWord(wordinfo))
+      swRet += wordinfo.Word;
 
-        if (oldplace.SecCmp(place) != 0) {
-          swRet += 0x0D;
-          swRet += 0x0A;
-        }
+    if (oldplace.SecCmp(place) != 0)
+      swRet += L"\r\n";
 
-        oldplace = place;
-      }
-    }
+    oldplace = place;
   }
 
   return swRet;
@@ -1015,38 +997,29 @@
 CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange& range) const {
   CFX_WideString swRet;
 
-  if (m_pVT->IsValid()) {
-    FX_BOOL bRich = m_pVT->IsRichText();
+  if (!m_pVT->IsValid())
+    return swRet;
 
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      CPVT_WordRange wrTemp = range;
-      m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-      m_pVT->UpdateWordPlace(wrTemp.EndPos);
-      pIterator->SetAt(wrTemp.BeginPos);
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordRange wrTemp = range;
+  m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+  m_pVT->UpdateWordPlace(wrTemp.EndPos);
+  pIterator->SetAt(wrTemp.BeginPos);
 
-      CPVT_Word wordinfo;
-      CPVT_WordPlace oldplace = wrTemp.BeginPos;
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (place.WordCmp(wrTemp.EndPos) > 0)
-          break;
+  CPVT_Word wordinfo;
+  CPVT_WordPlace oldplace = wrTemp.BeginPos;
+  while (pIterator->NextWord()) {
+    CPVT_WordPlace place = pIterator->GetAt();
+    if (place.WordCmp(wrTemp.EndPos) > 0)
+      break;
 
-        if (pIterator->GetWord(wordinfo)) {
-          if (bRich) {
-            swRet += wordinfo.Word;
-          } else {
-            swRet += wordinfo.Word;
-          }
-        }
+    if (pIterator->GetWord(wordinfo))
+      swRet += wordinfo.Word;
 
-        if (oldplace.SecCmp(place) != 0) {
-          swRet += 0x0D;
-          swRet += 0x0A;
-        }
+    if (oldplace.SecCmp(place) != 0)
+      swRet += L"\r\n";
 
-        oldplace = place;
-      }
-    }
+    oldplace = place;
   }
 
   return swRet;
@@ -1061,15 +1034,14 @@
 }
 
 int32_t CFX_Edit::GetTotalLines() const {
-  int32_t nLines = 0;
+  int32_t nLines = 1;
 
-  if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-    pIterator->SetAt(0);
-    while (pIterator->NextLine())
-      nLines++;
-  }
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  pIterator->SetAt(0);
+  while (pIterator->NextLine())
+    ++nLines;
 
-  return nLines + 1;
+  return nLines;
 }
 
 CPVT_WordRange CFX_Edit::GetSelectWordRange() const {
@@ -1190,39 +1162,37 @@
 FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps,
                                    const CPVT_SecProps* pSecProps,
                                    const CPVT_WordProps* pWordProps) {
-  FX_BOOL bSet = FALSE;
-  FX_BOOL bSet1, bSet2;
-  if (m_pVT->IsValid() && m_pVT->IsRichText()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
+  if (!m_pVT->IsValid() || !m_pVT->IsRichText())
+    return FALSE;
 
-      m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-      m_pVT->UpdateWordPlace(wrTemp.EndPos);
-      pIterator->SetAt(wrTemp.BeginPos);
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
 
-      BeginGroupUndo(L"");
-      bSet = SetSecProps(eProps, wrTemp.BeginPos, pSecProps, pWordProps, wrTemp,
-                         TRUE);
+  m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+  m_pVT->UpdateWordPlace(wrTemp.EndPos);
+  pIterator->SetAt(wrTemp.BeginPos);
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (place.WordCmp(wrTemp.EndPos) > 0)
-          break;
-        bSet1 = SetSecProps(eProps, place, pSecProps, pWordProps, wrTemp, TRUE);
-        bSet2 = SetWordProps(eProps, place, pWordProps, wrTemp, TRUE);
+  BeginGroupUndo(L"");
+  FX_BOOL bSet =
+      SetSecProps(eProps, wrTemp.BeginPos, pSecProps, pWordProps, wrTemp, TRUE);
 
-        if (!bSet)
-          bSet = (bSet1 || bSet2);
-      }
+  while (pIterator->NextWord()) {
+    CPVT_WordPlace place = pIterator->GetAt();
+    if (place.WordCmp(wrTemp.EndPos) > 0)
+      break;
+    FX_BOOL bSet1 =
+        SetSecProps(eProps, place, pSecProps, pWordProps, wrTemp, TRUE);
+    FX_BOOL bSet2 = SetWordProps(eProps, place, pWordProps, wrTemp, TRUE);
 
-      EndGroupUndo();
-
-      if (bSet) {
-        PaintSetProps(eProps, wrTemp);
-      }
-    }
+    if (!bSet)
+      bSet = (bSet1 || bSet2);
   }
 
+  EndGroupUndo();
+
+  if (bSet)
+    PaintSetProps(eProps, wrTemp);
+
   return bSet;
 }
 
@@ -1268,178 +1238,172 @@
                               const CPVT_WordProps* pWordProps,
                               const CPVT_WordRange& wr,
                               FX_BOOL bAddUndo) {
-  if (m_pVT->IsValid() && m_pVT->IsRichText()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      FX_BOOL bSet = FALSE;
-      CPVT_Section secinfo;
-      CPVT_Section OldSecinfo;
+  if (!m_pVT->IsValid() || !m_pVT->IsRichText())
+    return FALSE;
 
-      CPVT_WordPlace oldplace = pIterator->GetAt();
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  FX_BOOL bSet = FALSE;
+  CPVT_Section secinfo;
+  CPVT_Section OldSecinfo;
 
-      if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT ||
-          eProps == EP_ALIGNMENT) {
-        if (pSecProps) {
-          pIterator->SetAt(place);
-          if (pIterator->GetSection(secinfo)) {
-            if (bAddUndo)
-              OldSecinfo = secinfo;
+  CPVT_WordPlace oldplace = pIterator->GetAt();
 
-            switch (eProps) {
-              case EP_LINELEADING:
-                if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,
-                                          pSecProps->fLineLeading)) {
-                  secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_LINEINDENT:
-                if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,
-                                          pSecProps->fLineIndent)) {
-                  secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_ALIGNMENT:
-                if (secinfo.SecProps.nAlignment != pSecProps->nAlignment) {
-                  secinfo.SecProps.nAlignment = pSecProps->nAlignment;
-                  bSet = TRUE;
-                }
-                break;
-              default:
-                break;
+  if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT ||
+      eProps == EP_ALIGNMENT) {
+    if (pSecProps) {
+      pIterator->SetAt(place);
+      if (pIterator->GetSection(secinfo)) {
+        if (bAddUndo)
+          OldSecinfo = secinfo;
+
+        switch (eProps) {
+          case EP_LINELEADING:
+            if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,
+                                      pSecProps->fLineLeading)) {
+              secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
+              bSet = TRUE;
             }
-          }
-        }
-      } else {
-        if (pWordProps && place == m_pVT->GetSectionBeginPlace(place)) {
-          pIterator->SetAt(place);
-          if (pIterator->GetSection(secinfo)) {
-            if (bAddUndo)
-              OldSecinfo = secinfo;
-
-            switch (eProps) {
-              case EP_FONTINDEX:
-                if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
-                  secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_FONTSIZE:
-                if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,
-                                          pWordProps->fFontSize)) {
-                  secinfo.WordProps.fFontSize = pWordProps->fFontSize;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_WORDCOLOR:
-                if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
-                  secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_SCRIPTTYPE:
-                if (secinfo.WordProps.nScriptType != pWordProps->nScriptType) {
-                  secinfo.WordProps.nScriptType = pWordProps->nScriptType;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_CHARSPACE:
-                if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,
-                                          pWordProps->fCharSpace)) {
-                  secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_HORZSCALE:
-                if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
-                  secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
-                  bSet = TRUE;
-                }
-                break;
-              case EP_UNDERLINE:
-                if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
-                  if ((secinfo.WordProps.nWordStyle &
-                       PVTWORD_STYLE_UNDERLINE) == 0) {
-                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
-                    bSet = TRUE;
-                  }
-                } else {
-                  if ((secinfo.WordProps.nWordStyle &
-                       PVTWORD_STYLE_UNDERLINE) != 0) {
-                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
-                    bSet = TRUE;
-                  }
-                }
-                break;
-              case EP_CROSSOUT:
-                if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) ==
-                      0) {
-                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
-                    bSet = TRUE;
-                  }
-                } else {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) !=
-                      0) {
-                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
-                    bSet = TRUE;
-                  }
-                }
-                break;
-              case EP_BOLD:
-                if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) ==
-                      0) {
-                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
-                    bSet = TRUE;
-                  }
-                } else {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) !=
-                      0) {
-                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
-                    bSet = TRUE;
-                  }
-                }
-                break;
-              case EP_ITALIC:
-                if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) ==
-                      0) {
-                    secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
-                    bSet = TRUE;
-                  }
-                } else {
-                  if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) !=
-                      0) {
-                    secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
-                    bSet = TRUE;
-                  }
-                }
-                break;
-              default:
-                break;
+            break;
+          case EP_LINEINDENT:
+            if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,
+                                      pSecProps->fLineIndent)) {
+              secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
+              bSet = TRUE;
             }
-          }
+            break;
+          case EP_ALIGNMENT:
+            if (secinfo.SecProps.nAlignment != pSecProps->nAlignment) {
+              secinfo.SecProps.nAlignment = pSecProps->nAlignment;
+              bSet = TRUE;
+            }
+            break;
+          default:
+            break;
         }
       }
+    }
+  } else {
+    if (pWordProps && place == m_pVT->GetSectionBeginPlace(place)) {
+      pIterator->SetAt(place);
+      if (pIterator->GetSection(secinfo)) {
+        if (bAddUndo)
+          OldSecinfo = secinfo;
 
-      if (bSet) {
-        pIterator->SetSection(secinfo);
-
-        if (bAddUndo && m_bEnableUndo) {
-          AddEditUndoItem(new CFXEU_SetSecProps(
-              this, place, eProps, OldSecinfo.SecProps, OldSecinfo.WordProps,
-              secinfo.SecProps, secinfo.WordProps, wr));
+        switch (eProps) {
+          case EP_FONTINDEX:
+            if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
+              secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
+              bSet = TRUE;
+            }
+            break;
+          case EP_FONTSIZE:
+            if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,
+                                      pWordProps->fFontSize)) {
+              secinfo.WordProps.fFontSize = pWordProps->fFontSize;
+              bSet = TRUE;
+            }
+            break;
+          case EP_WORDCOLOR:
+            if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
+              secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+              bSet = TRUE;
+            }
+            break;
+          case EP_SCRIPTTYPE:
+            if (secinfo.WordProps.nScriptType != pWordProps->nScriptType) {
+              secinfo.WordProps.nScriptType = pWordProps->nScriptType;
+              bSet = TRUE;
+            }
+            break;
+          case EP_CHARSPACE:
+            if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,
+                                      pWordProps->fCharSpace)) {
+              secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+              bSet = TRUE;
+            }
+            break;
+          case EP_HORZSCALE:
+            if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
+              secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+              bSet = TRUE;
+            }
+            break;
+          case EP_UNDERLINE:
+            if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) ==
+                  0) {
+                secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+                bSet = TRUE;
+              }
+            } else {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) !=
+                  0) {
+                secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+                bSet = TRUE;
+              }
+            }
+            break;
+          case EP_CROSSOUT:
+            if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) ==
+                  0) {
+                secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+                bSet = TRUE;
+              }
+            } else {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) !=
+                  0) {
+                secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+                bSet = TRUE;
+              }
+            }
+            break;
+          case EP_BOLD:
+            if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0) {
+                secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+                bSet = TRUE;
+              }
+            } else {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0) {
+                secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+                bSet = TRUE;
+              }
+            }
+            break;
+          case EP_ITALIC:
+            if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0) {
+                secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+                bSet = TRUE;
+              }
+            } else {
+              if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0) {
+                secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+                bSet = TRUE;
+              }
+            }
+            break;
+          default:
+            break;
         }
       }
-
-      pIterator->SetAt(oldplace);
-
-      return bSet;
     }
   }
 
-  return FALSE;
+  if (bSet) {
+    pIterator->SetSection(secinfo);
+
+    if (bAddUndo && m_bEnableUndo) {
+      AddEditUndoItem(new CFXEU_SetSecProps(
+          this, place, eProps, OldSecinfo.SecProps, OldSecinfo.WordProps,
+          secinfo.SecProps, secinfo.WordProps, wr));
+    }
+  }
+
+  pIterator->SetAt(oldplace);
+
+  return bSet;
 }
 
 FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps,
@@ -1447,142 +1411,135 @@
                                const CPVT_WordProps* pWordProps,
                                const CPVT_WordRange& wr,
                                FX_BOOL bAddUndo) {
-  if (m_pVT->IsValid() && m_pVT->IsRichText()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      FX_BOOL bSet = FALSE;
-      CPVT_Word wordinfo;
-      CPVT_Word OldWordinfo;
+  if (!m_pVT->IsValid() || !m_pVT->IsRichText())
+    return FALSE;
 
-      CPVT_WordPlace oldplace = pIterator->GetAt();
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  FX_BOOL bSet = FALSE;
+  CPVT_Word wordinfo;
+  CPVT_Word OldWordinfo;
 
-      if (pWordProps) {
-        pIterator->SetAt(place);
-        if (pIterator->GetWord(wordinfo)) {
-          if (bAddUndo)
-            OldWordinfo = wordinfo;
+  CPVT_WordPlace oldplace = pIterator->GetAt();
 
-          switch (eProps) {
-            case EP_FONTINDEX:
-              if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
-                if (IPVT_FontMap* pFontMap = GetFontMap()) {
-                  wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(
-                      wordinfo.Word, wordinfo.nCharset, pWordProps->nFontIndex);
-                }
-                bSet = TRUE;
-              }
-              break;
-            case EP_FONTSIZE:
-              if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,
-                                        pWordProps->fFontSize)) {
-                wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
-                bSet = TRUE;
-              }
-              break;
-            case EP_WORDCOLOR:
-              if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
-                wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
-                bSet = TRUE;
-              }
-              break;
-            case EP_SCRIPTTYPE:
-              if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType) {
-                wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
-                bSet = TRUE;
-              }
-              break;
-            case EP_CHARSPACE:
-              if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,
-                                        pWordProps->fCharSpace)) {
-                wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
-                bSet = TRUE;
-              }
-              break;
-            case EP_HORZSCALE:
-              if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
-                wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
-                bSet = TRUE;
-              }
-              break;
-            case EP_UNDERLINE:
-              if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) ==
-                    0) {
-                  wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
-                  bSet = TRUE;
-                }
-              } else {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) !=
-                    0) {
-                  wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
-                  bSet = TRUE;
-                }
-              }
-              break;
-            case EP_CROSSOUT:
-              if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) ==
-                    0) {
-                  wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
-                  bSet = TRUE;
-                }
-              } else {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) !=
-                    0) {
-                  wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
-                  bSet = TRUE;
-                }
-              }
-              break;
-            case EP_BOLD:
-              if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0) {
-                  wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
-                  bSet = TRUE;
-                }
-              } else {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0) {
-                  wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
-                  bSet = TRUE;
-                }
-              }
-              break;
-            case EP_ITALIC:
-              if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) ==
-                    0) {
-                  wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
-                  bSet = TRUE;
-                }
-              } else {
-                if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) !=
-                    0) {
-                  wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
-                  bSet = TRUE;
-                }
-              }
-              break;
-            default:
-              break;
+  if (pWordProps) {
+    pIterator->SetAt(place);
+    if (pIterator->GetWord(wordinfo)) {
+      if (bAddUndo)
+        OldWordinfo = wordinfo;
+
+      switch (eProps) {
+        case EP_FONTINDEX:
+          if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
+            if (IPVT_FontMap* pFontMap = GetFontMap()) {
+              wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(
+                  wordinfo.Word, wordinfo.nCharset, pWordProps->nFontIndex);
+            }
+            bSet = TRUE;
           }
-        }
+          break;
+        case EP_FONTSIZE:
+          if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,
+                                    pWordProps->fFontSize)) {
+            wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
+            bSet = TRUE;
+          }
+          break;
+        case EP_WORDCOLOR:
+          if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
+            wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+            bSet = TRUE;
+          }
+          break;
+        case EP_SCRIPTTYPE:
+          if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType) {
+            wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
+            bSet = TRUE;
+          }
+          break;
+        case EP_CHARSPACE:
+          if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,
+                                    pWordProps->fCharSpace)) {
+            wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+            bSet = TRUE;
+          }
+          break;
+        case EP_HORZSCALE:
+          if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
+            wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+            bSet = TRUE;
+          }
+          break;
+        case EP_UNDERLINE:
+          if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) ==
+                0) {
+              wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+              bSet = TRUE;
+            }
+          } else {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) !=
+                0) {
+              wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+              bSet = TRUE;
+            }
+          }
+          break;
+        case EP_CROSSOUT:
+          if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0) {
+              wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+              bSet = TRUE;
+            }
+          } else {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0) {
+              wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+              bSet = TRUE;
+            }
+          }
+          break;
+        case EP_BOLD:
+          if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0) {
+              wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+              bSet = TRUE;
+            }
+          } else {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0) {
+              wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+              bSet = TRUE;
+            }
+          }
+          break;
+        case EP_ITALIC:
+          if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0) {
+              wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+              bSet = TRUE;
+            }
+          } else {
+            if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0) {
+              wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+              bSet = TRUE;
+            }
+          }
+          break;
+        default:
+          break;
       }
-
-      if (bSet) {
-        pIterator->SetWord(wordinfo);
-
-        if (bAddUndo && m_bEnableUndo) {
-          AddEditUndoItem(new CFXEU_SetWordProps(this, place, eProps,
-                                                 OldWordinfo.WordProps,
-                                                 wordinfo.WordProps, wr));
-        }
-      }
-
-      pIterator->SetAt(oldplace);
-      return bSet;
     }
   }
 
-  return FALSE;
+  if (bSet) {
+    pIterator->SetWord(wordinfo);
+
+    if (bAddUndo && m_bEnableUndo) {
+      AddEditUndoItem(new CFXEU_SetWordProps(
+          this, place, eProps, OldWordinfo.WordProps, wordinfo.WordProps, wr));
+    }
+  }
+
+  pIterator->SetAt(oldplace);
+  return bSet;
 }
 
 void CFX_Edit::SetText(const FX_WCHAR* text,
@@ -1918,52 +1875,52 @@
 void CFX_Edit::ScrollToCaret() {
   SetScrollLimit();
 
-  if (m_pVT->IsValid()) {
-    CFX_FloatPoint ptHead(0, 0);
-    CFX_FloatPoint ptFoot(0, 0);
+  if (!m_pVT->IsValid())
+    return;
 
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      pIterator->SetAt(m_wpCaret);
+  CFX_FloatPoint ptHead(0, 0);
+  CFX_FloatPoint ptFoot(0, 0);
 
-      CPVT_Word word;
-      CPVT_Line line;
-      if (pIterator->GetWord(word)) {
-        ptHead.x = word.ptWord.x + word.fWidth;
-        ptHead.y = word.ptWord.y + word.fAscent;
-        ptFoot.x = word.ptWord.x + word.fWidth;
-        ptFoot.y = word.ptWord.y + word.fDescent;
-      } else if (pIterator->GetLine(line)) {
-        ptHead.x = line.ptLine.x;
-        ptHead.y = line.ptLine.y + line.fLineAscent;
-        ptFoot.x = line.ptLine.x;
-        ptFoot.y = line.ptLine.y + line.fLineDescent;
-      }
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  pIterator->SetAt(m_wpCaret);
+
+  CPVT_Word word;
+  CPVT_Line line;
+  if (pIterator->GetWord(word)) {
+    ptHead.x = word.ptWord.x + word.fWidth;
+    ptHead.y = word.ptWord.y + word.fAscent;
+    ptFoot.x = word.ptWord.x + word.fWidth;
+    ptFoot.y = word.ptWord.y + word.fDescent;
+  } else if (pIterator->GetLine(line)) {
+    ptHead.x = line.ptLine.x;
+    ptHead.y = line.ptLine.y + line.fLineAscent;
+    ptFoot.x = line.ptLine.x;
+    ptFoot.y = line.ptLine.y + line.fLineDescent;
+  }
+
+  CFX_FloatPoint ptHeadEdit = VTToEdit(ptHead);
+  CFX_FloatPoint ptFootEdit = VTToEdit(ptFoot);
+
+  CFX_FloatRect rcPlate = m_pVT->GetPlateRect();
+
+  if (!FX_EDIT_IsFloatEqual(rcPlate.left, rcPlate.right)) {
+    if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
+        FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left)) {
+      SetScrollPosX(ptHead.x);
+    } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right)) {
+      SetScrollPosX(ptHead.x - rcPlate.Width());
     }
+  }
 
-    CFX_FloatPoint ptHeadEdit = VTToEdit(ptHead);
-    CFX_FloatPoint ptFootEdit = VTToEdit(ptFoot);
-
-    CFX_FloatRect rcPlate = m_pVT->GetPlateRect();
-
-    if (!FX_EDIT_IsFloatEqual(rcPlate.left, rcPlate.right)) {
-      if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
-          FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left)) {
-        SetScrollPosX(ptHead.x);
-      } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right)) {
-        SetScrollPosX(ptHead.x - rcPlate.Width());
+  if (!FX_EDIT_IsFloatEqual(rcPlate.top, rcPlate.bottom)) {
+    if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
+        FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom)) {
+      if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top)) {
+        SetScrollPosY(ptFoot.y + rcPlate.Height());
       }
-    }
-
-    if (!FX_EDIT_IsFloatEqual(rcPlate.top, rcPlate.bottom)) {
-      if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
-          FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom)) {
-        if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top)) {
-          SetScrollPosY(ptFoot.y + rcPlate.Height());
-        }
-      } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top)) {
-        if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom)) {
-          SetScrollPosY(ptHead.y);
-        }
+    } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top)) {
+      if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom)) {
+        SetScrollPosY(ptHead.y);
       }
     }
   }
@@ -1995,129 +1952,128 @@
 }
 
 void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange& wr) {
-  if (m_pVT->IsValid()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      CPVT_WordPlace wpBegin = wr.BeginPos;
-      m_pVT->UpdateWordPlace(wpBegin);
-      CPVT_WordPlace wpEnd = wr.EndPos;
-      m_pVT->UpdateWordPlace(wpEnd);
-      pIterator->SetAt(wpBegin);
+  if (!m_pVT->IsValid())
+    return;
 
-      CPVT_Line lineinfo;
-      do {
-        if (!pIterator->GetLine(lineinfo))
-          break;
-        if (lineinfo.lineplace.LineCmp(wpEnd) > 0)
-          break;
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordPlace wpBegin = wr.BeginPos;
+  m_pVT->UpdateWordPlace(wpBegin);
+  CPVT_WordPlace wpEnd = wr.EndPos;
+  m_pVT->UpdateWordPlace(wpEnd);
+  pIterator->SetAt(wpBegin);
 
-        CFX_FloatRect rcLine(lineinfo.ptLine.x,
-                             lineinfo.ptLine.y + lineinfo.fLineDescent,
-                             lineinfo.ptLine.x + lineinfo.fLineWidth,
-                             lineinfo.ptLine.y + lineinfo.fLineAscent);
+  CPVT_Line lineinfo;
+  do {
+    if (!pIterator->GetLine(lineinfo))
+      break;
+    if (lineinfo.lineplace.LineCmp(wpEnd) > 0)
+      break;
 
-        m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace, lineinfo.lineEnd),
-                       VTToEdit(rcLine));
-      } while (pIterator->NextLine());
-    }
-  }
+    CFX_FloatRect rcLine(lineinfo.ptLine.x,
+                         lineinfo.ptLine.y + lineinfo.fLineDescent,
+                         lineinfo.ptLine.x + lineinfo.fLineWidth,
+                         lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+    m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace, lineinfo.lineEnd),
+                   VTToEdit(rcLine));
+  } while (pIterator->NextLine());
 }
 
 void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange& wr) {
-  if (m_pVT->IsValid()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      CPVT_WordRange wrTemp = wr;
+  if (!m_pVT->IsValid())
+    return;
 
-      m_pVT->UpdateWordPlace(wrTemp.BeginPos);
-      m_pVT->UpdateWordPlace(wrTemp.EndPos);
-      pIterator->SetAt(wrTemp.BeginPos);
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordRange wrTemp = wr;
 
-      CPVT_Word wordinfo;
-      CPVT_Line lineinfo;
-      CPVT_WordPlace place;
+  m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+  m_pVT->UpdateWordPlace(wrTemp.EndPos);
+  pIterator->SetAt(wrTemp.BeginPos);
 
-      while (pIterator->NextWord()) {
-        place = pIterator->GetAt();
-        if (place.WordCmp(wrTemp.EndPos) > 0)
-          break;
+  CPVT_Word wordinfo;
+  CPVT_Line lineinfo;
+  CPVT_WordPlace place;
 
-        pIterator->GetWord(wordinfo);
-        pIterator->GetLine(lineinfo);
+  while (pIterator->NextWord()) {
+    place = pIterator->GetAt();
+    if (place.WordCmp(wrTemp.EndPos) > 0)
+      break;
 
-        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);
+    pIterator->GetWord(wordinfo);
+    pIterator->GetLine(lineinfo);
 
-          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);
+    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(rcLine));
+      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);
 
-          pIterator->NextLine();
-        }
-      }
+      m_Refresh.AddRefresh(VTToEdit(rcLine));
+
+      pIterator->NextLine();
     }
   }
 }
 
 void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr) {
-  if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-    CPVT_WordRange wrTemp = wr;
+  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);
+  m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+  m_pVT->UpdateWordPlace(wrTemp.EndPos);
+  pIterator->SetAt(wrTemp.BeginPos);
 
-    CPVT_Word wordinfo;
-    CPVT_Line lineinfo;
-    CPVT_WordPlace place;
+  CPVT_Word wordinfo;
+  CPVT_Line lineinfo;
+  CPVT_WordPlace place;
 
-    while (pIterator->NextWord()) {
-      place = pIterator->GetAt();
-      if (place.WordCmp(wrTemp.EndPos) > 0)
-        break;
+  while (pIterator->NextWord()) {
+    place = pIterator->GetAt();
+    if (place.WordCmp(wrTemp.EndPos) > 0)
+      break;
 
-      pIterator->GetWord(wordinfo);
-      pIterator->GetLine(lineinfo);
+    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);
+    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);
 
-        if (m_bNotify && m_pNotify) {
-          if (!m_bNotifyFlag) {
-            m_bNotifyFlag = TRUE;
-            CFX_FloatRect rcRefresh = VTToEdit(rcWord);
-            m_pNotify->IOnInvalidateRect(&rcRefresh);
-            m_bNotifyFlag = FALSE;
-          }
+      if (m_bNotify && m_pNotify) {
+        if (!m_bNotifyFlag) {
+          m_bNotifyFlag = TRUE;
+          CFX_FloatRect rcRefresh = VTToEdit(rcWord);
+          m_pNotify->IOnInvalidateRect(&rcRefresh);
+          m_bNotifyFlag = FALSE;
         }
-      } else {
-        CFX_FloatRect rcLine(lineinfo.ptLine.x,
-                             lineinfo.ptLine.y + lineinfo.fLineDescent,
-                             lineinfo.ptLine.x + lineinfo.fLineWidth,
-                             lineinfo.ptLine.y + lineinfo.fLineAscent);
-
-        if (m_bNotify && m_pNotify) {
-          if (!m_bNotifyFlag) {
-            m_bNotifyFlag = TRUE;
-            CFX_FloatRect rcRefresh = VTToEdit(rcLine);
-            m_pNotify->IOnInvalidateRect(&rcRefresh);
-            m_bNotifyFlag = FALSE;
-          }
-        }
-
-        pIterator->NextLine();
       }
+    } else {
+      CFX_FloatRect rcLine(lineinfo.ptLine.x,
+                           lineinfo.ptLine.y + lineinfo.fLineDescent,
+                           lineinfo.ptLine.x + lineinfo.fLineWidth,
+                           lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+      if (m_bNotify && m_pNotify) {
+        if (!m_bNotifyFlag) {
+          m_bNotifyFlag = TRUE;
+          CFX_FloatRect rcRefresh = VTToEdit(rcLine);
+          m_pNotify->IOnInvalidateRect(&rcRefresh);
+          m_bNotifyFlag = FALSE;
+        }
+      }
+
+      pIterator->NextLine();
     }
   }
 }
@@ -2132,21 +2088,20 @@
     if (!m_bNotifyFlag) {
       CFX_FloatPoint ptHead(0.0f, 0.0f), ptFoot(0.0f, 0.0f);
 
-      if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-        pIterator->SetAt(m_wpCaret);
-        CPVT_Word word;
-        CPVT_Line line;
-        if (pIterator->GetWord(word)) {
-          ptHead.x = word.ptWord.x + word.fWidth;
-          ptHead.y = word.ptWord.y + word.fAscent;
-          ptFoot.x = word.ptWord.x + word.fWidth;
-          ptFoot.y = word.ptWord.y + word.fDescent;
-        } else if (pIterator->GetLine(line)) {
-          ptHead.x = line.ptLine.x;
-          ptHead.y = line.ptLine.y + line.fLineAscent;
-          ptFoot.x = line.ptLine.x;
-          ptFoot.y = line.ptLine.y + line.fLineDescent;
-        }
+      CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+      pIterator->SetAt(m_wpCaret);
+      CPVT_Word word;
+      CPVT_Line line;
+      if (pIterator->GetWord(word)) {
+        ptHead.x = word.ptWord.x + word.fWidth;
+        ptHead.y = word.ptWord.y + word.fAscent;
+        ptFoot.x = word.ptWord.x + word.fWidth;
+        ptFoot.y = word.ptWord.y + word.fDescent;
+      } else if (pIterator->GetLine(line)) {
+        ptHead.x = line.ptLine.x;
+        ptHead.y = line.ptLine.y + line.fLineAscent;
+        ptFoot.x = line.ptLine.x;
+        ptFoot.y = line.ptLine.y + line.fLineDescent;
       }
 
       m_bNotifyFlag = TRUE;
@@ -2163,30 +2118,29 @@
   if (m_wpCaret == m_wpOldCaret)
     return;
 
-  if (m_bNotify && m_pVT->IsRichText() && m_pNotify) {
-    CPVT_SecProps SecProps;
-    CPVT_WordProps WordProps;
+  if (!m_bNotify || !m_pVT->IsRichText() || !m_pNotify)
+    return;
 
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      pIterator->SetAt(m_wpCaret);
-      CPVT_Word word;
-      CPVT_Section section;
+  CPVT_SecProps SecProps;
+  CPVT_WordProps WordProps;
 
-      if (pIterator->GetSection(section)) {
-        SecProps = section.SecProps;
-        WordProps = section.WordProps;
-      }
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  pIterator->SetAt(m_wpCaret);
+  CPVT_Word word;
+  CPVT_Section section;
 
-      if (pIterator->GetWord(word)) {
-        WordProps = word.WordProps;
-      }
-    }
+  if (pIterator->GetSection(section)) {
+    SecProps = section.SecProps;
+    WordProps = section.WordProps;
+  }
 
-    if (!m_bNotifyFlag) {
-      m_bNotifyFlag = TRUE;
-      m_pNotify->IOnCaretChange(SecProps, WordProps);
-      m_bNotifyFlag = FALSE;
-    }
+  if (pIterator->GetWord(word))
+    WordProps = word.WordProps;
+
+  if (!m_bNotifyFlag) {
+    m_bNotifyFlag = TRUE;
+    m_pNotify->IOnCaretChange(SecProps, WordProps);
+    m_bNotifyFlag = FALSE;
   }
 }
 
@@ -2550,11 +2504,10 @@
     CPVT_Word word;
 
     if (bAddUndo) {
-      if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-        pIterator->SetAt(m_wpCaret);
-        pIterator->GetSection(section);
-        pIterator->GetWord(word);
-      }
+      CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+      pIterator->SetAt(m_wpCaret);
+      pIterator->GetSection(section);
+      pIterator->GetWord(word);
     }
 
     m_pVT->UpdateWordPlace(m_wpCaret);
@@ -2613,11 +2566,10 @@
     CPVT_Word word;
 
     if (bAddUndo) {
-      if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-        pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
-        pIterator->GetSection(section);
-        pIterator->GetWord(word);
-      }
+      CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+      pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
+      pIterator->GetSection(section);
+      pIterator->GetWord(word);
     }
 
     m_pVT->UpdateWordPlace(m_wpCaret);
@@ -2679,73 +2631,72 @@
 }
 
 FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint) {
-  if (m_pVT->IsValid()) {
-    if (m_SelState.IsExist()) {
-      CPVT_WordRange range = m_SelState.ConvertToWordRange();
+  if (!m_pVT->IsValid())
+    return FALSE;
 
-      if (bAddUndo && m_bEnableUndo) {
-        if (m_pVT->IsRichText()) {
-          BeginGroupUndo(L"");
+  if (!m_SelState.IsExist())
+    return FALSE;
 
-          if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-            pIterator->SetAt(range.EndPos);
+  CPVT_WordRange range = m_SelState.ConvertToWordRange();
 
-            CPVT_Word wordinfo;
-            CPVT_Section secinfo;
-            do {
-              CPVT_WordPlace place = pIterator->GetAt();
-              if (place.WordCmp(range.BeginPos) <= 0)
-                break;
+  if (bAddUndo && m_bEnableUndo) {
+    if (m_pVT->IsRichText()) {
+      BeginGroupUndo(L"");
 
-              CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
+      CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+      pIterator->SetAt(range.EndPos);
 
-              if (oldplace.SecCmp(place) != 0) {
-                if (pIterator->GetSection(secinfo)) {
-                  AddEditUndoItem(new CFXEU_ClearRich(
-                      this, oldplace, place, range, wordinfo.Word,
-                      wordinfo.nCharset, secinfo.SecProps, secinfo.WordProps));
-                }
-              } else {
-                if (pIterator->GetWord(wordinfo)) {
-                  oldplace = m_pVT->AdjustLineHeader(oldplace, TRUE);
-                  place = m_pVT->AdjustLineHeader(place, TRUE);
+      CPVT_Word wordinfo;
+      CPVT_Section secinfo;
+      do {
+        CPVT_WordPlace place = pIterator->GetAt();
+        if (place.WordCmp(range.BeginPos) <= 0)
+          break;
 
-                  AddEditUndoItem(new CFXEU_ClearRich(
-                      this, oldplace, place, range, wordinfo.Word,
-                      wordinfo.nCharset, secinfo.SecProps, wordinfo.WordProps));
-                }
-              }
-            } while (pIterator->PrevWord());
+        CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
+
+        if (oldplace.SecCmp(place) != 0) {
+          if (pIterator->GetSection(secinfo)) {
+            AddEditUndoItem(new CFXEU_ClearRich(
+                this, oldplace, place, range, wordinfo.Word, wordinfo.nCharset,
+                secinfo.SecProps, secinfo.WordProps));
           }
-          EndGroupUndo();
         } else {
-          AddEditUndoItem(new CFXEU_Clear(this, range, GetSelText()));
+          if (pIterator->GetWord(wordinfo)) {
+            oldplace = m_pVT->AdjustLineHeader(oldplace, TRUE);
+            place = m_pVT->AdjustLineHeader(place, TRUE);
+
+            AddEditUndoItem(new CFXEU_ClearRich(
+                this, oldplace, place, range, wordinfo.Word, wordinfo.nCharset,
+                secinfo.SecProps, wordinfo.WordProps));
+          }
         }
-      }
-
-      SelectNone();
-      SetCaret(m_pVT->DeleteWords(range));
-      m_SelState.Set(m_wpCaret, m_wpCaret);
-
-      if (bPaint) {
-        RearrangePart(range);
-        ScrollToCaret();
-
-        CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
-        Refresh(RP_ANALYSE, &wr);
-
-        SetCaretOrigin();
-        SetCaretInfo();
-      }
-
-      if (m_bOprNotify && m_pOprNotify)
-        m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
-
-      return TRUE;
+      } while (pIterator->PrevWord());
+      EndGroupUndo();
+    } else {
+      AddEditUndoItem(new CFXEU_Clear(this, range, GetSelText()));
     }
   }
 
-  return FALSE;
+  SelectNone();
+  SetCaret(m_pVT->DeleteWords(range));
+  m_SelState.Set(m_wpCaret, m_wpCaret);
+
+  if (bPaint) {
+    RearrangePart(range);
+    ScrollToCaret();
+
+    CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
+    Refresh(RP_ANALYSE, &wr);
+
+    SetCaretOrigin();
+    SetCaretInfo();
+  }
+
+  if (m_bOprNotify && m_pOprNotify)
+    m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
+
+  return TRUE;
 }
 
 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text,
@@ -2819,19 +2770,19 @@
 }
 
 void CFX_Edit::SetCaretOrigin() {
-  if (m_pVT->IsValid()) {
-    if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-      pIterator->SetAt(m_wpCaret);
-      CPVT_Word word;
-      CPVT_Line line;
-      if (pIterator->GetWord(word)) {
-        m_ptCaret.x = word.ptWord.x + word.fWidth;
-        m_ptCaret.y = word.ptWord.y;
-      } else if (pIterator->GetLine(line)) {
-        m_ptCaret.x = line.ptLine.x;
-        m_ptCaret.y = line.ptLine.y;
-      }
-    }
+  if (!m_pVT->IsValid())
+    return;
+
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  pIterator->SetAt(m_wpCaret);
+  CPVT_Word word;
+  CPVT_Line line;
+  if (pIterator->GetWord(word)) {
+    m_ptCaret.x = word.ptWord.x + word.fWidth;
+    m_ptCaret.y = word.ptWord.y;
+  } else if (pIterator->GetLine(line)) {
+    m_ptCaret.x = line.ptLine.x;
+    m_ptCaret.y = line.ptLine.y;
   }
 }
 
@@ -2933,35 +2884,29 @@
 }
 
 FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const {
-  if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-    CPVT_WordPlace wpOld = pIterator->GetAt();
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordPlace wpOld = pIterator->GetAt();
 
-    pIterator->SetAt(place);
-    CPVT_Line line;
-    pIterator->GetLine(line);
+  pIterator->SetAt(place);
+  CPVT_Line line;
+  pIterator->GetLine(line);
 
-    pIterator->SetAt(wpOld);
+  pIterator->SetAt(wpOld);
 
-    return line.ptLine.y + line.fLineAscent;
-  }
-
-  return 0.0f;
+  return line.ptLine.y + line.fLineAscent;
 }
 
 FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const {
-  if (CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator()) {
-    CPVT_WordPlace wpOld = pIterator->GetAt();
+  CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
+  CPVT_WordPlace wpOld = pIterator->GetAt();
 
-    pIterator->SetAt(place);
-    CPVT_Line line;
-    pIterator->GetLine(line);
+  pIterator->SetAt(place);
+  CPVT_Line line;
+  pIterator->GetLine(line);
 
-    pIterator->SetAt(wpOld);
+  pIterator->SetAt(wpOld);
 
-    return line.ptLine.y + line.fLineDescent;
-  }
-
-  return 0.0f;
+  return line.ptLine.y + line.fLineDescent;
 }
 
 CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place,
diff --git a/fpdfsdk/fxedit/fxet_pageobjs.cpp b/fpdfsdk/fxedit/fxet_pageobjs.cpp
index b862e73..6e7deed 100644
--- a/fpdfsdk/fxedit/fxet_pageobjs.cpp
+++ b/fpdfsdk/fxedit/fxet_pageobjs.cpp
@@ -107,32 +107,31 @@
     pDevice->SetClip_Rect(rcTemp.ToFxRect());
   }
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_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;
+    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);
+      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, NULL, color, 0,
-                            FXFILL_WINDING);
-        }
+        pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0,
+                          FXFILL_WINDING);
       }
     }
   }
@@ -176,96 +175,94 @@
     pDevice->SetClip_Rect(rcTemp.ToFxRect());
   }
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
+    if (pRange)
+      pIterator->SetAt(pRange->BeginPos);
+    else
+      pIterator->SetAt(0);
 
-      CPVT_WordPlace oldplace;
+    CPVT_WordPlace oldplace;
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+    while (pIterator->NextWord()) {
+      CPVT_WordPlace place = pIterator->GetAt();
+      if (pRange && place.WordCmp(pRange->EndPos) > 0)
+        break;
 
-        if (wrSelect.IsExist()) {
-          bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
-                    place.WordCmp(wrSelect.EndPos) <= 0;
-          if (bSelect) {
-            crCurFill = crWhite;
-          } else {
-            crCurFill = crTextFill;
-          }
-        }
-        if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
+      if (wrSelect.IsExist()) {
+        bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
+                  place.WordCmp(wrSelect.EndPos) <= 0;
+        if (bSelect) {
+          crCurFill = crWhite;
+        } else {
           crCurFill = crTextFill;
-          crOldFill = crCurFill;
         }
-        CPVT_Word word;
-        if (pIterator->GetWord(word)) {
-          if (bSelect) {
-            CPVT_Line line;
-            pIterator->GetLine(line);
+      }
+      if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
+        crCurFill = crTextFill;
+        crOldFill = crCurFill;
+      }
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        if (bSelect) {
+          CPVT_Line line;
+          pIterator->GetLine(line);
 
-            if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
-              CFX_FloatRect rc(word.ptWord.x, line.ptLine.y + line.fLineDescent,
-                               word.ptWord.x + word.fWidth,
-                               line.ptLine.y + line.fLineAscent);
-              rc.Intersect(rcClip);
-              pSystemHandler->OutputSelectedRect(pFFLData, rc);
-            } else {
-              CFX_PathData pathSelBK;
-              pathSelBK.AppendRect(word.ptWord.x,
-                                   line.ptLine.y + line.fLineDescent,
-                                   word.ptWord.x + word.fWidth,
-                                   line.ptLine.y + line.fLineAscent);
-
-              pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0,
-                                FXFILL_WINDING);
-            }
-          }
-
-          if (bContinuous) {
-            if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
-                crOldFill != crCurFill) {
-              if (sTextBuf.GetLength() > 0) {
-                DrawTextString(
-                    pDevice,
-                    CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-                    pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device,
-                    sTextBuf.AsStringC(), crOldFill, crTextStroke, nHorzScale);
-
-                sTextBuf.Clear();
-              }
-              nFontIndex = word.nFontIndex;
-              ptBT = word.ptWord;
-              crOldFill = crCurFill;
-            }
-
-            sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word,
-                                         SubWord)
-                            .AsStringC();
+          if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
+            CFX_FloatRect rc(word.ptWord.x, line.ptLine.y + line.fLineDescent,
+                             word.ptWord.x + word.fWidth,
+                             line.ptLine.y + line.fLineAscent);
+            rc.Intersect(rcClip);
+            pSystemHandler->OutputSelectedRect(pFFLData, rc);
           } else {
-            DrawTextString(
-                pDevice, CFX_FloatPoint(word.ptWord.x + ptOffset.x,
-                                        word.ptWord.y + ptOffset.y),
-                pFontMap->GetPDFFont(word.nFontIndex), fFontSize, pUser2Device,
-                GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord),
-                crCurFill, crTextStroke, nHorzScale);
-          }
-          oldplace = place;
-        }
-      }
+            CFX_PathData pathSelBK;
+            pathSelBK.AppendRect(
+                word.ptWord.x, line.ptLine.y + line.fLineDescent,
+                word.ptWord.x + word.fWidth, line.ptLine.y + line.fLineAscent);
 
-      if (sTextBuf.GetLength() > 0) {
-        DrawTextString(
-            pDevice, CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-            pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device,
-            sTextBuf.AsStringC(), crOldFill, crTextStroke, nHorzScale);
+            pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0,
+                              FXFILL_WINDING);
+          }
+        }
+
+        if (bContinuous) {
+          if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
+              crOldFill != crCurFill) {
+            if (sTextBuf.GetLength() > 0) {
+              DrawTextString(
+                  pDevice,
+                  CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
+                  pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device,
+                  sTextBuf.AsStringC(), crOldFill, crTextStroke, nHorzScale);
+
+              sTextBuf.Clear();
+            }
+            nFontIndex = word.nFontIndex;
+            ptBT = word.ptWord;
+            crOldFill = crCurFill;
+          }
+
+          sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word,
+                                       SubWord)
+                          .AsStringC();
+        } else {
+          DrawTextString(
+              pDevice, CFX_FloatPoint(word.ptWord.x + ptOffset.x,
+                                      word.ptWord.y + ptOffset.y),
+              pFontMap->GetPDFFont(word.nFontIndex), fFontSize, pUser2Device,
+              GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord),
+              crCurFill, crTextStroke, nHorzScale);
+        }
+        oldplace = place;
       }
     }
+
+    if (sTextBuf.GetLength() > 0) {
+      DrawTextString(pDevice,
+                     CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
+                     pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device,
+                     sTextBuf.AsStringC(), crOldFill, crTextStroke, nHorzScale);
+    }
   }
 
   pDevice->RestoreState();
@@ -297,102 +294,100 @@
     pDevice->SetClip_Rect(rcTemp.ToFxRect());
   }
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
+    if (pRange)
+      pIterator->SetAt(pRange->BeginPos);
+    else
+      pIterator->SetAt(0);
 
-      CPVT_WordPlace oldplace;
+    CPVT_WordPlace oldplace;
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+    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;
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        word.WordProps.fFontSize = word.fFontSize;
 
-          crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
+        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 (wrSelect.IsExist()) {
+          bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
+                    place.WordCmp(wrSelect.EndPos) <= 0;
           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, NULL, crSelBK, 0,
-                              FXFILL_WINDING);
+            crCurText = crWhite;
           }
-
-          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.AsStringC(), 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, NULL, 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, NULL, 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.AsStringC(), crOld, 0, wp.nHorzScale);
+        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, NULL, 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.AsStringC(), 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, NULL, 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, NULL, 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.AsStringC(), crOld, 0, wp.nHorzScale);
+    }
   }
 
   pDevice->RestoreState();
@@ -471,52 +466,49 @@
 
   ObjArray.RemoveAll();
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
+    if (pRange)
+      pIterator->SetAt(pRange->BeginPos);
+    else
+      pIterator->SetAt(0);
 
-      CPVT_WordPlace oldplace;
+    CPVT_WordPlace oldplace;
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+    while (pIterator->NextWord()) {
+      CPVT_WordPlace place = pIterator->GetAt();
+      if (pRange && place.WordCmp(pRange->EndPos) > 0)
+        break;
 
-        CPVT_Word word;
-        if (pIterator->GetWord(word)) {
-          if (place.LineCmp(oldplace) != 0 ||
-              nOldFontIndex != word.nFontIndex) {
-            if (sTextBuf.GetLength() > 0) {
-              ObjArray.Add(AddTextObjToPageObjects(
-                  pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex),
-                  fFontSize, 0.0f, 100,
-                  CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-                  sTextBuf.AsStringC()));
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        if (place.LineCmp(oldplace) != 0 || nOldFontIndex != word.nFontIndex) {
+          if (sTextBuf.GetLength() > 0) {
+            ObjArray.Add(AddTextObjToPageObjects(
+                pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex),
+                fFontSize, 0.0f, 100,
+                CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
+                sTextBuf.AsStringC()));
 
-              sTextBuf.Clear();
-            }
-
-            ptBT = word.ptWord;
-            nOldFontIndex = word.nFontIndex;
+            sTextBuf.Clear();
           }
 
-          sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0)
-                          .AsStringC();
-          oldplace = place;
+          ptBT = word.ptWord;
+          nOldFontIndex = word.nFontIndex;
         }
-      }
 
-      if (sTextBuf.GetLength() > 0) {
-        ObjArray.Add(AddTextObjToPageObjects(
-            pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex),
-            fFontSize, 0.0f, 100,
-            CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
-            sTextBuf.AsStringC()));
+        sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0)
+                        .AsStringC();
+        oldplace = place;
       }
     }
+
+    if (sTextBuf.GetLength() > 0) {
+      ObjArray.Add(AddTextObjToPageObjects(
+          pObjectHolder, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize,
+          0.0f, 100, CFX_FloatPoint(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
+          sTextBuf.AsStringC()));
+    }
   }
 }
 
@@ -535,82 +527,80 @@
 
   ObjArray.RemoveAll();
 
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (IPVT_FontMap* pFontMap = pEdit->GetFontMap()) {
+    if (pRange)
+      pIterator->SetAt(pRange->BeginPos);
+    else
+      pIterator->SetAt(0);
 
-      CPVT_WordPlace oldplace;
+    CPVT_WordPlace oldplace;
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+    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;
+      CPVT_Word word;
+      if (pIterator->GetWord(word)) {
+        word.WordProps.fFontSize = word.fFontSize;
 
-          crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
+        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.AsStringC()));
+        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.AsStringC()));
 
-              sTextBuf.Clear();
-            }
-
-            wp = word.WordProps;
-            ptBT = word.ptWord;
-            crOld = crCurText;
+            sTextBuf.Clear();
           }
 
-          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;
+          wp = word.WordProps;
+          ptBT = word.ptWord;
+          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.AsStringC()));
+        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.AsStringC()));
+    }
   }
 }
 
@@ -619,29 +609,28 @@
                                         const CFX_FloatPoint& ptOffset,
                                         const CPVT_WordRange* pRange,
                                         FX_COLORREF color) {
-  if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
-    if (pEdit->GetFontMap()) {
-      if (pRange)
-        pIterator->SetAt(pRange->BeginPos);
-      else
-        pIterator->SetAt(0);
+  IFX_Edit_Iterator* pIterator = pEdit->GetIterator();
+  if (pEdit->GetFontMap()) {
+    if (pRange)
+      pIterator->SetAt(pRange->BeginPos);
+    else
+      pIterator->SetAt(0);
 
-      CPVT_WordPlace oldplace;
+    CPVT_WordPlace oldplace;
 
-      while (pIterator->NextWord()) {
-        CPVT_WordPlace place = pIterator->GetAt();
-        if (pRange && place.WordCmp(pRange->EndPos) > 0)
-          break;
+    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);
-        }
+      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);
       }
     }
   }
diff --git a/fpdfsdk/fxedit/include/fxet_edit.h b/fpdfsdk/fxedit/include/fxet_edit.h
index 738210a..c7500a0 100644
--- a/fpdfsdk/fxedit/include/fxet_edit.h
+++ b/fpdfsdk/fxedit/include/fxet_edit.h
@@ -7,6 +7,8 @@
 #ifndef FPDFSDK_FXEDIT_INCLUDE_FXET_EDIT_H_
 #define FPDFSDK_FXEDIT_INCLUDE_FXET_EDIT_H_
 
+#include <memory>
+
 #include "core/fpdfdoc/include/cpvt_secprops.h"
 #include "core/fpdfdoc/include/cpvt_wordprops.h"
 #include "fpdfsdk/fxedit/include/fx_edit.h"
@@ -727,7 +729,7 @@
   CPDF_VariableText* m_pVT;
   IFX_Edit_Notify* m_pNotify;
   IFX_Edit_OprNotify* m_pOprNotify;
-  CFX_Edit_Provider* m_pVTProvide;
+  std::unique_ptr<CFX_Edit_Provider> m_pVTProvider;
 
   CPVT_WordPlace m_wpCaret;
   CPVT_WordPlace m_wpOldCaret;
@@ -736,7 +738,7 @@
   CFX_FloatPoint m_ptScrollPos;
   CFX_FloatPoint m_ptRefreshScrollPos;
   FX_BOOL m_bEnableScroll;
-  IFX_Edit_Iterator* m_pIterator;
+  std::unique_ptr<IFX_Edit_Iterator> m_pIterator;
   CFX_Edit_Refresh m_Refresh;
   CFX_FloatPoint m_ptCaret;
   CFX_Edit_Undo m_Undo;
diff --git a/fpdfsdk/pdfwindow/PWL_Edit.cpp b/fpdfsdk/pdfwindow/PWL_Edit.cpp
index dffc62a..80aa629 100644
--- a/fpdfsdk/pdfwindow/PWL_Edit.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Edit.cpp
@@ -524,18 +524,17 @@
     const CPVT_WordPlace& wpWord) {
   CFX_FloatPoint pt(0.0f, 0.0f);
 
-  if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) {
-    CPVT_WordPlace wpOld = pIterator->GetAt();
-    pIterator->SetAt(wpWord);
-    CPVT_Word word;
-    if (pIterator->GetWord(word)) {
-      pt = CFX_FloatPoint(word.ptWord.x + word.fWidth,
-                          word.ptWord.y + word.fDescent);
-    }
-
-    pIterator->SetAt(wpOld);
+  IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
+  CPVT_WordPlace wpOld = pIterator->GetAt();
+  pIterator->SetAt(wpWord);
+  CPVT_Word word;
+  if (pIterator->GetWord(word)) {
+    pt = CFX_FloatPoint(word.ptWord.x + word.fWidth,
+                        word.ptWord.y + word.fDescent);
   }
 
+  pIterator->SetAt(wpOld);
+
   return pt;
 }
 
@@ -879,52 +878,50 @@
                                             FX_BOOL bArabic) const {
   CPVT_WordRange range;
 
-  if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) {
-    CPVT_Word wordinfo;
-    CPVT_WordPlace wpStart(place), wpEnd(place);
-    pIterator->SetAt(place);
+  IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
+  CPVT_Word wordinfo;
+  CPVT_WordPlace wpStart(place), wpEnd(place);
+  pIterator->SetAt(place);
 
-    if (bLatin) {
-      while (pIterator->NextWord()) {
-        if (!pIterator->GetWord(wordinfo) ||
-            !FX_EDIT_ISLATINWORD(wordinfo.Word)) {
-          break;
-        }
-
-        wpEnd = pIterator->GetAt();
+  if (bLatin) {
+    while (pIterator->NextWord()) {
+      if (!pIterator->GetWord(wordinfo) ||
+          !FX_EDIT_ISLATINWORD(wordinfo.Word)) {
+        break;
       }
-    } else if (bArabic) {
-      while (pIterator->NextWord()) {
-        if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word))
-          break;
 
-        wpEnd = pIterator->GetAt();
-      }
+      wpEnd = pIterator->GetAt();
     }
+  } else if (bArabic) {
+    while (pIterator->NextWord()) {
+      if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word))
+        break;
 
-    pIterator->SetAt(place);
-
-    if (bLatin) {
-      do {
-        if (!pIterator->GetWord(wordinfo) ||
-            !FX_EDIT_ISLATINWORD(wordinfo.Word)) {
-          break;
-        }
-
-        wpStart = pIterator->GetAt();
-      } while (pIterator->PrevWord());
-    } else if (bArabic) {
-      do {
-        if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word))
-          break;
-
-        wpStart = pIterator->GetAt();
-      } while (pIterator->PrevWord());
+      wpEnd = pIterator->GetAt();
     }
-
-    range.Set(wpStart, wpEnd);
   }
 
+  pIterator->SetAt(place);
+
+  if (bLatin) {
+    do {
+      if (!pIterator->GetWord(wordinfo) ||
+          !FX_EDIT_ISLATINWORD(wordinfo.Word)) {
+        break;
+      }
+
+      wpStart = pIterator->GetAt();
+    } while (pIterator->PrevWord());
+  } else if (bArabic) {
+    do {
+      if (!pIterator->GetWord(wordinfo) || !PWL_ISARABICWORD(wordinfo.Word))
+        break;
+
+      wpStart = pIterator->GetAt();
+    } while (pIterator->PrevWord());
+  }
+
+  range.Set(wpStart, wpEnd);
   return range;
 }
 
diff --git a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
index 23349b4..07ac4af 100644
--- a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
+++ b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
@@ -351,21 +351,20 @@
 
 void CPWL_EditCtrl::GetCaretInfo(CFX_FloatPoint& ptHead,
                                  CFX_FloatPoint& ptFoot) const {
-  if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) {
-    pIterator->SetAt(m_pEdit->GetCaret());
-    CPVT_Word word;
-    CPVT_Line line;
-    if (pIterator->GetWord(word)) {
-      ptHead.x = word.ptWord.x + word.fWidth;
-      ptHead.y = word.ptWord.y + word.fAscent;
-      ptFoot.x = word.ptWord.x + word.fWidth;
-      ptFoot.y = word.ptWord.y + word.fDescent;
-    } else if (pIterator->GetLine(line)) {
-      ptHead.x = line.ptLine.x;
-      ptHead.y = line.ptLine.y + line.fLineAscent;
-      ptFoot.x = line.ptLine.x;
-      ptFoot.y = line.ptLine.y + line.fLineDescent;
-    }
+  IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
+  pIterator->SetAt(m_pEdit->GetCaret());
+  CPVT_Word word;
+  CPVT_Line line;
+  if (pIterator->GetWord(word)) {
+    ptHead.x = word.ptWord.x + word.fWidth;
+    ptHead.y = word.ptWord.y + word.fAscent;
+    ptFoot.x = word.ptWord.x + word.fWidth;
+    ptFoot.y = word.ptWord.y + word.fDescent;
+  } else if (pIterator->GetLine(line)) {
+    ptHead.x = line.ptLine.x;
+    ptHead.y = line.ptLine.y + line.fLineAscent;
+    ptFoot.x = line.ptLine.x;
+    ptFoot.y = line.ptLine.y + line.fLineDescent;
   }
 }
 
@@ -453,16 +452,15 @@
 CPDF_Font* CPWL_EditCtrl::GetCaretFont() const {
   int32_t nFontIndex = 0;
 
-  if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) {
-    pIterator->SetAt(m_pEdit->GetCaret());
-    CPVT_Word word;
-    CPVT_Section section;
-    if (pIterator->GetWord(word)) {
-      nFontIndex = word.nFontIndex;
-    } else if (HasFlag(PES_RICH)) {
-      if (pIterator->GetSection(section)) {
-        nFontIndex = section.WordProps.nFontIndex;
-      }
+  IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
+  pIterator->SetAt(m_pEdit->GetCaret());
+  CPVT_Word word;
+  CPVT_Section section;
+  if (pIterator->GetWord(word)) {
+    nFontIndex = word.nFontIndex;
+  } else if (HasFlag(PES_RICH)) {
+    if (pIterator->GetSection(section)) {
+      nFontIndex = section.WordProps.nFontIndex;
     }
   }
 
@@ -475,16 +473,15 @@
 FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const {
   FX_FLOAT fFontSize = GetFontSize();
 
-  if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator()) {
-    pIterator->SetAt(m_pEdit->GetCaret());
-    CPVT_Word word;
-    CPVT_Section section;
-    if (pIterator->GetWord(word)) {
-      fFontSize = word.fFontSize;
-    } else if (HasFlag(PES_RICH)) {
-      if (pIterator->GetSection(section)) {
-        fFontSize = section.WordProps.fFontSize;
-      }
+  IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
+  pIterator->SetAt(m_pEdit->GetCaret());
+  CPVT_Word word;
+  CPVT_Section section;
+  if (pIterator->GetWord(word)) {
+    fFontSize = word.fFontSize;
+  } else if (HasFlag(PES_RICH)) {
+    if (pIterator->GetSection(section)) {
+      fFontSize = section.WordProps.fFontSize;
     }
   }
 
