diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 741b236..dbfcdbf 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -237,7 +237,7 @@
       vt.SetText(swValue);
       vt.RearrangeAll();
       CFX_FloatRect rcContent = vt.GetContentRect();
-      CFX_FloatPoint ptOffset(0.0f, 0.0f);
+      CFX_FloatPoint ptOffset;
       if (!bMultiLine) {
         ptOffset =
             CFX_FloatPoint(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
@@ -1083,13 +1083,12 @@
   CFX_ByteTextBuf sEditStream;
   CFX_ByteTextBuf sLineStream;
   CFX_ByteTextBuf sWords;
-  CFX_FloatPoint ptOld(0.0f, 0.0f);
-  CFX_FloatPoint ptNew(0.0f, 0.0f);
+  CFX_FloatPoint ptOld;
+  CFX_FloatPoint ptNew;
   int32_t nCurFontIndex = -1;
+  CPVT_WordPlace oldplace;
 
   pIterator->SetAt(0);
-
-  CPVT_WordPlace oldplace;
   while (pIterator->NextWord()) {
     CPVT_WordPlace place = pIterator->GetAt();
     if (bContinuous) {
@@ -1110,7 +1109,7 @@
           ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x,
                                  line.ptLine.y + ptOffset.y);
         }
-        if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+        if (ptNew != ptOld) {
           sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
                       << " Td\n";
           ptOld = ptNew;
@@ -1135,7 +1134,7 @@
       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) {
+        if (ptNew != ptOld) {
           sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y
                       << " Td\n";
           ptOld = ptNew;
diff --git a/core/fpdfdoc/include/cpvt_line.h b/core/fpdfdoc/include/cpvt_line.h
index ea0f899..d6c74ed 100644
--- a/core/fpdfdoc/include/cpvt_line.h
+++ b/core/fpdfdoc/include/cpvt_line.h
@@ -12,8 +12,7 @@
 #include "core/fxcrt/include/fx_system.h"
 
 struct CPVT_Line {
-  CPVT_Line()
-      : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f) {}
+  CPVT_Line() : fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f) {}
 
   CPVT_WordPlace lineplace;
   CPVT_WordPlace lineEnd;
diff --git a/core/fpdfdoc/include/cpvt_word.h b/core/fpdfdoc/include/cpvt_word.h
index f7b7b23..b2af4ec 100644
--- a/core/fpdfdoc/include/cpvt_word.h
+++ b/core/fpdfdoc/include/cpvt_word.h
@@ -29,7 +29,6 @@
 inline CPVT_Word::CPVT_Word()
     : Word(0),
       nCharset(0),
-      ptWord(0.0f, 0.0f),
       fAscent(0.0f),
       fDescent(0.0f),
       fWidth(0.0f),
diff --git a/core/fxcrt/include/fx_coordinates.h b/core/fxcrt/include/fx_coordinates.h
index 7da6057..bfdc46c 100644
--- a/core/fxcrt/include/fx_coordinates.h
+++ b/core/fxcrt/include/fx_coordinates.h
@@ -179,8 +179,14 @@
 // LBRT rectangles (y-axis runs upwards).
 class CFX_FloatPoint {
  public:
+  CFX_FloatPoint() : x(0.0f), y(0.0f) {}
   CFX_FloatPoint(FX_FLOAT xx, FX_FLOAT yy) : x(xx), y(yy) {}
 
+  bool operator==(const CFX_FloatPoint& that) const {
+    return x == that.x && y == that.y;
+  }
+  bool operator!=(const CFX_FloatPoint& that) const { return !(*this == that); }
+
   FX_FLOAT x;
   FX_FLOAT y;
 };
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 11e9883..78cb1bf 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -1402,7 +1402,7 @@
   CFX_FloatRect rcContent = pEdit->GetContentRect();
 
   CFX_ByteString sEdit =
-      CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_FloatPoint(0.0f, 0.0f));
+      CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_FloatPoint());
   if (sEdit.GetLength() > 0) {
     sBody << "/Tx BMC\n"
           << "q\n";
@@ -1585,7 +1585,7 @@
 
   CFX_FloatRect rcContent = pEdit->GetContentRect();
   CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(
-      pEdit.get(), CFX_FloatPoint(0.0f, 0.0f), nullptr, !bCharArray, subWord);
+      pEdit.get(), CFX_FloatPoint(), nullptr, !bCharArray, subWord);
 
   if (sEdit.GetLength() > 0) {
     sBody << "/Tx BMC\n"
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 4b33c38..595f412 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -24,8 +24,8 @@
 
 CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp,
                                  CPDFSDK_Annot* pAnnot)
-    : m_pApp(pApp), m_pAnnot(pAnnot), m_bValid(FALSE), m_ptOldPos(0, 0) {
-  m_pWidget = (CPDFSDK_Widget*)pAnnot;
+    : m_pApp(pApp), m_pAnnot(pAnnot), m_bValid(FALSE) {
+  m_pWidget = static_cast<CPDFSDK_Widget*>(pAnnot);
 }
 
 CFFL_FormFiller::~CFFL_FormFiller() {
@@ -145,42 +145,41 @@
                                      CPDFSDK_Annot* pAnnot,
                                      FX_UINT nFlags,
                                      const CFX_FloatPoint& point) {
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
-    FX_RECT rcFFL = GetViewBBox(pPageView, pAnnot);
-    InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
-    pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags);
-    return TRUE;
-  }
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE);
+  if (!pWnd)
+    return FALSE;
 
-  return FALSE;
+  FX_RECT rcFFL = GetViewBBox(pPageView, pAnnot);
+  InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
+  pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags);
+  return TRUE;
 }
 
 FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
                                          CPDFSDK_Annot* pAnnot,
                                          FX_UINT nFlags,
                                          const CFX_FloatPoint& point) {
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
-    pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags);
-    return TRUE;
-  }
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE);
+  if (!pWnd)
+    return FALSE;
 
-  return FALSE;
+  pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags);
+  return TRUE;
 }
 
 FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView* pPageView,
                                      CPDFSDK_Annot* pAnnot,
                                      FX_UINT nFlags,
                                      const CFX_FloatPoint& point) {
-  if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y)) {
+  if (m_ptOldPos != point)
     m_ptOldPos = point;
-  }
 
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
-    pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags);
-    return TRUE;
-  }
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE);
+  if (!pWnd)
+    return FALSE;
 
-  return FALSE;
+  pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags);
+  return TRUE;
 }
 
 FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView,
@@ -191,35 +190,32 @@
   if (!IsValid())
     return FALSE;
 
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) {
-    return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags);
-  }
-
-  return FALSE;
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE);
+  return pWnd && pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags);
 }
 
 FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView,
                                        CPDFSDK_Annot* pAnnot,
                                        FX_UINT nFlags,
                                        const CFX_FloatPoint& point) {
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) {
-    pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags);
-    return TRUE;
-  }
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE);
+  if (!pWnd)
+    return FALSE;
 
-  return FALSE;
+  pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags);
+  return TRUE;
 }
 
 FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView,
                                      CPDFSDK_Annot* pAnnot,
                                      FX_UINT nFlags,
                                      const CFX_FloatPoint& point) {
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
-    pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags);
-    return TRUE;
-  }
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE);
+  if (!pWnd)
+    return FALSE;
 
-  return FALSE;
+  pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags);
+  return TRUE;
 }
 
 FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot,
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 8912fa5..df8d9ca 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -75,7 +75,8 @@
       ro.m_ColorMode = RENDER_COLOR_NORMAL;
 
       if (crTextStroke != 0) {
-        CFX_FloatPoint pt1(0, 0), pt2(1, 0);
+        CFX_FloatPoint pt1;
+        CFX_FloatPoint pt2;
         pUser2Device->Transform(pt1.x, pt1.y);
         pUser2Device->Transform(pt2.x, pt2.y);
         CFX_GraphStateData gsd;
@@ -95,7 +96,8 @@
       ro.m_ColorMode = RENDER_COLOR_NORMAL;
 
       if (crTextStroke != 0) {
-        CFX_FloatPoint pt1(0, 0), pt2(1, 0);
+        CFX_FloatPoint pt1;
+        CFX_FloatPoint pt2;
         pUser2Device->Transform(pt1.x, pt1.y);
         pUser2Device->Transform(pt2.x, pt2.y);
         CFX_GraphStateData gsd;
@@ -682,12 +684,12 @@
   CFX_ByteTextBuf sEditStream;
   CFX_ByteTextBuf sWords;
   int32_t nCurFontIndex = -1;
-  CFX_FloatPoint ptOld(0.0f, 0.0f);
-  CFX_FloatPoint ptNew(0.0f, 0.0f);
+  CFX_FloatPoint ptOld;
+  CFX_FloatPoint ptNew;
   CPVT_WordPlace oldplace;
+
   while (pIterator->NextWord()) {
     CPVT_WordPlace place = pIterator->GetAt();
-
     if (pRange && place.WordCmp(pRange->EndPos) > 0)
       break;
 
@@ -837,10 +839,8 @@
 
   CFX_ByteTextBuf sTextBuf;
   int32_t nFontIndex = -1;
-  CFX_FloatPoint ptBT(0.0f, 0.0f);
-
+  CFX_FloatPoint ptBT;
   pDevice->SaveState();
-
   if (!rcClip.IsEmpty()) {
     CFX_FloatRect rcTemp = rcClip;
     pUser2Device->TransformRect(rcTemp);
@@ -1005,10 +1005,7 @@
       m_wpCaret(-1, -1, -1),
       m_wpOldCaret(-1, -1, -1),
       m_SelState(),
-      m_ptScrollPos(0, 0),
-      m_ptRefreshScrollPos(0, 0),
       m_bEnableScroll(FALSE),
-      m_ptCaret(0.0f, 0.0f),
       m_Undo(kEditUndoMaxItems),
       m_nAlignment(0),
       m_bNotifyFlag(FALSE),
@@ -1576,12 +1573,11 @@
   if (!m_pVT->IsValid())
     return;
 
-  CFX_FloatPoint ptHead(0, 0);
-  CFX_FloatPoint ptFoot(0, 0);
-
   CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
   pIterator->SetAt(m_wpCaret);
 
+  CFX_FloatPoint ptHead;
+  CFX_FloatPoint ptFoot;
   CPVT_Word word;
   CPVT_Line line;
   if (pIterator->GetWord(word)) {
@@ -1598,9 +1594,7 @@
 
   CFX_FloatPoint ptHeadEdit = VTToEdit(ptHead);
   CFX_FloatPoint ptFootEdit = VTToEdit(ptFoot);
-
   CFX_FloatRect rcPlate = m_pVT->GetPlateRect();
-
   if (!IsFloatEqual(rcPlate.left, rcPlate.right)) {
     if (IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
         IsFloatEqual(ptHeadEdit.x, rcPlate.left)) {
@@ -1738,10 +1732,11 @@
 void CFX_Edit::SetCaretInfo() {
   if (m_pNotify) {
     if (!m_bNotifyFlag) {
-      CFX_FloatPoint ptHead(0.0f, 0.0f), ptFoot(0.0f, 0.0f);
-
       CPDF_VariableText::Iterator* pIterator = m_pVT->GetIterator();
       pIterator->SetAt(m_wpCaret);
+
+      CFX_FloatPoint ptHead;
+      CFX_FloatPoint ptFoot;
       CPVT_Word word;
       CPVT_Line line;
       if (pIterator->GetWord(word)) {
diff --git a/fpdfsdk/fxedit/fxet_list.cpp b/fpdfsdk/fxedit/fxet_list.cpp
index 7bf1bd8..5fb26b1 100644
--- a/fpdfsdk/fxedit/fxet_list.cpp
+++ b/fpdfsdk/fxedit/fxet_list.cpp
@@ -191,7 +191,6 @@
 CFX_ListCtrl::CFX_ListCtrl()
     : m_pNotify(nullptr),
       m_bNotifyFlag(FALSE),
-      m_ptScrollPos(0.0f, 0.0f),
       m_nSelItem(-1),
       m_nFootIndex(-1),
       m_bCtrlSel(FALSE),
diff --git a/fpdfsdk/pdfwindow/PWL_Caret.cpp b/fpdfsdk/pdfwindow/PWL_Caret.cpp
index 98b2b3d..62f424b 100644
--- a/fpdfsdk/pdfwindow/PWL_Caret.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Caret.cpp
@@ -14,12 +14,7 @@
 
 #define PWL_CARET_FLASHINTERVAL 500
 
-CPWL_Caret::CPWL_Caret()
-    : m_bFlash(FALSE),
-      m_ptHead(0, 0),
-      m_ptFoot(0, 0),
-      m_fWidth(0.4f),
-      m_nDelay(0) {}
+CPWL_Caret::CPWL_Caret() : m_bFlash(FALSE), m_fWidth(0.4f), m_nDelay(0) {}
 
 CPWL_Caret::~CPWL_Caret() {}
 
@@ -36,15 +31,12 @@
   if (IsVisible() && m_bFlash) {
     CFX_FloatRect rcRect = GetCaretRect();
     CFX_FloatRect rcClip = GetClipRect();
-
     CFX_PathData path;
-
     path.SetPointCount(2);
 
     FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f;
     FX_FLOAT fCaretTop = rcRect.top;
     FX_FLOAT fCaretBottom = rcRect.bottom;
-
     if (!rcClip.IsEmpty()) {
       rcRect.Intersect(rcClip);
       if (!rcRect.IsEmpty()) {
@@ -62,7 +54,6 @@
 
     CFX_GraphStateData gsd;
     gsd.m_LineWidth = m_fWidth;
-
     pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255, 0, 0, 0),
                       FXFILL_ALTERNATE);
   }
@@ -119,30 +110,24 @@
                           const CFX_FloatPoint& ptFoot) {
   if (bVisible) {
     if (IsVisible()) {
-      if (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y ||
-          m_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y) {
+      if (m_ptHead != ptHead || m_ptFoot != ptFoot) {
         m_ptHead = ptHead;
         m_ptFoot = ptFoot;
-
         m_bFlash = TRUE;
         Move(m_rcInvalid, FALSE, TRUE);
       }
     } else {
       m_ptHead = ptHead;
       m_ptFoot = ptFoot;
-
       EndTimer();
       BeginTimer(PWL_CARET_FLASHINTERVAL);
-
       CPWL_Wnd::SetVisible(TRUE);
       m_bFlash = TRUE;
-
       Move(m_rcInvalid, FALSE, TRUE);
     }
   } else {
-    m_ptHead = CFX_FloatPoint(0, 0);
-    m_ptFoot = CFX_FloatPoint(0, 0);
-
+    m_ptHead = CFX_FloatPoint();
+    m_ptFoot = CFX_FloatPoint();
     m_bFlash = FALSE;
     if (IsVisible()) {
       EndTimer();
@@ -156,7 +141,6 @@
     CFX_FloatRect rcRefresh = CPWL_Utils::InflateRect(*pRect, 0.5f);
     rcRefresh.top += 1;
     rcRefresh.bottom -= 1;
-
     CPWL_Wnd::InvalidateRect(&rcRefresh);
   } else {
     CPWL_Wnd::InvalidateRect(pRect);
diff --git a/fpdfsdk/pdfwindow/PWL_Caret.h b/fpdfsdk/pdfwindow/PWL_Caret.h
index 0f002a2..2f5c876 100644
--- a/fpdfsdk/pdfwindow/PWL_Caret.h
+++ b/fpdfsdk/pdfwindow/PWL_Caret.h
@@ -11,7 +11,7 @@
 
 struct PWL_CARET_INFO {
  public:
-  PWL_CARET_INFO() : bVisible(FALSE), ptHead(0, 0), ptFoot(0, 0) {}
+  PWL_CARET_INFO() : bVisible(FALSE) {}
 
   FX_BOOL bVisible;
   CFX_FloatPoint ptHead;
diff --git a/fpdfsdk/pdfwindow/PWL_Edit.cpp b/fpdfsdk/pdfwindow/PWL_Edit.cpp
index c85993b..4b115d3 100644
--- a/fpdfsdk/pdfwindow/PWL_Edit.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Edit.cpp
@@ -241,16 +241,14 @@
   sAppStream << sLine;
 
   CFX_ByteTextBuf sText;
-
-  CFX_FloatPoint ptOffset = CFX_FloatPoint(0.0f, 0.0f);
-
+  CFX_FloatPoint ptOffset = CFX_FloatPoint();
   CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange();
   CPVT_WordRange wrSelect = GetSelectWordRange();
   CPVT_WordRange wrVisible =
-      (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange());
+      HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange();
+
   CPVT_WordRange wrSelBefore(wrWhole.BeginPos, wrSelect.BeginPos);
   CPVT_WordRange wrSelAfter(wrSelect.EndPos, wrWhole.EndPos);
-
   CPVT_WordRange wrTemp =
       CPWL_Utils::OverlapWordRange(GetSelectWordRange(), wrVisible);
   CFX_ByteString sEditSel =
@@ -385,17 +383,17 @@
   CFX_FloatRect rcClip;
   CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
   CPVT_WordRange* pRange = nullptr;
-
   if (!HasFlag(PES_TEXTOVERFLOW)) {
     rcClip = GetClientRect();
     pRange = &wrRange;
   }
+
   CFX_SystemHandler* pSysHandler = GetSystemHandler();
   CFX_Edit::DrawEdit(
       pDevice, pUser2Device, m_pEdit.get(),
       CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()),
       CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()),
-      rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, m_pFormFiller);
+      rcClip, CFX_FloatPoint(), pRange, pSysHandler, m_pFormFiller);
 }
 
 FX_BOOL CPWL_Edit::OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) {
@@ -445,20 +443,17 @@
 
 void CPWL_Edit::OnSetFocus() {
   SetEditCaret(TRUE);
-
   if (!IsReadOnly()) {
     if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
       pFocusHandler->OnSetFocus(this);
   }
-
   m_bFocus = TRUE;
 }
 
 void CPWL_Edit::OnKillFocus() {
   ShowVScrollBar(FALSE);
-
   m_pEdit->SelectNone();
-  SetCaret(FALSE, CFX_FloatPoint(0.0f, 0.0f), CFX_FloatPoint(0.0f, 0.0f));
+  SetCaret(FALSE, CFX_FloatPoint(), CFX_FloatPoint());
   SetCharSet(FXFONT_ANSI_CHARSET);
   m_bFocus = FALSE;
 }
@@ -510,19 +505,17 @@
 
 CFX_FloatPoint CPWL_Edit::GetWordRightBottomPoint(
     const CPVT_WordPlace& wpWord) {
-  CFX_FloatPoint pt(0.0f, 0.0f);
-
   CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator();
   CPVT_WordPlace wpOld = pIterator->GetAt();
   pIterator->SetAt(wpWord);
+
+  CFX_FloatPoint pt;
   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;
 }
 
diff --git a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
index 575fd39..9d8b16a 100644
--- a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
+++ b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
@@ -328,11 +328,10 @@
 }
 
 void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible) {
-  CFX_FloatPoint ptHead(0, 0), ptFoot(0, 0);
-
-  if (bVisible) {
+  CFX_FloatPoint ptHead;
+  CFX_FloatPoint ptFoot;
+  if (bVisible)
     GetCaretInfo(ptHead, ptFoot);
-  }
 
   CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
   IOnSetCaret(bVisible, ptHead, ptFoot, wpTemp);
@@ -358,10 +357,9 @@
 }
 
 void CPWL_EditCtrl::GetCaretPos(int32_t& x, int32_t& y) const {
-  CFX_FloatPoint ptHead(0, 0), ptFoot(0, 0);
-
+  CFX_FloatPoint ptHead;
+  CFX_FloatPoint ptFoot;
   GetCaretInfo(ptHead, ptFoot);
-
   PWLtoWnd(ptHead, x, y);
 }
 
diff --git a/fpdfsdk/pdfwindow/PWL_Utils.h b/fpdfsdk/pdfwindow/PWL_Utils.h
index c3acc59..d7c65d2 100644
--- a/fpdfsdk/pdfwindow/PWL_Utils.h
+++ b/fpdfsdk/pdfwindow/PWL_Utils.h
@@ -76,7 +76,7 @@
 
 class CPWL_Point : public CFX_FloatPoint {
  public:
-  CPWL_Point() : CFX_FloatPoint(0.0f, 0.0f) {}
+  CPWL_Point() {}
   CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CFX_FloatPoint(fx, fy) {}
   CPWL_Point(const CPWL_Point& point) : CFX_FloatPoint(point.x, point.y) {}
 };
