Change SetReverse to GetInverse in CFX_Matrix

CFX_Matrix::GetInverse is much clearer.
Change-Id: Id10ab1723735332e1a78de853f28415ec3a4d834
Reviewed-on: https://pdfium-review.googlesource.com/7090
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Nicolás Peña <npm@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 10b3933..369c2a8 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -68,11 +68,8 @@
 
   // Set the default graphic state values
   buf << "q\n";
-  if (!m_pObjHolder->GetLastCTM().IsIdentity()) {
-    CFX_Matrix reverse;
-    reverse.SetReverse(m_pObjHolder->GetLastCTM());
-    buf << reverse << " cm\n";
-  }
+  if (!m_pObjHolder->GetLastCTM().IsIdentity())
+    buf << m_pObjHolder->GetLastCTM().GetInverse() << " cm\n";
   ProcessDefaultGraphics(&buf);
 
   // Process the page objects
diff --git a/core/fpdfapi/render/cpdf_progressiverenderer.cpp b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
index 984ad75..4ddc528 100644
--- a/core/fpdfapi/render/cpdf_progressiverenderer.cpp
+++ b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
@@ -60,9 +60,7 @@
           nullptr);
       m_pDevice->SaveState();
       m_ClipRect = CFX_FloatRect(m_pDevice->GetClipBox());
-      CFX_Matrix device2object;
-      device2object.SetReverse(m_pCurrentLayer->m_Matrix);
-      device2object.TransformRect(m_ClipRect);
+      m_pCurrentLayer->m_Matrix.GetInverse().TransformRect(m_ClipRect);
     }
     CPDF_PageObjectList::iterator iter;
     CPDF_PageObjectList::iterator iterEnd =
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index beeca3f..a3b1bb8 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -133,8 +133,6 @@
   float x_span = end_x - start_x;
   float y_span = end_y - start_y;
   float axis_len_square = (x_span * x_span) + (y_span * y_span);
-  CFX_Matrix matrix;
-  matrix.SetReverse(*pObject2Bitmap);
   uint32_t total_results =
       std::max(CountOutputs(funcs), pCS->CountComponents());
   CFX_FixedBufGrow<float, 16> result_array(total_results);
@@ -160,6 +158,7 @@
                                  FXSYS_round(G * 255), FXSYS_round(B * 255)));
   }
   int pitch = pBitmap->GetPitch();
+  CFX_Matrix matrix = pObject2Bitmap->GetInverse();
   for (int row = 0; row < height; row++) {
     uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch);
     for (int column = 0; column < width; column++) {
@@ -202,8 +201,6 @@
   float end_x = pCoords->GetNumberAt(3);
   float end_y = pCoords->GetNumberAt(4);
   float end_r = pCoords->GetNumberAt(5);
-  CFX_Matrix matrix;
-  matrix.SetReverse(*pObject2Bitmap);
   float t_min = 0;
   float t_max = 1.0f;
   CPDF_Array* pArray = pDict->GetArrayFor("Domain");
@@ -256,6 +253,7 @@
       bDecreasing = true;
     }
   }
+  CFX_Matrix matrix = pObject2Bitmap->GetInverse();
   for (int row = 0; row < height; row++) {
     uint32_t* dib_buf = (uint32_t*)(pBitmap->GetBuffer() + row * pitch);
     for (int column = 0; column < width; column++) {
@@ -334,12 +332,8 @@
     ymax = pDomain->GetNumberAt(3);
   }
   CFX_Matrix mtDomain2Target = pDict->GetMatrixFor("Matrix");
-  CFX_Matrix matrix;
-  matrix.SetReverse(*pObject2Bitmap);
-
-  CFX_Matrix reverse_matrix;
-  reverse_matrix.SetReverse(mtDomain2Target);
-  matrix.Concat(reverse_matrix);
+  CFX_Matrix matrix = pObject2Bitmap->GetInverse();
+  matrix.Concat(mtDomain2Target.GetInverse());
   int width = pBitmap->GetWidth();
   int height = pBitmap->GetHeight();
   int pitch = pBitmap->GetPitch();
@@ -1056,9 +1050,7 @@
   DebugVerifyDeviceIsPreMultiplied();
 #endif
   CFX_FloatRect clip_rect(m_pDevice->GetClipBox());
-  CFX_Matrix device2object;
-  device2object.SetReverse(*pObj2Device);
-  device2object.TransformRect(clip_rect);
+  pObj2Device->GetInverse().TransformRect(clip_rect);
 
   for (const auto& pCurObj : *pObjectHolder->GetPageObjectList()) {
     if (pCurObj.get() == m_pStopObj) {
@@ -2243,11 +2235,8 @@
   if (height == 0)
     height = 1;
 
-  CFX_Matrix mtDevice2Pattern;
-  mtDevice2Pattern.SetReverse(mtPattern2Device);
-
   CFX_FloatRect clip_box_p(clip_box);
-  mtDevice2Pattern.TransformRect(clip_box_p);
+  mtPattern2Device.GetInverse().TransformRect(clip_box_p);
 
   int min_col = (int)ceil((clip_box_p.left - pPattern->bbox().right) /
                           pPattern->x_step());
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index b886012..b6b3a0d 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -264,10 +264,7 @@
       CFX_Matrix matrix = info_curchar.m_pTextObj->GetTextMatrix();
       matrix.Concat(info_curchar.m_Matrix);
 
-      CFX_Matrix matrix_reverse;
-      matrix_reverse.SetReverse(matrix);
-
-      CFX_PointF origin = matrix_reverse.Transform(info_curchar.m_Origin);
+      CFX_PointF origin = matrix.GetInverse().Transform(info_curchar.m_Origin);
       rect.left = info_curchar.m_CharBox.left;
       rect.right = info_curchar.m_CharBox.right;
       if (pCurObj->GetFont()->GetTypeDescent()) {
@@ -1306,8 +1303,7 @@
   CFX_Matrix prev_matrix = m_pPreTextObj->GetTextMatrix();
   prev_matrix.Concat(m_perMatrix);
 
-  CFX_Matrix prev_reverse;
-  prev_reverse.SetReverse(prev_matrix);
+  CFX_Matrix prev_reverse = prev_matrix.GetInverse();
 
   CFX_PointF pos = prev_reverse.Transform(formMatrix.Transform(pObj->GetPos()));
   if (last_width < this_width)
diff --git a/core/fxcrt/fx_coordinates.cpp b/core/fxcrt/fx_coordinates.cpp
index 27c0a95..0b6aed4 100644
--- a/core/fxcrt/fx_coordinates.cpp
+++ b/core/fxcrt/fx_coordinates.cpp
@@ -197,18 +197,20 @@
   return CFX_FloatRect(min_x, min_y, max_x, max_y);
 }
 
-void CFX_Matrix::SetReverse(const CFX_Matrix& m) {
-  float i = m.a * m.d - m.b * m.c;
+CFX_Matrix CFX_Matrix::GetInverse() const {
+  CFX_Matrix inverse;
+  float i = a * d - b * c;
   if (fabs(i) == 0)
-    return;
+    return inverse;
 
   float j = -i;
-  a = m.d / i;
-  b = m.b / j;
-  c = m.c / j;
-  d = m.a / i;
-  e = (m.c * m.f - m.d * m.e) / i;
-  f = (m.a * m.f - m.b * m.e) / j;
+  inverse.a = d / i;
+  inverse.b = b / j;
+  inverse.c = c / j;
+  inverse.d = a / i;
+  inverse.e = (c * f - d * e) / i;
+  inverse.f = (a * f - b * e) / j;
+  return inverse;
 }
 
 void CFX_Matrix::Concat(const CFX_Matrix& m, bool bPrepended) {
@@ -216,9 +218,7 @@
 }
 
 void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, bool bPrepended) {
-  CFX_Matrix m;
-  m.SetReverse(src);
-  Concat(m, bPrepended);
+  Concat(src.GetInverse(), bPrepended);
 }
 
 bool CFX_Matrix::Is90Rotated() const {
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index fc51c45..25923f7 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -608,7 +608,7 @@
     f = 0;
   }
 
-  void SetReverse(const CFX_Matrix& m);
+  CFX_Matrix GetInverse() const;
 
   void Concat(const CFX_Matrix& m, bool bPrepended = false);
   void ConcatInverse(const CFX_Matrix& m, bool bPrepended = false);
diff --git a/core/fxcrt/fx_coordinates_unittest.cpp b/core/fxcrt/fx_coordinates_unittest.cpp
index 12ddb97..e998b44 100644
--- a/core/fxcrt/fx_coordinates_unittest.cpp
+++ b/core/fxcrt/fx_coordinates_unittest.cpp
@@ -8,10 +8,9 @@
 
 TEST(CFX_Matrix, ReverseIdentity) {
   CFX_Matrix m;
-  CFX_Matrix rev;
-
   m.SetIdentity();
-  rev.SetReverse(m);
+  CFX_Matrix rev = m.GetInverse();
+
   EXPECT_FLOAT_EQ(1.0, rev.a);
   EXPECT_FLOAT_EQ(0.0, rev.b);
   EXPECT_FLOAT_EQ(0.0, rev.c);
@@ -28,9 +27,8 @@
 TEST(CFX_Matrix, Reverse) {
   float data[6] = {3, 0, 2, 3, 1, 4};
   CFX_Matrix m(data);
-  CFX_Matrix rev;
+  CFX_Matrix rev = m.GetInverse();
 
-  rev.SetReverse(m);
   EXPECT_FLOAT_EQ(0.33333334f, rev.a);
   EXPECT_FLOAT_EQ(0.0f, rev.b);
   EXPECT_FLOAT_EQ(-0.22222222f, rev.c);
@@ -50,9 +48,8 @@
   float data[6] = {0.947368443f, -0.108947366f, -0.923076928f,
                    0.106153846f, 18.0f,         787.929993f};
   CFX_Matrix m(data);
-  CFX_Matrix rev;
+  CFX_Matrix rev = m.GetInverse();
 
-  rev.SetReverse(m);
   EXPECT_FLOAT_EQ(14247728.0f, rev.a);
   EXPECT_FLOAT_EQ(14622668.0f, rev.b);
   EXPECT_FLOAT_EQ(1.2389329e+08f, rev.c);
@@ -71,9 +68,8 @@
   // The determinate is < std::numeric_limits<float>::epsilon()
   float data[6] = {0.000037f, 0.0f, 0.0f, -0.000037f, 182.413101f, 136.977646f};
   CFX_Matrix m(data);
-  CFX_Matrix rev;
+  CFX_Matrix rev = m.GetInverse();
 
-  rev.SetReverse(m);
   EXPECT_FLOAT_EQ(27027.025f, rev.a);
   EXPECT_FLOAT_EQ(0.0f, rev.b);
   EXPECT_FLOAT_EQ(0.0f, rev.c);
diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 22d8007..91272d4 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -1349,10 +1349,8 @@
         pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
         pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d, 0, 0);
 
-    CFX_Matrix mtRervese;
-    mtRervese.SetReverse(matrix2);
     matrix1 = *pObject2Device;
-    matrix1.Concat(mtRervese);
+    matrix1.Concat(matrix2.GetInverse());
   }
 
   CAgg_PathData path_data;
diff --git a/core/fxge/dib/cfx_imagetransformer.cpp b/core/fxge/dib/cfx_imagetransformer.cpp
index 6174a51..2fb21e4 100644
--- a/core/fxge/dib/cfx_imagetransformer.cpp
+++ b/core/fxge/dib/cfx_imagetransformer.cpp
@@ -235,7 +235,8 @@
       CFX_Matrix(m_pMatrix->a / stretch_width, m_pMatrix->b / stretch_width,
                  m_pMatrix->c / stretch_height, m_pMatrix->d / stretch_height,
                  m_pMatrix->e, m_pMatrix->f));
-  m_dest2stretch.SetReverse(stretch2dest);
+  ASSERT(m_dest2stretch.IsIdentity());
+  m_dest2stretch = stretch2dest.GetInverse();
 
   CFX_FloatRect clip_rect_f(result_clip);
   m_dest2stretch.TransformRect(clip_rect_f);
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp
index d38c627..8823511 100644
--- a/fpdfsdk/cfx_systemhandler.cpp
+++ b/fpdfsdk/cfx_systemhandler.cpp
@@ -49,8 +49,7 @@
   CFX_Matrix page2device;
   pPageView->GetCurrentMatrix(page2device);
 
-  CFX_Matrix device2page;
-  device2page.SetReverse(page2device);
+  CFX_Matrix device2page = page2device.GetInverse();
 
   CFX_PointF left_top = device2page.Transform(
       CFX_PointF(static_cast<float>(rect.left), static_cast<float>(rect.top)));
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 526f4b9..565d2ba 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -459,28 +459,19 @@
 }
 
 CFX_FloatRect CFFL_FormFiller::FFLtoPWL(const CFX_FloatRect& rect) {
-  CFX_Matrix mt;
-  mt.SetReverse(GetCurMatrix());
-
   CFX_FloatRect temp = rect;
-  mt.TransformRect(temp);
-
+  GetCurMatrix().GetInverse().TransformRect(temp);
   return temp;
 }
 
 CFX_FloatRect CFFL_FormFiller::PWLtoFFL(const CFX_FloatRect& rect) {
-  CFX_Matrix mt = GetCurMatrix();
-
   CFX_FloatRect temp = rect;
-  mt.TransformRect(temp);
-
+  GetCurMatrix().TransformRect(temp);
   return temp;
 }
 
 CFX_PointF CFFL_FormFiller::FFLtoPWL(const CFX_PointF& point) {
-  CFX_Matrix mt;
-  mt.SetReverse(GetCurMatrix());
-  return mt.Transform(point);
+  return GetCurMatrix().GetInverse().Transform(point);
 }
 
 CFX_PointF CFFL_FormFiller::PWLtoFFL(const CFX_PointF& point) {
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index 68ef377..ccd487a 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -1031,10 +1031,8 @@
 #else   // PDF_ENABLE_XFA
   CFX_Matrix page2device =
       pPage->GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate);
-  CFX_Matrix device2page;
-  device2page.SetReverse(page2device);
 
-  CFX_PointF pos = device2page.Transform(
+  CFX_PointF pos = page2device.GetInverse().Transform(
       CFX_PointF(static_cast<float>(device_x), static_cast<float>(device_y)));
 
   *page_x = pos.x;
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index 24858f2..87e003e 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -143,12 +143,10 @@
   if (!m_pPDFPage && !m_pXFAPageView)
     return;
 
-  CFX_Matrix device2page;
-  device2page.SetReverse(
-      GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate));
-
-  CFX_PointF pos = device2page.Transform(
-      CFX_PointF(static_cast<float>(device_x), static_cast<float>(device_y)));
+  CFX_PointF pos = GetDisplayMatrix(start_x, start_y, size_x, size_y, rotate)
+                       .GetInverse()
+                       .Transform(CFX_PointF(static_cast<float>(device_x),
+                                             static_cast<float>(device_y)));
 
   *page_x = pos.x;
   *page_y = pos.y;
diff --git a/fpdfsdk/pdfwindow/cpwl_icon.cpp b/fpdfsdk/pdfwindow/cpwl_icon.cpp
index 6650311..ebf3b4f 100644
--- a/fpdfsdk/pdfwindow/cpwl_icon.cpp
+++ b/fpdfsdk/pdfwindow/cpwl_icon.cpp
@@ -23,8 +23,7 @@
 
   CFX_ByteString sAlias = GetImageAlias();
   CFX_FloatRect rcPlate = GetClientRect();
-  CFX_Matrix mt;
-  mt.SetReverse(GetImageMatrix());
+  CFX_Matrix mt = GetImageMatrix().GetInverse();
 
   float fHScale = 1.0f;
   float fVScale = 1.0f;
diff --git a/fpdfsdk/pdfwindow/cpwl_wnd.cpp b/fpdfsdk/pdfwindow/cpwl_wnd.cpp
index a8b5c31..85a610e 100644
--- a/fpdfsdk/pdfwindow/cpwl_wnd.cpp
+++ b/fpdfsdk/pdfwindow/cpwl_wnd.cpp
@@ -765,7 +765,9 @@
   if (mt.IsIdentity())
     return point;
 
-  mt.SetReverse(mt);
+  CFX_Matrix inverse = mt.GetInverse();
+  if (!inverse.IsIdentity())
+    mt = inverse;
   return mt.Transform(point);
 }
 
@@ -774,7 +776,9 @@
   if (mt.IsIdentity())
     return rect;
 
-  mt.SetReverse(mt);
+  CFX_Matrix inverse = mt.GetInverse();
+  if (!inverse.IsIdentity())
+    mt = inverse;
   CFX_FloatRect rc = rect;
   mt.TransformRect(rc);
   return rc;
diff --git a/xfa/fde/cfde_rendercontext.cpp b/xfa/fde/cfde_rendercontext.cpp
index 702f7ce..dc2a628 100644
--- a/xfa/fde/cfde_rendercontext.cpp
+++ b/xfa/fde/cfde_rendercontext.cpp
@@ -40,15 +40,13 @@
   if (!m_pRenderDevice || !m_pIterator)
     return;
 
-  CFX_Matrix rm;
-  rm.SetReverse(m_Transform);
   CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect();
   if (rtDocClip.IsEmpty()) {
     rtDocClip.left = rtDocClip.top = 0;
     rtDocClip.width = (float)m_pRenderDevice->GetWidth();
     rtDocClip.height = (float)m_pRenderDevice->GetHeight();
   }
-  rm.TransformRect(rtDocClip);
+  m_Transform.GetInverse().TransformRect(rtDocClip);
   IFDE_VisualSet* pVisualSet;
   FDE_TEXTEDITPIECE* pPiece;
   int32_t iCount = 0;
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 6d5ab2a..5d84b6d 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -294,9 +294,7 @@
                             int32_t iLength,
                             const CFX_RectF& rect) {
   CFX_RectF rtText(rect.left, rect.top, rect.width, rect.height);
-  CFX_Matrix rm;
-  rm.SetReverse(m_Matrix);
-  rm.TransformRect(rtText);
+  m_Matrix.GetInverse().TransformRect(rtText);
   DrawText(pwsStr, iLength, rtText, m_rtClip);
 }
 
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp
index 172014d..45ae9c0 100644
--- a/xfa/fwl/cfwl_widget.cpp
+++ b/xfa/fwl/cfwl_widget.cpp
@@ -197,9 +197,8 @@
   if (!parent)
     return ret;
 
-  CFX_Matrix m;
-  m.SetReverse(pWidget->GetMatrix());
-  return m.Transform(ret) - pWidget->GetWidgetRect().TopLeft();
+  return pWidget->GetMatrix().GetInverse().Transform(ret) -
+         pWidget->GetWidgetRect().TopLeft();
 }
 
 CFX_Matrix CFWL_Widget::GetMatrix() {
diff --git a/xfa/fwl/cfwl_widgetmgr.cpp b/xfa/fwl/cfwl_widgetmgr.cpp
index 67a63ba..3abe14d 100644
--- a/xfa/fwl/cfwl_widgetmgr.cpp
+++ b/xfa/fwl/cfwl_widgetmgr.cpp
@@ -266,12 +266,7 @@
   CFWL_Widget* child = GetLastChildWidget(parent);
   while (child) {
     if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
-      CFX_Matrix m;
-      m.SetIdentity();
-
-      CFX_Matrix matrixOnParent;
-      m.SetReverse(matrixOnParent);
-      pos = m.Transform(point);
+      pos = parent->GetMatrix().GetInverse().Transform(point);
 
       CFX_RectF bounds = child->GetWidgetRect();
       if (bounds.Contains(pos)) {
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 9de9925..f72b291 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -348,9 +348,7 @@
   if (mt.IsIdentity())
     return point;
 
-  CFX_Matrix mtReverse;
-  mtReverse.SetReverse(mt);
-  return mtReverse.Transform(point);
+  return mt.GetInverse().Transform(point);
 }
 
 static void XFA_GetMatrix(CFX_Matrix& m,
diff --git a/xfa/fxfa/cxfa_rendercontext.cpp b/xfa/fxfa/cxfa_rendercontext.cpp
index 02c7cbb..d709502 100644
--- a/xfa/fxfa/cxfa_rendercontext.cpp
+++ b/xfa/fxfa/cxfa_rendercontext.cpp
@@ -14,9 +14,7 @@
                                        const CFX_RectF& clipRect,
                                        const CFX_Matrix& matrix)
     : m_pWidget(nullptr), m_matrix(matrix), m_rtClipRect(clipRect) {
-  CFX_Matrix mtRes;
-  mtRes.SetReverse(matrix);
-  mtRes.TransformRect(m_rtClipRect);
+  matrix.GetInverse().TransformRect(m_rtClipRect);
 
   m_pWidgetIterator = pPageView->CreateWidgetIterator(
       XFA_TRAVERSEWAY_Form,