Remove Transform in favour of TransformPoint

This CL removes the two Transform() overrides from CFX_Matrix and calls the
TransformPoint methods directly. In the case of the 4 param version the
values were assigned to the out values before calling.

Change-Id: Id633826caec75b848774dcda6cfdcef2dbf5a7db
Reviewed-on: https://pdfium-review.googlesource.com/2573
Reviewed-by: Nicolás Peña <npm@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_meshstream.cpp b/core/fpdfapi/page/cpdf_meshstream.cpp
index 8bc2a85..b852901 100644
--- a/core/fpdfapi/page/cpdf_meshstream.cpp
+++ b/core/fpdfapi/page/cpdf_meshstream.cpp
@@ -195,7 +195,7 @@
                                     CFX_Matrix* pObject2Bitmap) {
   uint32_t flag = GetFlag();
   GetCoords(vertex.x, vertex.y);
-  pObject2Bitmap->Transform(vertex.x, vertex.y);
+  pObject2Bitmap->TransformPoint(vertex.x, vertex.y);
   GetColor(vertex.r, vertex.g, vertex.b);
   m_BitStream.ByteAlign();
   return flag;
@@ -209,7 +209,7 @@
       return false;
 
     GetCoords(vertex[i].x, vertex[i].y);
-    pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);
+    pObject2Bitmap->TransformPoint(vertex[i].x, vertex[i].y);
     GetColor(vertex[i].r, vertex[i].g, vertex[i].b);
     m_BitStream.ByteAlign();
   }
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 1fcb27a..93478de 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1230,13 +1230,13 @@
 }
 
 void CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y) {
-  m_pCurStates->m_TextMatrix.Transform(x, y, x, y);
+  m_pCurStates->m_TextMatrix.TransformPoint(x, y);
   ConvertUserSpace(x, y);
 }
 
 void CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y) {
-  m_pCurStates->m_CTM.Transform(x, y, x, y);
-  m_mtContentToUser.Transform(x, y, x, y);
+  m_pCurStates->m_CTM.TransformPoint(x, y);
+  m_mtContentToUser.TransformPoint(x, y);
 }
 
 void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs,
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 07987d6..813ff37 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -160,7 +160,7 @@
     uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch);
     for (int column = 0; column < width; column++) {
       FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
-      matrix.Transform(x, y);
+      matrix.TransformPoint(x, y);
       FX_FLOAT scale = (((x - start_x) * x_span) + ((y - start_y) * y_span)) /
                        axis_len_square;
       int index = (int32_t)(scale * (SHADING_STEPS - 1));
@@ -253,7 +253,7 @@
     uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch);
     for (int column = 0; column < width; column++) {
       FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
-      matrix.Transform(x, y);
+      matrix.TransformPoint(x, y);
       FX_FLOAT b = -2 * (((x - start_x) * (end_x - start_x)) +
                          ((y - start_y) * (end_y - start_y)) +
                          (start_r * (end_r - start_r)));
@@ -345,7 +345,7 @@
     uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch);
     for (int column = 0; column < width; column++) {
       FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
-      matrix.Transform(x, y);
+      matrix.TransformPoint(x, y);
       if (x < xmin || x > xmax || y < ymin || y > ymax) {
         continue;
       }
@@ -844,7 +844,7 @@
     }
     for (i = iStartPoint; i < point_count; i++) {
       stream.GetCoords(coords[i].x, coords[i].y);
-      pObject2Bitmap->Transform(coords[i].x, coords[i].y);
+      pObject2Bitmap->TransformPoint(coords[i].x, coords[i].y);
     }
     for (i = iStartColor; i < 4; i++) {
       FX_FLOAT r = 0.0f, g = 0.0f, b = 0.0f;
@@ -2233,7 +2233,7 @@
         FX_FLOAT orig_x, orig_y;
         orig_x = col * pPattern->x_step();
         orig_y = row * pPattern->y_step();
-        mtPattern2Device.Transform(orig_x, orig_y);
+        mtPattern2Device.TransformPoint(orig_x, orig_y);
         CFX_Matrix matrix = *pObj2Device;
         matrix.Translate(orig_x - mtPattern2Device.e,
                          orig_y - mtPattern2Device.f);
@@ -2308,7 +2308,7 @@
       } else {
         FX_FLOAT orig_x = col * pPattern->x_step();
         FX_FLOAT orig_y = row * pPattern->y_step();
-        mtPattern2Device.Transform(orig_x, orig_y);
+        mtPattern2Device.TransformPoint(orig_x, orig_y);
 
         pdfium::base::CheckedNumeric<int> safeStartX =
             FXSYS_round(orig_x + left_offset);
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index e5e0016..55551dc 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -245,7 +245,7 @@
 
       CFX_Matrix matrix_reverse;
       matrix_reverse.SetReverse(matrix);
-      matrix_reverse.Transform(orgX, orgY);
+      matrix_reverse.TransformPoint(orgX, orgY);
       rect.left = info_curchar.m_CharBox.left;
       rect.right = info_curchar.m_CharBox.right;
       if (pCurObj->GetFont()->GetTypeDescent()) {
@@ -253,7 +253,7 @@
                       pCurObj->GetFont()->GetTypeDescent() *
                           pCurObj->GetFontSize() / 1000;
         FX_FLOAT xPosTemp = orgX;
-        matrix.Transform(xPosTemp, rect.bottom);
+        matrix.TransformPoint(xPosTemp, rect.bottom);
       } else {
         rect.bottom = info_curchar.m_CharBox.bottom;
       }
@@ -265,7 +265,7 @@
             orgX +
             GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) *
                 pCurObj->GetFontSize() / 1000;
-        matrix.Transform(xPosTemp, rect.top);
+        matrix.TransformPoint(xPosTemp, rect.top);
       } else {
         rect.top = info_curchar.m_CharBox.top;
       }
@@ -778,11 +778,11 @@
       prev_width > this_width ? prev_width / 4 : this_width / 4;
   FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(),
            prev_y = prev_Obj.m_pTextObj->GetPosY();
-  prev_Obj.m_formMatrix.Transform(prev_x, prev_y);
-  m_DisplayMatrix.Transform(prev_x, prev_y);
+  prev_Obj.m_formMatrix.TransformPoint(prev_x, prev_y);
+  m_DisplayMatrix.TransformPoint(prev_x, prev_y);
   FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();
-  formMatrix.Transform(this_x, this_y);
-  m_DisplayMatrix.Transform(this_x, this_y);
+  formMatrix.TransformPoint(this_x, this_y);
+  m_DisplayMatrix.TransformPoint(this_x, this_y);
   if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {
     for (size_t i = 0; i < count; i++)
       ProcessTextObject(m_LineObj[i]);
@@ -795,8 +795,8 @@
     PDFTEXT_Obj prev_text_obj = m_LineObj[i - 1];
     FX_FLOAT Prev_x = prev_text_obj.m_pTextObj->GetPosX(),
              Prev_y = prev_text_obj.m_pTextObj->GetPosY();
-    prev_text_obj.m_formMatrix.Transform(Prev_x, Prev_y);
-    m_DisplayMatrix.Transform(Prev_x, Prev_y);
+    prev_text_obj.m_formMatrix.TransformPoint(Prev_x, Prev_y);
+    m_DisplayMatrix.TransformPoint(Prev_x, Prev_y);
     if (this_x >= Prev_x) {
       m_LineObj.insert(m_LineObj.begin() + i, Obj);
       break;
@@ -1117,8 +1117,10 @@
         m_TempTextBuf.AppendChar(TEXT_SPACE_CHAR);
         charinfo.m_CharCode = CPDF_Font::kInvalidCharCode;
         charinfo.m_Matrix = formMatrix;
-        matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX,
-                         charinfo.m_OriginY);
+
+        charinfo.m_OriginX = item.m_OriginX;
+        charinfo.m_OriginY = item.m_OriginY;
+        matrix.TransformPoint(charinfo.m_OriginX, charinfo.m_OriginY);
         charinfo.m_CharBox =
             CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY,
                           charinfo.m_OriginX, charinfo.m_OriginY);
@@ -1140,10 +1142,12 @@
       charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;
     else
       charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
+
     charinfo.m_pTextObj = pTextObj;
-    charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;
-    matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX,
-                     charinfo.m_OriginY);
+    charinfo.m_OriginX = item.m_OriginX;
+    charinfo.m_OriginY = item.m_OriginY;
+    matrix.TransformPoint(charinfo.m_OriginX, charinfo.m_OriginY);
+
     FX_RECT rect =
         charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode);
     charinfo.m_CharBox.top =
@@ -1338,8 +1342,8 @@
   prev_reverse.SetReverse(prev_matrix);
   FX_FLOAT x = pObj->GetPosX();
   FX_FLOAT y = pObj->GetPosY();
-  formMatrix.Transform(x, y);
-  prev_reverse.Transform(x, y);
+  formMatrix.TransformPoint(x, y);
+  prev_reverse.TransformPoint(x, y);
   if (last_width < this_width)
     threshold = prev_reverse.TransformDistance(threshold);
   bool bNewline = false;
diff --git a/core/fxcrt/fx_basic_coords.cpp b/core/fxcrt/fx_basic_coords.cpp
index 2664b52..c76e6c9 100644
--- a/core/fxcrt/fx_basic_coords.cpp
+++ b/core/fxcrt/fx_basic_coords.cpp
@@ -6,6 +6,8 @@
 
 #include <limits.h>
 
+#include <algorithm>
+
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_ext.h"
 
@@ -457,33 +459,19 @@
                                FX_FLOAT& right,
                                FX_FLOAT& top,
                                FX_FLOAT& bottom) const {
-  FX_FLOAT x[4], y[4];
-  x[0] = left;
-  y[0] = top;
-  x[1] = left;
-  y[1] = bottom;
-  x[2] = right;
-  y[2] = top;
-  x[3] = right;
-  y[3] = bottom;
-  int i;
-  for (i = 0; i < 4; i++) {
-    Transform(x[i], y[i], x[i], y[i]);
-  }
-  right = left = x[0];
-  top = bottom = y[0];
-  for (i = 1; i < 4; i++) {
-    if (right < x[i]) {
-      right = x[i];
-    }
-    if (left > x[i]) {
-      left = x[i];
-    }
-    if (top < y[i]) {
-      top = y[i];
-    }
-    if (bottom > y[i]) {
-      bottom = y[i];
-    }
+  FX_FLOAT x[4] = {left, left, right, right};
+  FX_FLOAT y[4] = {top, bottom, top, bottom};
+  for (int i = 0; i < 4; i++)
+    TransformPoint(x[i], y[i]);
+
+  right = x[0];
+  left = x[0];
+  top = y[0];
+  bottom = y[0];
+  for (int i = 1; i < 4; i++) {
+    right = std::max(right, x[i]);
+    left = std::min(left, x[i]);
+    top = std::max(top, y[i]);
+    bottom = std::min(bottom, y[i]);
   }
 }
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index 4551a4a..a1638fd 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -675,12 +675,6 @@
   void TransformPoint(FX_FLOAT& x, FX_FLOAT& y) const;
   void TransformPoint(int32_t& x, int32_t& y) const;
 
-  void Transform(FX_FLOAT& x, FX_FLOAT& y) const { TransformPoint(x, y); }
-  void Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const {
-    x1 = x, y1 = y;
-    TransformPoint(x1, y1);
-  }
-
   void TransformVector(CFX_VectorF& v) const;
   void TransformVector(CFX_Vector& v) const;
   void TransformRect(CFX_RectF& rect) const;
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 71d6dba..3ae2c37 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -278,7 +278,7 @@
   for (int i = 0; i < nPoints; i++) {
     FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;
     if (pObject2Device) {
-      pObject2Device->Transform(x, y);
+      pObject2Device->TransformPoint(x, y);
     }
     HardClip(x, y);
     FXPT_TYPE point_type = pPoints[i].m_Type;
@@ -298,9 +298,9 @@
       FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;
       FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;
       if (pObject2Device) {
-        pObject2Device->Transform(x0, y0);
-        pObject2Device->Transform(x2, y2);
-        pObject2Device->Transform(x3, y3);
+        pObject2Device->TransformPoint(x0, y0);
+        pObject2Device->TransformPoint(x2, y2);
+        pObject2Device->TransformPoint(x3, y3);
       }
       HardClip(x0, y0);
       HardClip(x2, y2);
diff --git a/core/fxge/apple/fx_apple_platform.cpp b/core/fxge/apple/fx_apple_platform.cpp
index 6d7fb2e..d686738 100644
--- a/core/fxge/apple/fx_apple_platform.cpp
+++ b/core/fxge/apple/fx_apple_platform.cpp
@@ -41,7 +41,7 @@
 
   FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
   CFX_Matrix new_matrix;
-  new_matrix.Transform(ori_x, ori_y);
+  new_matrix.TransformPoint(ori_x, ori_y);
   if (pObject2Device)
     new_matrix.Concat(*pObject2Device);
 
diff --git a/core/fxge/ge/cfx_pathdata.cpp b/core/fxge/ge/cfx_pathdata.cpp
index d139185..14eabb9 100644
--- a/core/fxge/ge/cfx_pathdata.cpp
+++ b/core/fxge/ge/cfx_pathdata.cpp
@@ -65,8 +65,8 @@
                pSrc->m_PointCount * sizeof(FX_PATHPOINT));
   if (pMatrix) {
     for (int i = 0; i < pSrc->m_PointCount; i++) {
-      pMatrix->Transform(m_pPoints[old_count + i].m_PointX,
-                         m_pPoints[old_count + i].m_PointY);
+      pMatrix->TransformPoint(m_pPoints[old_count + i].m_PointX,
+                              m_pPoints[old_count + i].m_PointY);
     }
   }
 }
@@ -316,7 +316,7 @@
     return;
   }
   for (int i = 0; i < m_PointCount; i++) {
-    pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+    pMatrix->TransformPoint(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
   }
 }
 
@@ -497,9 +497,9 @@
 bool CFX_PathData::IsRect(const CFX_Matrix* pMatrix,
                           CFX_FloatRect* pRect) const {
   if (!pMatrix) {
-    if (!IsRect()) {
+    if (!IsRect())
       return false;
-    }
+
     if (pRect) {
       pRect->left = m_pPoints[0].m_PointX;
       pRect->right = m_pPoints[2].m_PointX;
@@ -509,9 +509,10 @@
     }
     return true;
   }
-  if (m_PointCount != 5 && m_PointCount != 4) {
+
+  if (m_PointCount != 5 && m_PointCount != 4)
     return false;
-  }
+
   if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
                              m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
       (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX &&
@@ -522,19 +523,21 @@
       m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
     return false;
   }
-  FX_FLOAT x[5], y[5];
+
+  FX_FLOAT x[5];
+  FX_FLOAT y[5];
   for (int i = 0; i < m_PointCount; i++) {
-    pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i],
-                       y[i]);
+    x[i] = m_pPoints[i].m_PointX;
+    y[i] = m_pPoints[i].m_PointY;
+    pMatrix->TransformPoint(x[i], y[i]);
     if (i) {
-      if (m_pPoints[i].m_Type != FXPT_TYPE::LineTo) {
+      if (m_pPoints[i].m_Type != FXPT_TYPE::LineTo)
         return false;
-      }
-      if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
+      if (x[i] != x[i - 1] && y[i] != y[i - 1])
         return false;
-      }
     }
   }
+
   if (pRect) {
     pRect->left = x[0];
     pRect->right = x[2];
diff --git a/core/fxge/ge/cfx_renderdevice.cpp b/core/fxge/ge/cfx_renderdevice.cpp
index 52ed8c3..0c73c7a 100644
--- a/core/fxge/ge/cfx_renderdevice.cpp
+++ b/core/fxge/ge/cfx_renderdevice.cpp
@@ -475,21 +475,18 @@
   uint8_t fill_alpha = (fill_mode & 3) ? FXARGB_A(fill_color) : 0;
   if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
     FX_PATHPOINT* pPoints = pPathData->GetPoints();
-    FX_FLOAT x1, x2, y1, y2;
+    FX_FLOAT x1 = pPoints[0].m_PointX;
+    FX_FLOAT y1 = pPoints[0].m_PointY;
+    FX_FLOAT x2 = pPoints[1].m_PointX;
+    FX_FLOAT y2 = pPoints[1].m_PointY;
     if (pObject2Device) {
-      pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1,
-                                y1);
-      pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2,
-                                y2);
-    } else {
-      x1 = pPoints[0].m_PointX;
-      y1 = pPoints[0].m_PointY;
-      x2 = pPoints[1].m_PointX;
-      y2 = pPoints[1].m_PointY;
+      pObject2Device->TransformPoint(x1, y1);
+      pObject2Device->TransformPoint(x2, y2);
     }
     DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, blend_type);
     return true;
   }
+
   if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&
       stroke_alpha == 0) {
     CFX_FloatRect rect_f;
@@ -913,7 +910,7 @@
     const FXTEXT_CHARPOS& charpos = pCharPos[i];
     glyph.m_fOriginX = charpos.m_OriginX;
     glyph.m_fOriginY = charpos.m_OriginY;
-    text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
+    text2Device.TransformPoint(glyph.m_fOriginX, glyph.m_fOriginY);
     if (anti_alias < FXFT_RENDER_MODE_LCD)
       glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
     else
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp
index 2e4519c..7fc47b9 100644
--- a/core/fxge/win32/cfx_psrenderer.cpp
+++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -117,9 +117,9 @@
     bool closing = pPathData->IsClosingFigure(i);
     FX_FLOAT x = pPathData->GetPointX(i);
     FX_FLOAT y = pPathData->GetPointY(i);
-    if (pObject2Device) {
-      pObject2Device->Transform(x, y);
-    }
+    if (pObject2Device)
+      pObject2Device->TransformPoint(x, y);
+
     buf << x << " " << y;
     switch (type) {
       case FXPT_TYPE::MoveTo:
@@ -136,8 +136,8 @@
         FX_FLOAT y1 = pPathData->GetPointY(i + 1);
         FX_FLOAT y2 = pPathData->GetPointY(i + 2);
         if (pObject2Device) {
-          pObject2Device->Transform(x1, y1);
-          pObject2Device->Transform(x2, y2);
+          pObject2Device->TransformPoint(x1, y1);
+          pObject2Device->TransformPoint(x2, y2);
         }
         buf << " " << x1 << " " << y1 << " " << x2 << " " << y2 << " c";
         if (closing)
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index c8ceacf..3df38f1 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -170,9 +170,9 @@
   FX_PATHPOINT* pPoints = pPathData->GetPoints();
   for (int i = 0; i < nPoints; i++) {
     FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;
-    if (pMatrix) {
-      pMatrix->Transform(posx, posy);
-    }
+    if (pMatrix)
+      pMatrix->TransformPoint(posx, posy);
+
     int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);
     FXPT_TYPE point_type = pPoints[i].m_Type;
     if (point_type == FXPT_TYPE::MoveTo) {
@@ -189,16 +189,16 @@
       lppt[0].y = screen_y;
       posx = pPoints[i + 1].m_PointX;
       posy = pPoints[i + 1].m_PointY;
-      if (pMatrix) {
-        pMatrix->Transform(posx, posy);
-      }
+      if (pMatrix)
+        pMatrix->TransformPoint(posx, posy);
+
       lppt[1].x = FXSYS_round(posx);
       lppt[1].y = FXSYS_round(posy);
       posx = pPoints[i + 2].m_PointX;
       posy = pPoints[i + 2].m_PointY;
-      if (pMatrix) {
-        pMatrix->Transform(posx, posy);
-      }
+      if (pMatrix)
+        pMatrix->TransformPoint(posx, posy);
+
       lppt[2].x = FXSYS_round(posx);
       lppt[2].y = FXSYS_round(posy);
       PolyBezierTo(hDC, lppt, 3);
@@ -1056,8 +1056,8 @@
     FX_FLOAT x2 = pPathData->GetPointX(1);
     FX_FLOAT y2 = pPathData->GetPointY(1);
     if (pMatrix) {
-      pMatrix->Transform(x1, y1);
-      pMatrix->Transform(x2, y2);
+      pMatrix->TransformPoint(x1, y1);
+      pMatrix->TransformPoint(x2, y2);
     }
     DrawLine(x1, y1, x2, y2);
   } else {
diff --git a/core/fxge/win32/fx_win32_gdipext.cpp b/core/fxge/win32/fx_win32_gdipext.cpp
index 65f7b3e..c703e3e 100644
--- a/core/fxge/win32/fx_win32_gdipext.cpp
+++ b/core/fxge/win32/fx_win32_gdipext.cpp
@@ -1083,8 +1083,8 @@
     FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
     FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
     if (pMatrix) {
-      pMatrix->Transform(x1, y1);
-      pMatrix->Transform(x2, y2);
+      pMatrix->TransformPoint(x1, y1);
+      pMatrix->TransformPoint(x2, y2);
     }
     FX_FLOAT dx = x1 - x2;
     FX_FLOAT dy = y1 - y2;
@@ -1132,25 +1132,20 @@
   for (int i = 0; i < nPoints; i++) {
     points[i].X = pPoints[i].m_PointX;
     points[i].Y = pPoints[i].m_PointY;
-    FX_FLOAT x, y;
-    if (pObject2Device) {
-      pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
-    } else {
-      x = pPoints[i].m_PointX;
-      y = pPoints[i].m_PointY;
-    }
-    if (x > 50000 * 1.0f) {
+    FX_FLOAT x = pPoints[i].m_PointX;
+    FX_FLOAT y = pPoints[i].m_PointY;
+    if (pObject2Device)
+      pObject2Device->TransformPoint(x, y);
+
+    if (x > 50000 * 1.0f)
       points[i].X = 50000 * 1.0f;
-    }
-    if (x < -50000 * 1.0f) {
+    if (x < -50000 * 1.0f)
       points[i].X = -50000 * 1.0f;
-    }
-    if (y > 50000 * 1.0f) {
+    if (y > 50000 * 1.0f)
       points[i].Y = 50000 * 1.0f;
-    }
-    if (y < -50000 * 1.0f) {
+    if (y < -50000 * 1.0f)
       points[i].Y = -50000 * 1.0f;
-    }
+
     FXPT_TYPE point_type = pPoints[i].m_Type;
     if (point_type == FXPT_TYPE::MoveTo) {
       types[i] = PathPointTypeStart;
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index f38be4c..b897a3e 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -46,14 +46,13 @@
   CFX_Matrix device2page;
   device2page.SetReverse(page2device);
 
-  FX_FLOAT left;
-  FX_FLOAT top;
-  FX_FLOAT right;
-  FX_FLOAT bottom;
-  device2page.Transform(static_cast<FX_FLOAT>(rect.left),
-                        static_cast<FX_FLOAT>(rect.top), left, top);
-  device2page.Transform(static_cast<FX_FLOAT>(rect.right),
-                        static_cast<FX_FLOAT>(rect.bottom), right, bottom);
+  FX_FLOAT left = static_cast<FX_FLOAT>(rect.left);
+  FX_FLOAT top = static_cast<FX_FLOAT>(rect.top);
+  FX_FLOAT right = static_cast<FX_FLOAT>(rect.right);
+  FX_FLOAT bottom = static_cast<FX_FLOAT>(rect.bottom);
+  device2page.TransformPoint(left, top);
+  device2page.TransformPoint(right, bottom);
+
   CFX_FloatRect rcPDF(left, bottom, right, top);
   rcPDF.Normalize();
 
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 1086906..1af4703 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -841,24 +841,18 @@
   if (!m_pInterForm->IsNeedHighLight(nFieldType))
     return;
 
-  CFX_FloatRect rc = GetRect();
-  FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);
-  uint8_t alpha = m_pInterForm->GetHighlightAlpha();
-
-  CFX_FloatRect rcDevice;
   CFX_Matrix page2device;
   pPageView->GetCurrentMatrix(page2device);
-  page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom),
-                        rcDevice.left, rcDevice.bottom);
-  page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top),
-                        rcDevice.right, rcDevice.top);
 
+  CFX_FloatRect rcDevice = GetRect();
+  page2device.TransformPoint(rcDevice.left, rcDevice.bottom);
+  page2device.TransformPoint(rcDevice.right, rcDevice.top);
   rcDevice.Normalize();
 
-  FX_ARGB argb = ArgbEncode((int)alpha, color);
-  FX_RECT rcDev((int)rcDevice.left, (int)rcDevice.top, (int)rcDevice.right,
-                (int)rcDevice.bottom);
-  pDevice->FillRect(&rcDev, argb);
+  FX_RECT rcDev = rcDevice.ToFxRect();
+  pDevice->FillRect(
+      &rcDev, ArgbEncode(static_cast<int>(m_pInterForm->GetHighlightAlpha()),
+                         m_pInterForm->GetHighlightColor(nFieldType)));
 }
 
 void CPDFSDK_Widget::ResetAppearance_PushButton() {
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 71feb54..9ccca2b 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -488,8 +488,7 @@
   mt.SetReverse(GetCurMatrix());
 
   CFX_FloatPoint pt = point;
-  mt.Transform(pt.x, pt.y);
-
+  mt.TransformPoint(pt.x, pt.y);
   return pt;
 }
 
@@ -497,8 +496,7 @@
   CFX_Matrix mt = GetCurMatrix();
 
   CFX_FloatPoint pt = point;
-  mt.Transform(pt.x, pt.y);
-
+  mt.TransformPoint(pt.x, pt.y);
   return pt;
 }
 
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 2c2f25a..57d5d4d 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -855,10 +855,10 @@
   CFX_Matrix device2page;
   device2page.SetReverse(page2device);
 
-  FX_FLOAT page_x_f;
-  FX_FLOAT page_y_f;
-  device2page.Transform(static_cast<FX_FLOAT>(device_x),
-                        static_cast<FX_FLOAT>(device_y), page_x_f, page_y_f);
+  FX_FLOAT page_x_f = static_cast<FX_FLOAT>(device_x);
+  FX_FLOAT page_y_f = static_cast<FX_FLOAT>(device_y);
+  device2page.TransformPoint(page_x_f, page_y_f);
+
   *page_x = page_x_f;
   *page_y = page_y_f;
 #endif  // PDF_ENABLE_XFA
@@ -885,10 +885,10 @@
 #else   // PDF_ENABLE_XFA
   CFX_Matrix page2device =
       pPage->GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate);
-  FX_FLOAT device_x_f;
-  FX_FLOAT device_y_f;
-  page2device.Transform(static_cast<FX_FLOAT>(page_x),
-                        static_cast<FX_FLOAT>(page_y), device_x_f, device_y_f);
+  FX_FLOAT device_x_f = static_cast<FX_FLOAT>(page_x);
+  FX_FLOAT device_y_f = static_cast<FX_FLOAT>(page_y);
+  page2device.TransformPoint(device_x_f, device_y_f);
+
   *device_x = FXSYS_round(device_x_f);
   *device_y = FXSYS_round(device_y_f);
 #endif  // PDF_ENABLE_XFA
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index f39a010..b708a36 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -154,13 +154,13 @@
   if (!m_pPDFPage && !m_pXFAPageView)
     return;
 
-  FX_FLOAT page_x_f, page_y_f;
-
   CFX_Matrix device2page;
   device2page.SetReverse(
       GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate));
-  device2page.Transform(static_cast<FX_FLOAT>(device_x),
-                        static_cast<FX_FLOAT>(device_y), page_x_f, page_y_f);
+
+  FX_FLOAT page_x_f = static_cast<FX_FLOAT>(device_x);
+  FX_FLOAT page_y_f = static_cast<FX_FLOAT>(device_y);
+  device2page.TransformPoint(page_x_f, page_y_f);
 
   *page_x = page_x_f;
   *page_y = page_y_f;
@@ -178,13 +178,12 @@
   if (!m_pPDFPage && !m_pXFAPageView)
     return;
 
-  FX_FLOAT device_x_f;
-  FX_FLOAT device_y_f;
-
   CFX_Matrix page2device =
       GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate);
-  page2device.Transform(static_cast<FX_FLOAT>(page_x),
-                        static_cast<FX_FLOAT>(page_y), device_x_f, device_y_f);
+
+  FX_FLOAT device_x_f = static_cast<FX_FLOAT>(page_x);
+  FX_FLOAT device_y_f = static_cast<FX_FLOAT>(page_y);
+  page2device.TransformPoint(device_x_f, device_y_f);
 
   *device_x = FXSYS_round(device_x_f);
   *device_y = FXSYS_round(device_y_f);
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 690f042..1942232 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -66,7 +66,7 @@
                     FX_ARGB crTextStroke,
                     int32_t nHorzScale) {
   FX_FLOAT x = pt.x, y = pt.y;
-  pUser2Device->Transform(x, y);
+  pUser2Device->TransformPoint(x, y);
 
   if (pFont) {
     if (nHorzScale != 100) {
@@ -80,8 +80,8 @@
       if (crTextStroke != 0) {
         CFX_FloatPoint pt1;
         CFX_FloatPoint pt2;
-        pUser2Device->Transform(pt1.x, pt1.y);
-        pUser2Device->Transform(pt2.x, pt2.y);
+        pUser2Device->TransformPoint(pt1.x, pt1.y);
+        pUser2Device->TransformPoint(pt2.x, pt2.y);
         CFX_GraphStateData gsd;
         gsd.m_LineWidth =
             (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
@@ -101,8 +101,8 @@
       if (crTextStroke != 0) {
         CFX_FloatPoint pt1;
         CFX_FloatPoint pt2;
-        pUser2Device->Transform(pt1.x, pt1.y);
-        pUser2Device->Transform(pt2.x, pt2.y);
+        pUser2Device->TransformPoint(pt1.x, pt1.y);
+        pUser2Device->TransformPoint(pt2.x, pt2.y);
         CFX_GraphStateData gsd;
         gsd.m_LineWidth =
             (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
diff --git a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
index 9459215..90b7a3c 100644
--- a/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
+++ b/fpdfsdk/pdfwindow/PWL_EditCtrl.cpp
@@ -43,8 +43,8 @@
   CFX_FloatPoint point1(0, 1);
   CFX_FloatPoint point2(1, 1);
 
-  mt.Transform(point1.x, point1.y);
-  mt.Transform(point2.x, point2.y);
+  mt.TransformPoint(point1.x, point1.y);
+  mt.TransformPoint(point2.x, point2.y);
 
   return point2.y == point1.y;
 }
diff --git a/fpdfsdk/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/pdfwindow/PWL_Wnd.cpp
index 8fd7b16..1170660 100644
--- a/fpdfsdk/pdfwindow/PWL_Wnd.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Wnd.cpp
@@ -855,7 +855,7 @@
                         int32_t& y) const {
   CFX_Matrix mt = GetWindowMatrix();
   CFX_FloatPoint pt = point;
-  mt.Transform(pt.x, pt.y);
+  mt.TransformPoint(pt.x, pt.y);
   x = (int32_t)(pt.x + 0.5);
   y = (int32_t)(pt.y + 0.5);
 }
@@ -874,7 +874,7 @@
     return point;
 
   CFX_FloatPoint pt = point;
-  mt.Transform(pt.x, pt.y);
+  mt.TransformPoint(pt.x, pt.y);
   return pt;
 }
 
@@ -895,7 +895,7 @@
 
   mt.SetReverse(mt);
   CFX_FloatPoint pt = point;
-  mt.Transform(pt.x, pt.y);
+  mt.TransformPoint(pt.x, pt.y);
   return pt;
 }
 
diff --git a/third_party/agg23/agg_rasterizer_scanline_aa.h b/third_party/agg23/agg_rasterizer_scanline_aa.h
index 77e04ed..3cf1822 100644
--- a/third_party/agg23/agg_rasterizer_scanline_aa.h
+++ b/third_party/agg23/agg_rasterizer_scanline_aa.h
@@ -390,10 +390,9 @@
         unsigned cmd;
         vs.rewind(path_id);
         while(!is_stop(cmd = vs.vertex(&x, &y))) {
-            if (pMatrix) {
-                pMatrix->Transform(x, y);
-            }
-            add_vertex(x, y, cmd);
+          if (pMatrix)
+            pMatrix->TransformPoint(x, y);
+          add_vertex(x, y, cmd);
         }
     }
 private: