Remove CFX_Matrix::ConcatPrepend(), ConcatInverse(), SetIdentity().

These are more clearly expressed using assignment operators.
Move Concat() to header for inlining.
Remove some identity multiplies and other no-op code.
Kill some needless initializations of matrix/rects encountered.

Change-Id: I849af42eaa6249471938266914f06a0b19b1f52d
Reviewed-on: https://pdfium-review.googlesource.com/c/47510
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 50ef3ad..2dfec54 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1485,10 +1485,8 @@
     m_pObjectHolder->AppendPageObject(std::move(pPathObj));
   }
   if (PathClipType) {
-    if (!matrix.IsIdentity()) {
+    if (!matrix.IsIdentity())
       Path.Transform(&matrix);
-      matrix.SetIdentity();
-    }
     m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, true);
   }
 }
diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp
index ed684a4..37197da 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.cpp
+++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -50,8 +50,6 @@
   m_Layers.back().m_pObjectHolder = pObjectHolder;
   if (pObject2Device)
     m_Layers.back().m_Matrix = *pObject2Device;
-  else
-    m_Layers.back().m_Matrix.SetIdentity();
 }
 
 void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index ce0fa48..5164862 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1754,7 +1754,7 @@
       const float* pCTM = textobj->m_TextState.GetCTM();
       if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
         CFX_Matrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
-        text_matrix.ConcatInverse(ctm);
+        text_matrix *= ctm.GetInverse();
         device_matrix = ctm;
         device_matrix.Concat(mtObj2Device);
         pDeviceMatrix = &device_matrix;
diff --git a/core/fxcrt/fx_coordinates.cpp b/core/fxcrt/fx_coordinates.cpp
index 2771992..2c92b3a 100644
--- a/core/fxcrt/fx_coordinates.cpp
+++ b/core/fxcrt/fx_coordinates.cpp
@@ -312,22 +312,6 @@
   return inverse;
 }
 
-void CFX_Matrix::Concat(const CFX_Matrix& m) {
-  *this *= m;
-}
-
-void CFX_Matrix::ConcatPrepend(const CFX_Matrix& m) {
-  *this = m * (*this);
-}
-
-void CFX_Matrix::ConcatInverse(const CFX_Matrix& src) {
-  Concat(src.GetInverse());
-}
-
-void CFX_Matrix::ConcatInversePrepend(const CFX_Matrix& src) {
-  ConcatPrepend(src.GetInverse());
-}
-
 bool CFX_Matrix::Is90Rotated() const {
   return fabs(a * 1000) < fabs(b) && fabs(d * 1000) < fabs(c);
 }
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index 16facf3..3aa50ac 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -552,20 +552,14 @@
     return *this;
   }
 
-  void SetIdentity() { *this = CFX_Matrix(); }
   bool IsIdentity() const { return *this == CFX_Matrix(); }
-
   CFX_Matrix GetInverse() const;
 
-  void Concat(const CFX_Matrix& right);
-  void ConcatPrepend(const CFX_Matrix& left);
-  void ConcatInverse(const CFX_Matrix& m);
-  void ConcatInversePrepend(const CFX_Matrix& m);
-
   bool Is90Rotated() const;
   bool IsScaled() const;
   bool WillScale() const { return a != 1.0f || b != 0 || c != 0 || d != 1.0f; }
 
+  void Concat(const CFX_Matrix& right) { *this *= right; }
   void Translate(float x, float y);
   void TranslatePrepend(float x, float y);
   void Translate(int32_t x, int32_t y) {
diff --git a/core/fxcrt/fx_coordinates_unittest.cpp b/core/fxcrt/fx_coordinates_unittest.cpp
index ded4d45..104bce3 100644
--- a/core/fxcrt/fx_coordinates_unittest.cpp
+++ b/core/fxcrt/fx_coordinates_unittest.cpp
@@ -229,9 +229,7 @@
 #endif  // NDEBUG
 
 TEST(CFX_Matrix, ReverseIdentity) {
-  CFX_Matrix m;
-  m.SetIdentity();
-  CFX_Matrix rev = m.GetInverse();
+  CFX_Matrix rev = CFX_Matrix().GetInverse();
 
   EXPECT_FLOAT_EQ(1.0, rev.a);
   EXPECT_FLOAT_EQ(0.0, rev.b);
@@ -241,7 +239,7 @@
   EXPECT_FLOAT_EQ(0.0, rev.f);
 
   CFX_PointF expected(2, 3);
-  CFX_PointF result = rev.Transform(m.Transform(CFX_PointF(2, 3)));
+  CFX_PointF result = rev.Transform(CFX_Matrix().Transform(CFX_PointF(2, 3)));
   EXPECT_FLOAT_EQ(expected.x, result.x);
   EXPECT_FLOAT_EQ(expected.y, result.y);
 }
@@ -259,7 +257,7 @@
   m.a = -1;
   EXPECT_FALSE(m.IsIdentity());
 
-  m.SetIdentity();
+  m = CFX_Matrix();
   EXPECT_FLOAT_EQ(1.0f, m.a);
   EXPECT_FLOAT_EQ(0.0f, m.b);
   EXPECT_FLOAT_EQ(0.0f, m.c);
@@ -447,10 +445,10 @@
   EXPECT_FLOAT_EQ(273.0f, p_10_20_transformed.y);
 
   // Now compose all transforms prepending.
-  m.SetIdentity();
-  m.ConcatPrepend(rotate_90);
-  m.ConcatPrepend(translate_23_11);
-  m.ConcatPrepend(scale_5_13);
+  m = CFX_Matrix();
+  m = rotate_90 * m;
+  m = translate_23_11 * m;
+  m = scale_5_13 * m;
   EXPECT_NEAR_FIVE_PLACES(0.0f, m.a);
   EXPECT_NEAR_FIVE_PLACES(5.0f, m.b);
   EXPECT_NEAR_FIVE_PLACES(-13.0f, m.c);
diff --git a/xfa/fwl/cfwl_picturebox.cpp b/xfa/fwl/cfwl_picturebox.cpp
index 637de94..6e90765 100644
--- a/xfa/fwl/cfwl_picturebox.cpp
+++ b/xfa/fwl/cfwl_picturebox.cpp
@@ -12,9 +12,6 @@
 
 CFWL_PictureBox::CFWL_PictureBox(const CFWL_App* app)
     : CFWL_Widget(app, pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr) {
-  m_rtClient.Reset();
-  m_rtImage.Reset();
-  m_matrix.SetIdentity();
 }
 
 CFWL_PictureBox::~CFWL_PictureBox() {}
diff --git a/xfa/fwl/cfwl_themepart.cpp b/xfa/fwl/cfwl_themepart.cpp
index 25592f3..44251ad 100644
--- a/xfa/fwl/cfwl_themepart.cpp
+++ b/xfa/fwl/cfwl_themepart.cpp
@@ -13,6 +13,4 @@
       m_bMaximize(false),
       m_bStaticBackground(false),
       m_pData(nullptr) {
-  m_rtPart.Reset();
-  m_matrix.SetIdentity();
 }
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp
index ae42469..9a6b2a5 100644
--- a/xfa/fwl/cfwl_widget.cpp
+++ b/xfa/fwl/cfwl_widget.cpp
@@ -182,21 +182,10 @@
   }
 
   CFX_Matrix matrix;
-  CFX_Matrix ctmOnParent;
-  CFX_RectF rect;
-  int32_t count = pdfium::CollectionSize<int32_t>(parents);
-  for (int32_t i = count - 2; i >= 0; i--) {
-    parent = parents[i];
-    if (parent->m_pProperties)
-      ctmOnParent.SetIdentity();
-    rect = parent->GetWidgetRect();
-    matrix.ConcatPrepend(ctmOnParent);
+  for (size_t i = parents.size(); i >= 2; i--) {
+    CFX_RectF rect = parents[i - 2]->GetWidgetRect();
     matrix.TranslatePrepend(rect.left, rect.top);
   }
-  CFX_Matrix m;
-  m.SetIdentity();
-  matrix.ConcatPrepend(m);
-  parents.clear();
   return matrix;
 }
 
@@ -365,7 +354,7 @@
   param.m_iPart = iPartBk;
   param.m_pGraphics = pGraphics;
   if (pMatrix)
-    param.m_matrix.ConcatPrepend(*pMatrix);
+    param.m_matrix = *pMatrix;
   param.m_rtPart = GetRelativeRect();
   pTheme->DrawBackground(&param);
 }
@@ -378,7 +367,7 @@
   param.m_pWidget = this;
   param.m_iPart = iPartBorder;
   param.m_pGraphics = pGraphics;
-  param.m_matrix.ConcatPrepend(matrix);
+  param.m_matrix = matrix;
   param.m_rtPart = GetRelativeRect();
   pTheme->DrawBackground(&param);
 }
diff --git a/xfa/fxgraphics/cxfa_gepattern.cpp b/xfa/fxgraphics/cxfa_gepattern.cpp
index 2a6a0e4..0cd41b4 100644
--- a/xfa/fxgraphics/cxfa_gepattern.cpp
+++ b/xfa/fxgraphics/cxfa_gepattern.cpp
@@ -13,8 +13,6 @@
     : m_hatchStyle(hatchStyle), m_foreArgb(foreArgb), m_backArgb(backArgb) {
   if (matrix)
     m_matrix = *matrix;
-  else
-    m_matrix.SetIdentity();
 }
 
 CXFA_GEPattern::~CXFA_GEPattern() {}