diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 21a1029..b5563bb 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -108,6 +108,22 @@
 
 }  // namespace
 
+FPDF_CHAR_INFO::FPDF_CHAR_INFO()
+    : m_Unicode(0),
+      m_Charcode(0),
+      m_Flag(0),
+      m_FontSize(0),
+      m_pTextObj(nullptr) {}
+
+FPDF_CHAR_INFO::~FPDF_CHAR_INFO() {}
+
+PAGECHAR_INFO::PAGECHAR_INFO()
+    : m_Index(0), m_CharCode(0), m_Unicode(0), m_Flag(0), m_pTextObj(nullptr) {}
+
+PAGECHAR_INFO::PAGECHAR_INFO(const PAGECHAR_INFO&) = default;
+
+PAGECHAR_INFO::~PAGECHAR_INFO() {}
+
 CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, FPDFText_Direction flags)
     : m_pPage(pPage),
       m_parserflag(flags),
@@ -245,10 +261,7 @@
       CFX_Matrix matrix_reverse;
       matrix_reverse.SetReverse(matrix);
 
-      CFX_PointF origin =
-          CFX_PointF(info_curchar.m_OriginX, info_curchar.m_OriginY);
-      origin = matrix_reverse.Transform(origin);
-
+      CFX_PointF origin = matrix_reverse.Transform(info_curchar.m_Origin);
       rect.left = info_curchar.m_CharBox.left;
       rect.right = info_curchar.m_CharBox.right;
       if (pCurObj->GetFont()->GetTypeDescent()) {
@@ -341,9 +354,9 @@
   CFX_WideString strText;
   for (const auto& charinfo : m_CharList) {
     if (IsRectIntersect(rect, charinfo.m_CharBox)) {
-      if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar &&
+      if (FXSYS_fabs(posy - charinfo.m_Origin.y) > 0 && !IsContainPreChar &&
           IsAddLineFeed) {
-        posy = charinfo.m_OriginY;
+        posy = charinfo.m_Origin.y;
         if (!strText.IsEmpty())
           strText += L"\r\n";
       }
@@ -382,8 +395,7 @@
 
   const PAGECHAR_INFO& charinfo = m_CharList[index];
   info->m_Charcode = charinfo.m_CharCode;
-  info->m_OriginX = charinfo.m_OriginX;
-  info->m_OriginY = charinfo.m_OriginY;
+  info->m_Origin = charinfo.m_Origin;
   info->m_Unicode = charinfo.m_Unicode;
   info->m_Flag = charinfo.m_Flag;
   info->m_CharBox = charinfo.m_CharBox;
@@ -899,8 +911,7 @@
       continue;
 
     PAGECHAR_INFO charinfo;
-    charinfo.m_OriginX = pTextObj->GetPos().x;
-    charinfo.m_OriginY = pTextObj->GetPos().y;
+    charinfo.m_Origin = pTextObj->GetPos();
     charinfo.m_Index = m_TextBuf.GetLength();
     charinfo.m_Unicode = wChar;
     charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
@@ -1052,8 +1063,6 @@
   for (int i = 0; i < nItems; i++) {
     CPDF_TextObjectItem item;
     PAGECHAR_INFO charinfo;
-    charinfo.m_OriginX = 0;
-    charinfo.m_OriginY = 0;
     pTextObj->GetItemInfo(i, &item);
     if (item.m_CharCode == static_cast<uint32_t>(-1)) {
       CFX_WideString str = m_TempTextBuf.MakeString();
@@ -1099,13 +1108,10 @@
         m_TempTextBuf.AppendChar(TEXT_SPACE_CHAR);
         charinfo.m_CharCode = CPDF_Font::kInvalidCharCode;
         charinfo.m_Matrix = formMatrix;
-
-        charinfo.m_OriginX = item.m_Origin.x;
-        charinfo.m_OriginY = item.m_Origin.y;
-        matrix.TransformPoint(charinfo.m_OriginX, charinfo.m_OriginY);
+        charinfo.m_Origin = matrix.Transform(item.m_Origin);
         charinfo.m_CharBox =
-            CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY,
-                          charinfo.m_OriginX, charinfo.m_OriginY);
+            CFX_FloatRect(charinfo.m_Origin.x, charinfo.m_Origin.y,
+                          charinfo.m_Origin.x, charinfo.m_Origin.y);
         m_TempCharList.push_back(charinfo);
       }
       if (item.m_CharCode == CPDF_Font::kInvalidCharCode)
@@ -1126,9 +1132,7 @@
       charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
 
     charinfo.m_pTextObj = pTextObj;
-    charinfo.m_OriginX = item.m_Origin.x;
-    charinfo.m_OriginY = item.m_Origin.y;
-    matrix.TransformPoint(charinfo.m_OriginX, charinfo.m_OriginY);
+    charinfo.m_Origin = matrix.Transform(item.m_Origin);
 
     FX_RECT rect =
         charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode);
@@ -1165,10 +1169,10 @@
       for (int n = pdfium::CollectionSize<int>(m_TempCharList);
            n > pdfium::CollectionSize<int>(m_TempCharList) - count; n--) {
         const PAGECHAR_INFO& charinfo1 = m_TempCharList[n - 1];
+        CFX_PointF diff = charinfo1.m_Origin - charinfo.m_Origin;
         if (charinfo1.m_CharCode == charinfo.m_CharCode &&
             charinfo1.m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() &&
-            FXSYS_fabs(charinfo1.m_OriginX - charinfo.m_OriginX) < threshold &&
-            FXSYS_fabs(charinfo1.m_OriginY - charinfo.m_OriginY) < threshold) {
+            FXSYS_fabs(diff.x) < threshold && FXSYS_fabs(diff.y) < threshold) {
           bDel = true;
           break;
         }
@@ -1513,10 +1517,10 @@
   if (!fFontSize)
     fFontSize = kDefaultFontSize;
 
-  info.m_OriginX = preChar->m_OriginX + preWidth * (fFontSize) / 1000;
-  info.m_OriginY = preChar->m_OriginY;
-  info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX,
-                                 info.m_OriginY);
+  info.m_Origin = CFX_PointF(
+      preChar->m_Origin.x + preWidth * (fFontSize) / 1000, preChar->m_Origin.y);
+  info.m_CharBox = CFX_FloatRect(info.m_Origin.x, info.m_Origin.y,
+                                 info.m_Origin.x, info.m_Origin.y);
   return true;
 }
 
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index dd1493f..787715f 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -44,13 +44,16 @@
 
 enum class FPDFText_Direction { Left = -1, Right = 1 };
 
-struct FPDF_CHAR_INFO {
+class FPDF_CHAR_INFO {
+ public:
+  FPDF_CHAR_INFO();
+  ~FPDF_CHAR_INFO();
+
   FX_WCHAR m_Unicode;
   FX_WCHAR m_Charcode;
   int32_t m_Flag;
   FX_FLOAT m_FontSize;
-  FX_FLOAT m_OriginX;
-  FX_FLOAT m_OriginY;
+  CFX_PointF m_Origin;
   CFX_FloatRect m_CharBox;
   CPDF_TextObject* m_pTextObj;
   CFX_Matrix m_Matrix;
@@ -61,16 +64,20 @@
   int m_nCount;
 };
 
-struct PAGECHAR_INFO {
+class PAGECHAR_INFO {
+ public:
+  PAGECHAR_INFO();
+  PAGECHAR_INFO(const PAGECHAR_INFO&);
+  ~PAGECHAR_INFO();
+
+  int m_Index;
   int m_CharCode;
   FX_WCHAR m_Unicode;
-  FX_FLOAT m_OriginX;
-  FX_FLOAT m_OriginY;
   int32_t m_Flag;
+  CFX_PointF m_Origin;
   CFX_FloatRect m_CharBox;
   CPDF_TextObject* m_pTextObj;
   CFX_Matrix m_Matrix;
-  int m_Index;
 };
 
 struct PDFTEXT_Obj {
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index 7e7ed52..c773d37 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -54,16 +54,16 @@
     y /= divisor;
     return *this;
   }
-  CFX_PTemplate operator+(const CFX_PTemplate& other) {
+  CFX_PTemplate operator+(const CFX_PTemplate& other) const {
     return CFX_PTemplate(x + other.x, y + other.y);
   }
-  CFX_PTemplate operator-(const CFX_PTemplate& other) {
+  CFX_PTemplate operator-(const CFX_PTemplate& other) const {
     return CFX_PTemplate(x - other.x, y - other.y);
   }
-  CFX_PTemplate operator*(BaseType factor) {
+  CFX_PTemplate operator*(BaseType factor) const {
     return CFX_PTemplate(x * factor, y * factor);
   }
-  CFX_PTemplate operator/(BaseType divisor) {
+  CFX_PTemplate operator/(BaseType divisor) const {
     return CFX_PTemplate(x / divisor, y / divisor);
   }
 
