Remove some CFX_Matrix::Concat() calls.

CFX_Matrix m = m1 * m2; is equivalent to: m = m1; m1.Concat(m2);

Change-Id: I4876ff044f7876205b9f12ab6416d388073791ae
Reviewed-on: https://pdfium-review.googlesource.com/c/47490
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index 7746253..23bedae 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -207,11 +207,10 @@
       y2 = rect.top;
       break;
   }
-  CFX_Matrix matrix = m_PageMatrix;
-  matrix.Concat(CFX_Matrix(
-      (x2 - x0) / m_PageSize.width, (y2 - y0) / m_PageSize.width,
-      (x1 - x0) / m_PageSize.height, (y1 - y0) / m_PageSize.height, x0, y0));
-  return matrix;
+  CFX_Matrix matrix((x2 - x0) / m_PageSize.width, (y2 - y0) / m_PageSize.width,
+                    (x1 - x0) / m_PageSize.height,
+                    (y1 - y0) / m_PageSize.height, x0, y0);
+  return m_PageMatrix * matrix;
 }
 
 int CPDF_Page::GetPageRotation() const {
diff --git a/core/fpdfapi/page/cpdf_pattern.cpp b/core/fpdfapi/page/cpdf_pattern.cpp
index e2dc4f4..c6d3c54 100644
--- a/core/fpdfapi/page/cpdf_pattern.cpp
+++ b/core/fpdfapi/page/cpdf_pattern.cpp
@@ -17,6 +17,5 @@
 
 void CPDF_Pattern::SetPatternToFormMatrix() {
   const CPDF_Dictionary* pDict = pattern_obj()->GetDict();
-  m_Pattern2Form = pDict->GetMatrixFor("Matrix");
-  m_Pattern2Form.Concat(m_ParentMatrix);
+  m_Pattern2Form = pDict->GetMatrixFor("Matrix") * m_ParentMatrix;
 }
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 2dfec54..ebdff44 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -694,8 +694,7 @@
 void CPDF_StreamContentParser::Handle_ConcatMatrix() {
   CFX_Matrix new_matrix(GetNumber(5), GetNumber(4), GetNumber(3), GetNumber(2),
                         GetNumber(1), GetNumber(0));
-  new_matrix.Concat(m_pCurStates->m_CTM);
-  m_pCurStates->m_CTM = new_matrix;
+  m_pCurStates->m_CTM = new_matrix * m_pCurStates->m_CTM;
   OnChangeTextMatrix();
 }
 
@@ -788,8 +787,7 @@
       m_pDocument.Get(), m_pPageResources.Get(), pStream, m_pResources.Get());
   form->ParseContent(&status, nullptr, nullptr, m_ParsedSet.Get());
 
-  CFX_Matrix matrix = m_pCurStates->m_CTM;
-  matrix.Concat(m_mtContentToUser);
+  CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
 
   auto pFormObj = pdfium::MakeUnique<CPDF_FormObject>(GetCurrentStreamIndex(),
                                                       std::move(form), matrix);
@@ -839,8 +837,7 @@
   SetGraphicStates(pImageObj.get(), pImageObj->GetImage()->IsMask(), false,
                    false);
 
-  CFX_Matrix ImageMatrix = m_pCurStates->m_CTM;
-  ImageMatrix.Concat(m_mtContentToUser);
+  CFX_Matrix ImageMatrix = m_pCurStates->m_CTM * m_mtContentToUser;
   pImageObj->set_matrix(ImageMatrix);
   pImageObj->CalcBoundingBox();
 
@@ -1094,8 +1091,7 @@
   if (!pShading->IsShadingObject() || !pShading->Load())
     return;
 
-  CFX_Matrix matrix = m_pCurStates->m_CTM;
-  matrix.Concat(m_mtContentToUser);
+  CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
   auto pObj = pdfium::MakeUnique<CPDF_ShadingObject>(GetCurrentStreamIndex(),
                                                      pShading, matrix);
   SetGraphicStates(pObj.get(), false, false, false);
@@ -1471,8 +1467,7 @@
   for (const auto& point : PathPoints)
     Path.AppendPoint(point.m_Point, point.m_Type, point.m_CloseFigure);
 
-  CFX_Matrix matrix = m_pCurStates->m_CTM;
-  matrix.Concat(m_mtContentToUser);
+  CFX_Matrix matrix = m_pCurStates->m_CTM * m_mtContentToUser;
   if (bStroke || FillType) {
     auto pPathObj =
         pdfium::MakeUnique<CPDF_PathObject>(GetCurrentStreamIndex());
diff --git a/core/fpdfapi/page/cpdf_textobject.cpp b/core/fpdfapi/page/cpdf_textobject.cpp
index 13e7279..c554113 100644
--- a/core/fpdfapi/page/cpdf_textobject.cpp
+++ b/core/fpdfapi/page/cpdf_textobject.cpp
@@ -115,8 +115,7 @@
 }
 
 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) {
-  CFX_Matrix text_matrix = GetTextMatrix();
-  text_matrix.Concat(matrix);
+  CFX_Matrix text_matrix = GetTextMatrix() * matrix;
 
   float* pTextMatrix = m_TextState.GetMutableMatrix();
   pTextMatrix[0] = text_matrix.a;
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index d1b9268..0494791 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -164,8 +164,7 @@
       !GetRenderOptions().GetOCContext()->CheckOCGVisible(pOC)) {
     return false;
   }
-  m_ImageMatrix = m_pImageObject->matrix();
-  m_ImageMatrix.Concat(*pObj2Device);
+  m_ImageMatrix = m_pImageObject->matrix() * *pObj2Device;
   if (StartLoadDIBBase())
     return true;
   return StartRenderDIBBase();
diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp
index 37197da..96b98a4 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.cpp
+++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -70,11 +70,11 @@
     status.SetStopObject(pStopObj);
     status.SetTransparency(layer.m_pObjectHolder->GetTransparency());
     if (pLastMatrix) {
-      CFX_Matrix FinalMatrix = layer.m_Matrix;
-      FinalMatrix.Concat(*pLastMatrix);
-      status.SetDeviceMatrix(*pLastMatrix);
+      const CFX_Matrix& last_matrix = *pLastMatrix;
+      CFX_Matrix final_matrix = layer.m_Matrix * last_matrix;
+      status.SetDeviceMatrix(last_matrix);
       status.Initialize(nullptr, nullptr);
-      status.RenderObjectList(layer.m_pObjectHolder.Get(), FinalMatrix);
+      status.RenderObjectList(layer.m_pObjectHolder.Get(), final_matrix);
     } else {
       status.Initialize(nullptr, nullptr);
       status.RenderObjectList(layer.m_pObjectHolder.Get(), layer.m_Matrix);
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 5164862..007bd8f 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -343,8 +343,8 @@
     ymax = pDomain->GetNumberAt(3);
   }
   CFX_Matrix mtDomain2Target = pDict->GetMatrixFor("Matrix");
-  CFX_Matrix matrix = mtObject2Bitmap.GetInverse();
-  matrix.Concat(mtDomain2Target.GetInverse());
+  CFX_Matrix matrix =
+      mtObject2Bitmap.GetInverse() * mtDomain2Target.GetInverse();
   int width = pBitmap->GetWidth();
   int height = pBitmap->GetHeight();
   int pitch = pBitmap->GetPitch();
@@ -944,8 +944,7 @@
   CFX_Matrix mtAdjust;
   mtAdjust.MatchRect(bitmap_rect, cell_bbox);
 
-  CFX_Matrix mtPattern2Bitmap = mtObject2Device;
-  mtPattern2Bitmap.Concat(mtAdjust);
+  CFX_Matrix mtPattern2Bitmap = mtObject2Device * mtAdjust;
   CPDF_RenderOptions options;
   if (!pPattern->colored())
     options.SetColorMode(CPDF_RenderOptions::kAlpha);
@@ -1188,8 +1187,7 @@
                          res)) {
     return;
   }
-  CFX_Matrix matrix = mtObj2Device;
-  matrix.Concat(*buffer.GetMatrix());
+  CFX_Matrix matrix = mtObj2Device * (*buffer.GetMatrix());
   const CPDF_Dictionary* pFormResource = nullptr;
   const CPDF_FormObject* pFormObj = pObj->AsForm();
   if (pFormObj) {
@@ -1218,8 +1216,7 @@
       !m_Options.GetOCContext()->CheckOCGVisible(pOC)) {
     return true;
   }
-  CFX_Matrix matrix = pFormObj->form_matrix();
-  matrix.Concat(mtObj2Device);
+  CFX_Matrix matrix = pFormObj->form_matrix() * mtObj2Device;
   const CPDF_Dictionary* pFormDict = pFormObj->form()->GetDict();
   const CPDF_Dictionary* pResources =
       pFormDict ? pFormDict->GetDictFor("Resources") : nullptr;
@@ -1252,8 +1249,7 @@
 
   uint32_t fill_argb = FillType ? GetFillArgb(pPathObj) : 0;
   uint32_t stroke_argb = bStroke ? GetStrokeArgb(pPathObj) : 0;
-  CFX_Matrix path_matrix = pPathObj->matrix();
-  path_matrix.Concat(mtObj2Device);
+  CFX_Matrix path_matrix = pPathObj->matrix() * mtObj2Device;
   if (!IsAvailableMatrix(path_matrix))
     return true;
 
@@ -1416,8 +1412,7 @@
 bool CPDF_RenderStatus::SelectClipPath(const CPDF_PathObject* pPathObj,
                                        const CFX_Matrix& mtObj2Device,
                                        bool bStroke) {
-  CFX_Matrix path_matrix = pPathObj->matrix();
-  path_matrix.Concat(mtObj2Device);
+  CFX_Matrix path_matrix = pPathObj->matrix() * mtObj2Device;
   if (bStroke) {
     CFX_GraphState graphState = pPathObj->m_GraphState;
     if (m_Options.GetOptions().bThinLine)
@@ -1574,8 +1569,8 @@
 #endif
   m_bStopped = bitmap_render.m_bStopped;
   if (pSMaskDict) {
-    CFX_Matrix smask_matrix = *pPageObj->m_GeneralState.GetSMaskMatrix();
-    smask_matrix.Concat(mtObj2Device);
+    CFX_Matrix smask_matrix =
+        *pPageObj->m_GeneralState.GetSMaskMatrix() * mtObj2Device;
     RetainPtr<CFX_DIBBase> pSMaskSource =
         LoadSMask(pSMaskDict, &rect, &smask_matrix);
     if (pSMaskSource)
@@ -1755,8 +1750,7 @@
       if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
         CFX_Matrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
         text_matrix *= ctm.GetInverse();
-        device_matrix = ctm;
-        device_matrix.Concat(mtObj2Device);
+        device_matrix = ctm * mtObj2Device;
         pDeviceMatrix = &device_matrix;
       }
     }
@@ -1906,8 +1900,7 @@
           glyphs[iChar].m_Origin = origin;
         }
       } else {
-        CFX_Matrix image_matrix = pType3Char->matrix();
-        image_matrix.Concat(matrix);
+        CFX_Matrix image_matrix = pType3Char->matrix() * matrix;
         CPDF_ImageRenderer renderer;
         if (renderer.Start(this, pType3Char->GetBitmap(), fill_argb, 255,
                            &image_matrix, FXDIB_ResampleOptions(), false,
@@ -2052,8 +2045,7 @@
   CPDF_DeviceBuffer buffer;
   buffer.Initialize(m_pContext.Get(), m_pDevice, clip_rect_bbox,
                     m_pCurObj.Get(), 150);
-  CFX_Matrix FinalMatrix = *pMatrix;
-  FinalMatrix.Concat(*buffer.GetMatrix());
+  CFX_Matrix FinalMatrix = *pMatrix * (*buffer.GetMatrix());
   RetainPtr<CFX_DIBitmap> pBitmap = buffer.GetBitmap();
   if (!pBitmap->GetBuffer())
     return;
@@ -2122,8 +2114,7 @@
   if (rect.IsEmpty())
     return;
 
-  CFX_Matrix matrix = *pattern->pattern_to_form();
-  matrix.Concat(mtObj2Device);
+  CFX_Matrix matrix = *pattern->pattern_to_form() * mtObj2Device;
   int alpha =
       FXSYS_round(255 * (bStroke ? pPageObj->m_GeneralState.GetStrokeAlpha()
                                  : pPageObj->m_GeneralState.GetFillAlpha()));
@@ -2139,8 +2130,7 @@
   if (rect.IsEmpty())
     return;
 
-  CFX_Matrix matrix = pShadingObj->matrix();
-  matrix.Concat(mtObj2Device);
+  CFX_Matrix matrix = pShadingObj->matrix() * mtObj2Device;
   DrawShading(pShadingObj->pattern(), &matrix, rect,
               FXSYS_round(255 * pShadingObj->m_GeneralState.GetFillAlpha()),
               m_Options.ColorModeIs(CPDF_RenderOptions::kAlpha));
@@ -2161,8 +2151,7 @@
   if (clip_box.IsEmpty())
     return;
 
-  CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form();
-  mtPattern2Device.Concat(mtObj2Device);
+  CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form() * mtObj2Device;
 
   bool bAligned =
       pPattern->bbox().left == 0 && pPattern->bbox().bottom == 0 &&
diff --git a/core/fpdfapi/render/cpdf_type3cache.cpp b/core/fpdfapi/render/cpdf_type3cache.cpp
index 4638fcc..a2412a8 100644
--- a/core/fpdfapi/render/cpdf_type3cache.cpp
+++ b/core/fpdfapi/render/cpdf_type3cache.cpp
@@ -122,8 +122,7 @@
     return nullptr;
 
   CFX_Matrix text_matrix(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
-  CFX_Matrix image_matrix = pChar->matrix();
-  image_matrix.Concat(text_matrix);
+  CFX_Matrix image_matrix = pChar->matrix() * text_matrix;
 
   RetainPtr<CFX_DIBitmap> pBitmap = pChar->GetBitmap();
   RetainPtr<CFX_DIBitmap> pResBitmap;
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 1a279e9..13d8f0c 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -635,8 +635,7 @@
   if (pObjectList->empty())
     return;
 
-  CFX_Matrix curFormMatrix = pFormObj->form_matrix();
-  curFormMatrix.Concat(formMatrix);
+  CFX_Matrix curFormMatrix = pFormObj->form_matrix() * formMatrix;
 
   for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) {
     CPDF_PageObject* pPageObj = it->get();
@@ -778,19 +777,16 @@
       GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) *
       prev_Obj.m_pTextObj->GetFontSize() / 1000;
 
-  CFX_Matrix prev_matrix = prev_Obj.m_pTextObj->GetTextMatrix();
-  prev_width = fabs(prev_width);
-  prev_matrix.Concat(prev_Obj.m_formMatrix);
-  prev_width = prev_matrix.TransformDistance(prev_width);
+  CFX_Matrix prev_matrix =
+      prev_Obj.m_pTextObj->GetTextMatrix() * prev_Obj.m_formMatrix;
+  prev_width = prev_matrix.TransformDistance(fabs(prev_width));
   pTextObj->GetItemInfo(0, &item);
   float this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) *
                      pTextObj->GetFontSize() / 1000;
   this_width = fabs(this_width);
 
-  CFX_Matrix this_matrix = pTextObj->GetTextMatrix();
-  this_width = fabs(this_width);
-  this_matrix.Concat(formMatrix);
-  this_width = this_matrix.TransformDistance(this_width);
+  CFX_Matrix this_matrix = pTextObj->GetTextMatrix() * formMatrix;
+  this_width = this_matrix.TransformDistance(fabs(this_width));
 
   float threshold = std::max(prev_width, this_width) / 4;
   CFX_PointF prev_pos = m_DisplayMatrix.Transform(
@@ -895,8 +891,7 @@
     return;
 
   CPDF_Font* pFont = pTextObj->GetFont();
-  CFX_Matrix matrix = pTextObj->GetTextMatrix();
-  matrix.Concat(Obj.m_formMatrix);
+  CFX_Matrix matrix = pTextObj->GetTextMatrix() * Obj.m_formMatrix;
 
   for (size_t k = 0; k < actText.GetLength(); ++k) {
     wchar_t wChar = actText[k];
@@ -949,8 +944,7 @@
     return;
   CFX_Matrix formMatrix = Obj.m_formMatrix;
   CPDF_Font* pFont = pTextObj->GetFont();
-  CFX_Matrix matrix = pTextObj->GetTextMatrix();
-  matrix.Concat(formMatrix);
+  CFX_Matrix matrix = pTextObj->GetTextMatrix() * formMatrix;
 
   FPDFText_MarkedContent ePreMKC = PreMarkedContent(Obj);
   if (ePreMKC == FPDFText_MarkedContent::Done) {
@@ -1275,9 +1269,7 @@
   float this_width = fabs(nThisWidth * pObj->GetFontSize() / 1000);
   float threshold = std::max(last_width, this_width) / 4;
 
-  CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix();
-  prev_matrix.Concat(m_perMatrix);
-
+  CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix() * m_perMatrix;
   CFX_Matrix prev_reverse = prev_matrix.GetInverse();
 
   CFX_PointF pos = prev_reverse.Transform(formMatrix.Transform(pObj->GetPos()));
@@ -1333,8 +1325,7 @@
   if (preChar == L' ')
     return GenerateCharacter::None;
 
-  CFX_Matrix matrix = pObj->GetTextMatrix();
-  matrix.Concat(formMatrix);
+  CFX_Matrix matrix = pObj->GetTextMatrix() * formMatrix;
   float threshold2 = static_cast<float>(std::max(nLastWidth, nThisWidth));
   threshold2 = NormalizeThreshold(threshold2, 400, 700, 800);
   if (nLastWidth >= nThisWidth) {
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index e26121d..9bb159d 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1361,8 +1361,7 @@
         pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
         pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, 0, 0);
 
-    matrix1 = *pObject2Device;
-    matrix1.Concat(matrix2.GetInverse());
+    matrix1 = *pObject2Device * matrix2.GetInverse();
   }
 
   CAgg_PathData path_data;
diff --git a/core/fxge/win32/cfx_psrenderer.cpp b/core/fxge/win32/cfx_psrenderer.cpp
index 9f76bf0..830a868 100644
--- a/core/fxge/win32/cfx_psrenderer.cpp
+++ b/core/fxge/win32/cfx_psrenderer.cpp
@@ -598,7 +598,6 @@
         CFX_Matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
                    charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
   }
-  matrix.Concat(CFX_Matrix(1.0f, 0, 0, 1.0f, 0, 0));
   const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(
       pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
   if (!pPathData)
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 50787b2..02d1450 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -61,10 +61,9 @@
                              CPDFSDK_Annot* pAnnot,
                              CFX_RenderDevice* pDevice,
                              const CFX_Matrix& mtUser2Device) {
-  if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) {
-    CFX_Matrix mt = GetCurMatrix();
-    mt.Concat(mtUser2Device);
-    pWnd->DrawAppearance(pDevice, mt);
+  CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
+  if (pWnd) {
+    pWnd->DrawAppearance(pDevice, GetCurMatrix() * mtUser2Device);
     return;
   }
 
@@ -419,14 +418,11 @@
 
 CFX_Matrix CFFL_FormFiller::GetWindowMatrix(
     const CPWL_Wnd::PrivateData* pAttached) {
-  CFX_Matrix mt;
   const auto* pPrivateData = static_cast<const CFFL_PrivateData*>(pAttached);
   if (!pPrivateData || !pPrivateData->pPageView)
-    return mt;
+    return CFX_Matrix();
 
-  mt = GetCurMatrix();
-  mt.Concat(pPrivateData->pPageView->GetCurrentMatrix());
-  return mt;
+  return GetCurMatrix() * pPrivateData->pPageView->GetCurrentMatrix();
 }
 
 CFX_Matrix CFFL_FormFiller::GetCurMatrix() {
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 40ef160..076f22b 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -235,10 +235,9 @@
     else
       continue;
 
-    CFX_Matrix m = pDict->GetMatrixFor("Matrix");
-    m.Concat(CFX_Matrix(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
-                        matrix->f));
-    pDict->SetMatrixFor("Matrix", m);
+    CFX_Matrix m(matrix->a, matrix->b, matrix->c, matrix->d, matrix->e,
+                 matrix->f);
+    pDict->SetMatrixFor("Matrix", pDict->GetMatrixFor("Matrix") * m);
   }
 
   return true;