Cleanup CFX_Matrix related methods

This CL removes unused CFX_Matrix methods and cleans up the implementaion
of others.

Change-Id: I72d1d10d4a45cc9341a980054df5225e52a0c4f2
Reviewed-on: https://pdfium-review.googlesource.com/2574
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_textobject.cpp b/core/fpdfapi/page/cpdf_textobject.cpp
index 503ea78..1534bc6 100644
--- a/core/fpdfapi/page/cpdf_textobject.cpp
+++ b/core/fpdfapi/page/cpdf_textobject.cpp
@@ -138,12 +138,12 @@
   text_matrix.Concat(matrix);
 
   FX_FLOAT* pTextMatrix = m_TextState.GetMutableMatrix();
-  pTextMatrix[0] = text_matrix.GetA();
-  pTextMatrix[1] = text_matrix.GetC();
-  pTextMatrix[2] = text_matrix.GetB();
-  pTextMatrix[3] = text_matrix.GetD();
-  m_PosX = text_matrix.GetE();
-  m_PosY = text_matrix.GetF();
+  pTextMatrix[0] = text_matrix.a;
+  pTextMatrix[1] = text_matrix.c;
+  pTextMatrix[2] = text_matrix.b;
+  pTextMatrix[3] = text_matrix.d;
+  m_PosX = text_matrix.e;
+  m_PosY = text_matrix.f;
   CalcPositionData(nullptr, nullptr, 0);
 }
 
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 4977c99..927b106 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -397,12 +397,12 @@
     for (size_t j = 0; j < 6; ++j)
       arr->AddNew<CPDF_Number>(elems[i][j]);
     CFX_Matrix arr_matrix = arr->GetMatrix();
-    EXPECT_EQ(matrix.GetA(), arr_matrix.GetA());
-    EXPECT_EQ(matrix.GetB(), arr_matrix.GetB());
-    EXPECT_EQ(matrix.GetC(), arr_matrix.GetC());
-    EXPECT_EQ(matrix.GetD(), arr_matrix.GetD());
-    EXPECT_EQ(matrix.GetE(), arr_matrix.GetE());
-    EXPECT_EQ(matrix.GetF(), arr_matrix.GetF());
+    EXPECT_EQ(matrix.a, arr_matrix.a);
+    EXPECT_EQ(matrix.b, arr_matrix.b);
+    EXPECT_EQ(matrix.c, arr_matrix.c);
+    EXPECT_EQ(matrix.d, arr_matrix.d);
+    EXPECT_EQ(matrix.e, arr_matrix.e);
+    EXPECT_EQ(matrix.f, arr_matrix.f);
   }
 }
 
diff --git a/core/fpdfapi/render/cpdf_devicebuffer.cpp b/core/fpdfapi/render/cpdf_devicebuffer.cpp
index a1ad598..dec1343 100644
--- a/core/fpdfapi/render/cpdf_devicebuffer.cpp
+++ b/core/fpdfapi/render/cpdf_devicebuffer.cpp
@@ -28,7 +28,7 @@
   m_pContext = pContext;
   m_Rect = *pRect;
   m_pObject = pObj;
-  m_Matrix.TranslateI(-pRect->left, -pRect->top);
+  m_Matrix.Translate(-pRect->left, -pRect->top);
 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
   int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
   int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index ad713d0..358d13e 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -239,7 +239,7 @@
 
 CFX_Matrix CPDF_ImageRenderer::GetDrawMatrix(const FX_RECT& rect) const {
   CFX_Matrix new_matrix = m_ImageMatrix;
-  new_matrix.TranslateI(-rect.left, -rect.top);
+  new_matrix.Translate(-rect.left, -rect.top);
   return new_matrix;
 }
 
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 813ff37..b8fd7c7 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1531,7 +1531,7 @@
   CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
   bitmap->Clear(0);
   CFX_Matrix new_matrix = *pObj2Device;
-  new_matrix.TranslateI(-rect.left, -rect.top);
+  new_matrix.Translate(-rect.left, -rect.top);
   new_matrix.Scale(scaleX, scaleY);
   std::unique_ptr<CFX_DIBitmap> pTextMask;
   if (bTextClip) {
@@ -1633,7 +1633,7 @@
   }
 
   CFX_Matrix FinalMatrix = m_DeviceMatrix;
-  FinalMatrix.TranslateI(-left, -top);
+  FinalMatrix.Translate(-left, -top);
   FinalMatrix.Scale(scaleX, scaleY);
   pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
   CFX_FxgeDevice device;
@@ -1877,7 +1877,7 @@
                           pFormResource, false, pType3Char, fill_argb);
         status.m_Type3FontCache = m_Type3FontCache;
         status.m_Type3FontCache.push_back(pType3Font);
-        matrix.TranslateI(-rect.left, -rect.top);
+        matrix.Translate(-rect.left, -rect.top);
         matrix.Scale(sa, sd);
         status.RenderObjectList(pType3Char->m_pForm.get(), &matrix);
         m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);
@@ -2524,7 +2524,7 @@
     pFunc = CPDF_Function::Load(pFuncObj);
 
   CFX_Matrix matrix = *pMatrix;
-  matrix.TranslateI(-pClipRect->left, -pClipRect->top);
+  matrix.Translate(-pClipRect->left, -pClipRect->top);
 
   CPDF_Form form(m_pContext->GetDocument(), m_pContext->GetPageResources(),
                  pGroup);
diff --git a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
index bcc03ba..de60e73 100644
--- a/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
+++ b/core/fpdfapi/render/cpdf_scaledrenderbuffer.cpp
@@ -31,7 +31,7 @@
   m_pContext = pContext;
   m_Rect = pRect;
   m_pObject = pObj;
-  m_Matrix.TranslateI(-pRect.left, -pRect.top);
+  m_Matrix.Translate(-pRect.left, -pRect.top);
   int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
   int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
   if (horz_size && vert_size && max_dpi) {
diff --git a/core/fxcrt/fx_basic_coords.cpp b/core/fxcrt/fx_basic_coords.cpp
index c76e6c9..e8abace 100644
--- a/core/fxcrt/fx_basic_coords.cpp
+++ b/core/fxcrt/fx_basic_coords.cpp
@@ -11,6 +11,21 @@
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_ext.h"
 
+namespace {
+
+void MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int* i1, int* i2) {
+  int length = static_cast<int>(FXSYS_ceil(f2 - f1));
+  int i1_1 = static_cast<int>(FXSYS_floor(f1));
+  int i1_2 = static_cast<int>(FXSYS_ceil(f1));
+  FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);
+  FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);
+
+  *i1 = (error1 > error2) ? i1_2 : i1_1;
+  *i2 = *i1 + length;
+}
+
+}  // namespace
+
 void FX_RECT::Normalize() {
   if (left > right) {
     int temp = left;
@@ -150,6 +165,7 @@
   }
   return nRects;
 }
+
 FX_RECT CFX_FloatRect::GetOuterRect() const {
   CFX_FloatRect rect1 = *this;
   FX_RECT rect;
@@ -160,6 +176,7 @@
   rect.Normalize();
   return rect;
 }
+
 FX_RECT CFX_FloatRect::GetInnerRect() const {
   CFX_FloatRect rect1 = *this;
   FX_RECT rect;
@@ -170,20 +187,12 @@
   rect.Normalize();
   return rect;
 }
-static void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2) {
-  int length = (int)FXSYS_ceil(f2 - f1);
-  int i1_1 = (int)FXSYS_floor(f1);
-  int i1_2 = (int)FXSYS_ceil(f1);
-  FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);
-  FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);
-  i1 = (error1 > error2) ? i1_2 : i1_1;
-  i2 = i1 + length;
-}
+
 FX_RECT CFX_FloatRect::GetClosestRect() const {
   CFX_FloatRect rect1 = *this;
   FX_RECT rect;
-  _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);
-  _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);
+  MatchFloatRange(rect1.left, rect1.right, &rect.left, &rect.right);
+  MatchFloatRange(rect1.bottom, rect1.top, &rect.top, &rect.bottom);
   rect.Normalize();
   return rect;
 }
@@ -204,47 +213,34 @@
 }
 
 void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y) {
-  if (left > x) {
-    left = x;
-  }
-  if (right < x) {
-    right = x;
-  }
-  if (bottom > y) {
-    bottom = y;
-  }
-  if (top < y) {
-    top = y;
-  }
+  left = std::min(left, x);
+  right = std::max(right, x);
+  bottom = std::min(bottom, y);
+  top = std::max(top, y);
 }
+
 CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_PointF* pPoints, int nPoints) {
-  if (nPoints == 0) {
+  if (nPoints == 0)
     return CFX_FloatRect();
-  }
-  FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y,
-           max_y = pPoints->y;
+
+  FX_FLOAT min_x = pPoints->x;
+  FX_FLOAT max_x = pPoints->x;
+  FX_FLOAT min_y = pPoints->y;
+  FX_FLOAT max_y = pPoints->y;
   for (int i = 1; i < nPoints; i++) {
-    if (min_x > pPoints[i].x) {
-      min_x = pPoints[i].x;
-    }
-    if (max_x < pPoints[i].x) {
-      max_x = pPoints[i].x;
-    }
-    if (min_y > pPoints[i].y) {
-      min_y = pPoints[i].y;
-    }
-    if (max_y < pPoints[i].y) {
-      max_y = pPoints[i].y;
-    }
+    min_x = std::min(min_x, pPoints[i].x);
+    max_x = std::max(max_x, pPoints[i].x);
+    min_y = std::min(min_y, pPoints[i].y);
+    max_y = std::max(max_y, pPoints[i].y);
   }
   return CFX_FloatRect(min_x, min_y, max_x, max_y);
 }
 
 void CFX_Matrix::SetReverse(const CFX_Matrix& m) {
   FX_FLOAT i = m.a * m.d - m.b * m.c;
-  if (FXSYS_fabs(i) == 0) {
+  if (FXSYS_fabs(i) == 0)
     return;
-  }
+
   FX_FLOAT j = -i;
   a = m.d / i;
   b = m.b / j;
@@ -253,70 +249,57 @@
   e = (m.c * m.f - m.d * m.e) / i;
   f = (m.a * m.f - m.b * m.e) / j;
 }
-static void FXCRT_Matrix_Concat(CFX_Matrix& m,
-                                const CFX_Matrix& m1,
-                                const CFX_Matrix& m2) {
-  FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;
-  FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;
-  FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;
-  FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;
-  FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;
-  FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;
-  m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;
-}
 
 void CFX_Matrix::Concat(const CFX_Matrix& m, bool bPrepended) {
-  if (bPrepended) {
-    FXCRT_Matrix_Concat(*this, m, *this);
-  } else {
-    FXCRT_Matrix_Concat(*this, *this, m);
-  }
+  ConcatInternal(m, bPrepended);
 }
+
 void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, bool bPrepended) {
   CFX_Matrix m;
   m.SetReverse(src);
   Concat(m, bPrepended);
 }
-bool CFX_Matrix::IsInvertible() const {
-  return FXSYS_fabs(a * d - b * c) >= 0.0001f;
-}
+
 bool CFX_Matrix::Is90Rotated() const {
   return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) &&
          FXSYS_fabs(d * 1000) < FXSYS_fabs(c);
 }
+
 bool CFX_Matrix::IsScaled() const {
   return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) &&
          FXSYS_fabs(c * 1000) < FXSYS_fabs(d);
 }
+
 void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, bool bPrepended) {
   if (bPrepended) {
     e += x * a + y * c;
     f += y * d + x * b;
-  } else {
-    e += x, f += y;
+    return;
   }
+  e += x;
+  f += y;
 }
+
 void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, bool bPrepended) {
-  a *= sx, d *= sy;
+  a *= sx;
+  d *= sy;
   if (bPrepended) {
     b *= sx;
     c *= sy;
-  } else {
-    b *= sy;
-    c *= sx;
-    e *= sx;
-    f *= sy;
+    return;
   }
+
+  b *= sy;
+  c *= sx;
+  e *= sx;
+  f *= sy;
 }
 
 void CFX_Matrix::Rotate(FX_FLOAT fRadian, bool bPrepended) {
   FX_FLOAT cosValue = FXSYS_cos(fRadian);
   FX_FLOAT sinValue = FXSYS_sin(fRadian);
-  CFX_Matrix m(cosValue, sinValue, -sinValue, cosValue, 0, 0);
-  if (bPrepended)
-    FXCRT_Matrix_Concat(*this, m, *this);
-  else
-    FXCRT_Matrix_Concat(*this, *this, m);
+  ConcatInternal(CFX_Matrix(cosValue, sinValue, -sinValue, cosValue, 0, 0),
+                 bPrepended);
 }
 
 void CFX_Matrix::RotateAt(FX_FLOAT fRadian,
@@ -331,17 +314,16 @@
 void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian,
                        FX_FLOAT fBetaRadian,
                        bool bPrepended) {
-  CFX_Matrix m(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);
-  if (bPrepended)
-    FXCRT_Matrix_Concat(*this, m, *this);
-  else
-    FXCRT_Matrix_Concat(*this, *this, m);
+  ConcatInternal(
+      CFX_Matrix(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0),
+      bPrepended);
 }
 
 void CFX_Matrix::MatchRect(const CFX_FloatRect& dest,
                            const CFX_FloatRect& src) {
   FX_FLOAT fDiff = src.left - src.right;
   a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;
+
   fDiff = src.bottom - src.top;
   d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;
   e = dest.left - src.left * a;
@@ -349,90 +331,50 @@
   b = 0;
   c = 0;
 }
+
 FX_FLOAT CFX_Matrix::GetXUnit() const {
-  if (b == 0) {
+  if (b == 0)
     return (a > 0 ? a : -a);
-  }
-  if (a == 0) {
+  if (a == 0)
     return (b > 0 ? b : -b);
-  }
   return FXSYS_sqrt(a * a + b * b);
 }
+
 FX_FLOAT CFX_Matrix::GetYUnit() const {
-  if (c == 0) {
+  if (c == 0)
     return (d > 0 ? d : -d);
-  }
-  if (d == 0) {
+  if (d == 0)
     return (c > 0 ? c : -c);
-  }
   return FXSYS_sqrt(c * c + d * d);
 }
-void CFX_Matrix::GetUnitRect(CFX_RectF& rect) const {
-  rect.left = rect.top = 0;
-  rect.width = rect.height = 1;
-  TransformRect(rect);
-}
+
 CFX_FloatRect CFX_Matrix::GetUnitRect() const {
   CFX_FloatRect rect(0, 0, 1, 1);
   TransformRect(rect);
   return rect;
 }
-FX_FLOAT CFX_Matrix::GetUnitArea() const {
-  FX_FLOAT A = FXSYS_sqrt(a * a + b * b);
-  FX_FLOAT B = FXSYS_sqrt(c * c + d * d);
-  FX_FLOAT ac = a + c, bd = b + d;
-  FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);
-  FX_FLOAT P = (A + B + C) / 2;
-  return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;
-}
+
 FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const {
-  FX_FLOAT fx = a * dx, fy = b * dx;
+  FX_FLOAT fx = a * dx;
+  FX_FLOAT fy = b * dx;
   return FXSYS_sqrt(fx * fx + fy * fy);
 }
-int32_t CFX_Matrix::TransformXDistance(int32_t dx) const {
-  FX_FLOAT fx = a * dx, fy = b * dx;
-  return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
-FX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const {
-  FX_FLOAT fx = c * dy, fy = d * dy;
-  return FXSYS_sqrt(fx * fx + fy * fy);
-}
-int32_t CFX_Matrix::TransformYDistance(int32_t dy) const {
-  FX_FLOAT fx = c * dy, fy = d * dy;
-  return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
+
 FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const {
-  FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
+  FX_FLOAT fx = a * dx + c * dy;
+  FX_FLOAT fy = b * dx + d * dy;
   return FXSYS_sqrt(fx * fx + fy * fy);
 }
-int32_t CFX_Matrix::TransformDistance(int32_t dx, int32_t dy) const {
-  FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
-  return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
-}
+
 FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const {
   return distance * (GetXUnit() + GetYUnit()) / 2;
 }
-void CFX_Matrix::TransformVector(CFX_VectorF& v) const {
-  FX_FLOAT fx = a * v.x + c * v.y;
-  FX_FLOAT fy = b * v.x + d * v.y;
-  v.x = fx, v.y = fy;
-}
-void CFX_Matrix::TransformVector(CFX_Vector& v) const {
-  FX_FLOAT fx = a * v.x + c * v.y;
-  FX_FLOAT fy = b * v.x + d * v.y;
-  v.x = FXSYS_round(fx);
-  v.y = FXSYS_round(fy);
-}
+
 void CFX_Matrix::TransformPoint(FX_FLOAT& x, FX_FLOAT& y) const {
   FX_FLOAT fx = a * x + c * y + e;
   FX_FLOAT fy = b * x + d * y + f;
-  x = fx, y = fy;
-}
-void CFX_Matrix::TransformPoint(int32_t& x, int32_t& y) const {
-  FX_FLOAT fx = a * x + c * y + e;
-  FX_FLOAT fy = b * x + d * y + f;
-  x = FXSYS_round(fx);
-  y = FXSYS_round(fy);
+  x = fx;
+  y = fy;
 }
 
 void CFX_Matrix::TransformRect(CFX_RectF& rect) const {
@@ -442,19 +384,6 @@
   rect.height = bottom - rect.top;
 }
 
-void CFX_Matrix::TransformRect(CFX_Rect& rect) const {
-  FX_FLOAT left = (FX_FLOAT)rect.left;
-  FX_FLOAT top = (FX_FLOAT)rect.bottom();
-  FX_FLOAT right = (FX_FLOAT)rect.right();
-  FX_FLOAT bottom = (FX_FLOAT)rect.top;
-
-  TransformRect(left, right, top, bottom);
-  rect.left = FXSYS_round(left);
-  rect.top = FXSYS_round(bottom);
-  rect.width = FXSYS_round(right - left);
-  rect.height = FXSYS_round(top - bottom);
-}
-
 void CFX_Matrix::TransformRect(FX_FLOAT& left,
                                FX_FLOAT& right,
                                FX_FLOAT& top,
@@ -475,3 +404,22 @@
     bottom = std::min(bottom, y[i]);
   }
 }
+
+void CFX_Matrix::ConcatInternal(const CFX_Matrix& other, bool prepend) {
+  CFX_Matrix left;
+  CFX_Matrix right;
+  if (prepend) {
+    left = other;
+    right = *this;
+  } else {
+    left = *this;
+    right = other;
+  }
+
+  a = left.a * right.a + left.b * right.c;
+  b = left.a * right.b + left.b * right.d;
+  c = left.c * right.a + left.d * right.c;
+  d = left.c * right.b + left.d * right.d;
+  e = left.e * right.a + left.f * right.c + right.e;
+  f = left.e * right.b + left.f * right.d + right.f;
+}
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index a1638fd..c9e5433 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -602,6 +602,7 @@
         d(other.d),
         e(other.e),
         f(other.f) {}
+
   CFX_Matrix(FX_FLOAT a1,
              FX_FLOAT b1,
              FX_FLOAT c1,
@@ -637,13 +638,13 @@
     return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;
   }
 
-  bool IsInvertible() const;
   bool Is90Rotated() const;
   bool IsScaled() const;
+  bool WillScale() const { return a != 1.0f || b != 0 || c != 0 || d != 1.0f; }
 
   void Translate(FX_FLOAT x, FX_FLOAT y, bool bPrepended = false);
-  void TranslateI(int32_t x, int32_t y, bool bPrepended = false) {
-    Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);
+  void Translate(int32_t x, int32_t y, bool bPrepended = false) {
+    Translate(static_cast<FX_FLOAT>(x), static_cast<FX_FLOAT>(y), bPrepended);
   }
 
   void Scale(FX_FLOAT sx, FX_FLOAT sy, bool bPrepended = false);
@@ -658,27 +659,18 @@
              bool bPrepended = false);
 
   void MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src);
+
   FX_FLOAT GetXUnit() const;
   FX_FLOAT GetYUnit() const;
-  void GetUnitRect(CFX_RectF& rect) const;
   CFX_FloatRect GetUnitRect() const;
 
-  FX_FLOAT GetUnitArea() const;
   FX_FLOAT TransformXDistance(FX_FLOAT dx) const;
-  int32_t TransformXDistance(int32_t dx) const;
-  FX_FLOAT TransformYDistance(FX_FLOAT dy) const;
-  int32_t TransformYDistance(int32_t dy) const;
   FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;
-  int32_t TransformDistance(int32_t dx, int32_t dy) const;
   FX_FLOAT TransformDistance(FX_FLOAT distance) const;
 
   void TransformPoint(FX_FLOAT& x, FX_FLOAT& y) const;
-  void TransformPoint(int32_t& x, int32_t& y) const;
 
-  void TransformVector(CFX_VectorF& v) const;
-  void TransformVector(CFX_Vector& v) const;
   void TransformRect(CFX_RectF& rect) const;
-  void TransformRect(CFX_Rect& rect) const;
   void TransformRect(FX_FLOAT& left,
                      FX_FLOAT& right,
                      FX_FLOAT& top,
@@ -687,19 +679,15 @@
     TransformRect(rect.left, rect.right, rect.top, rect.bottom);
   }
 
-  FX_FLOAT GetA() const { return a; }
-  FX_FLOAT GetB() const { return b; }
-  FX_FLOAT GetC() const { return c; }
-  FX_FLOAT GetD() const { return d; }
-  FX_FLOAT GetE() const { return e; }
-  FX_FLOAT GetF() const { return f; }
-
   FX_FLOAT a;
   FX_FLOAT b;
   FX_FLOAT c;
   FX_FLOAT d;
   FX_FLOAT e;
   FX_FLOAT f;
+
+ private:
+  void ConcatInternal(const CFX_Matrix& other, bool prepend);
 };
 
 #endif  // CORE_FXCRT_FX_COORDINATES_H_
diff --git a/core/fxge/dib/fx_dib_transform.cpp b/core/fxge/dib/fx_dib_transform.cpp
index 55e8b8f..bd88272 100644
--- a/core/fxge/dib/fx_dib_transform.cpp
+++ b/core/fxge/dib/fx_dib_transform.cpp
@@ -456,7 +456,7 @@
   CFX_Matrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_result.left),
                             (FX_FLOAT)(m_result.top));
   result2stretch.Concat(m_dest2stretch);
-  result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);
+  result2stretch.Translate(-m_StretchClip.left, -m_StretchClip.top);
   if (!stretch_buf_mask && pTransformed->m_pAlphaMask) {
     pTransformed->m_pAlphaMask->Clear(0xff000000);
   } else if (pTransformed->m_pAlphaMask) {
diff --git a/core/fxge/ge/cfx_facecache.cpp b/core/fxge/ge/cfx_facecache.cpp
index cbaa07e..314c95b 100644
--- a/core/fxge/ge/cfx_facecache.cpp
+++ b/core/fxge/ge/cfx_facecache.cpp
@@ -101,10 +101,10 @@
     return nullptr;
 
   FXFT_Matrix ft_matrix;
-  ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
-  ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
-  ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
-  ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
+  ft_matrix.xx = (signed long)(pMatrix->a / 64 * 65536);
+  ft_matrix.xy = (signed long)(pMatrix->c / 64 * 65536);
+  ft_matrix.yx = (signed long)(pMatrix->b / 64 * 65536);
+  ft_matrix.yy = (signed long)(pMatrix->d / 64 * 65536);
   bool bUseCJKSubFont = false;
   const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
   if (pSubstFont) {
diff --git a/core/fxge/ge/cfx_renderdevice.cpp b/core/fxge/ge/cfx_renderdevice.cpp
index 0c73c7a..12a3dd4 100644
--- a/core/fxge/ge/cfx_renderdevice.cpp
+++ b/core/fxge/ge/cfx_renderdevice.cpp
@@ -610,7 +610,7 @@
   CFX_Matrix matrix;
   if (pObject2Device)
     matrix = *pObject2Device;
-  matrix.TranslateI(-rect.left, -rect.top);
+  matrix.Translate(-rect.left, -rect.top);
   matrix.Concat(CFX_Matrix(fScaleX, 0, 0, fScaleY, 0, 0));
   if (!bitmap_device.GetDeviceDriver()->DrawPath(
           pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode,
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index 3df38f1..add0f0e 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -316,11 +316,6 @@
 }
 #endif  // _SKIA_SUPPORT_
 
-bool MatrixNoScaled(const CFX_Matrix* pMatrix) {
-  return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 &&
-         pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;
-}
-
 class CFX_Win32FallbackFontInfo final : public CFX_FolderFontInfo {
  public:
   CFX_Win32FallbackFontInfo() {}
@@ -1022,7 +1017,7 @@
     if (bDrawAlpha ||
         ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) ||
          (pGraphState && pGraphState->m_DashCount))) {
-      if (!((!pMatrix || MatrixNoScaled(pMatrix)) && pGraphState &&
+      if (!((!pMatrix || !pMatrix->WillScale()) && pGraphState &&
             pGraphState->m_LineWidth == 1.f &&
             (pPathData->GetPointCount() == 5 ||
              pPathData->GetPointCount() == 4) &&
diff --git a/core/fxge/win32/fx_win32_print.cpp b/core/fxge/win32/fx_win32_print.cpp
index 94c415b..a2ea82a 100644
--- a/core/fxge/win32/fx_win32_print.cpp
+++ b/core/fxge/win32/fx_win32_print.cpp
@@ -269,12 +269,12 @@
   // Transforms
   SetGraphicsMode(m_hDC, GM_ADVANCED);
   XFORM xform;
-  xform.eM11 = pObject2Device->GetA() / kScaleFactor;
-  xform.eM12 = pObject2Device->GetB() / kScaleFactor;
-  xform.eM21 = -pObject2Device->GetC() / kScaleFactor;
-  xform.eM22 = -pObject2Device->GetD() / kScaleFactor;
-  xform.eDx = pObject2Device->GetE();
-  xform.eDy = pObject2Device->GetF();
+  xform.eM11 = pObject2Device->a / kScaleFactor;
+  xform.eM12 = pObject2Device->b / kScaleFactor;
+  xform.eM21 = -pObject2Device->c / kScaleFactor;
+  xform.eM22 = -pObject2Device->d / kScaleFactor;
+  xform.eDx = pObject2Device->e;
+  xform.eDy = pObject2Device->f;
   ModifyWorldTransform(m_hDC, &xform, MWT_LEFTMULTIPLY);
 
   // Color
diff --git a/fpdfsdk/pdfwindow/PWL_Icon.cpp b/fpdfsdk/pdfwindow/PWL_Icon.cpp
index 877921d..4abe884 100644
--- a/fpdfsdk/pdfwindow/PWL_Icon.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Icon.cpp
@@ -39,8 +39,8 @@
 
     sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx
                << " " << rcPlate.bottom + fy << " cm\n";
-    sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " "
-               << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n";
+    sAppStream << mt.a << " " << mt.b << " " << mt.c << " " << mt.d << " "
+               << mt.e << " " << mt.f << " cm\n";
 
     sAppStream << "0 g 0 G 1 w /" << sAlias.AsStringC() << " Do\n"
                << "Q\n";
diff --git a/xfa/fxgraphics/cfx_graphics.cpp b/xfa/fxgraphics/cfx_graphics.cpp
index 4a7041d..f1abfb7 100644
--- a/xfa/fxgraphics/cfx_graphics.cpp
+++ b/xfa/fxgraphics/cfx_graphics.cpp
@@ -1267,7 +1267,7 @@
   CalcTextInfo(text, charCodes, charPos, rect);
   CFX_Matrix m(m_info.CTM.a, m_info.CTM.b, m_info.CTM.c, m_info.CTM.d,
                m_info.CTM.e, m_info.CTM.f);
-  m.Translate(0, m_info.fontSize * m_info.fontHScale);
+  m.Translate(0.0f, m_info.fontSize * m_info.fontHScale);
   if (matrix) {
     m.Concat(*matrix);
   }