Remove optional matrix parameter from CPDF_PageObject::GetBBox().

Instead, add GetTransformedBBox() with a required matrix parameter and
use that when the there is a matrix.

Change-Id: I594f3eb6bc7e1bc3eb6aa9f66556ebb1dfdbebe1
Reviewed-on: https://pdfium-review.googlesource.com/c/43553
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_clippath.cpp b/core/fpdfapi/page/cpdf_clippath.cpp
index 465a2d3..9782469 100644
--- a/core/fpdfapi/page/cpdf_clippath.cpp
+++ b/core/fpdfapi/page/cpdf_clippath.cpp
@@ -55,21 +55,21 @@
   bool bLayerStarted = false;
   for (size_t i = 0; i < GetTextCount(); ++i) {
     CPDF_TextObject* pTextObj = GetText(i);
-    if (!pTextObj) {
-      if (!bStarted) {
+    if (pTextObj) {
+      if (bLayerStarted) {
+        layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox()));
+      } else {
+        layer_rect = CFX_FloatRect(pTextObj->GetBBox());
+        bLayerStarted = true;
+      }
+    } else {
+      if (bStarted) {
+        rect.Intersect(layer_rect);
+      } else {
         rect = layer_rect;
         bStarted = true;
-      } else {
-        rect.Intersect(layer_rect);
       }
       bLayerStarted = false;
-    } else {
-      if (!bLayerStarted) {
-        layer_rect = CFX_FloatRect(pTextObj->GetBBox(nullptr));
-        bLayerStarted = true;
-      } else {
-        layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox(nullptr)));
-      }
     }
   }
   return rect;
diff --git a/core/fpdfapi/page/cpdf_pageobject.cpp b/core/fpdfapi/page/cpdf_pageobject.cpp
index 604309f..0c3a850 100644
--- a/core/fpdfapi/page/cpdf_pageobject.cpp
+++ b/core/fpdfapi/page/cpdf_pageobject.cpp
@@ -98,10 +98,10 @@
   SetDirty(true);
 }
 
-FX_RECT CPDF_PageObject::GetBBox(const CFX_Matrix* pMatrix) const {
-  CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);
-  if (pMatrix)
-    rect = pMatrix->TransformRect(rect);
+FX_RECT CPDF_PageObject::GetBBox() const {
+  return GetRect().GetOuterRect();
+}
 
-  return rect.GetOuterRect();
+FX_RECT CPDF_PageObject::GetTransformedBBox(const CFX_Matrix& matrix) const {
+  return matrix.TransformRect(GetRect()).GetOuterRect();
 }
diff --git a/core/fpdfapi/page/cpdf_pageobject.h b/core/fpdfapi/page/cpdf_pageobject.h
index 3fc35aa..1dfe20b 100644
--- a/core/fpdfapi/page/cpdf_pageobject.h
+++ b/core/fpdfapi/page/cpdf_pageobject.h
@@ -60,7 +60,8 @@
   CFX_FloatRect GetRect() const {
     return CFX_FloatRect(m_Left, m_Bottom, m_Right, m_Top);
   }
-  FX_RECT GetBBox(const CFX_Matrix* pMatrix) const;
+  FX_RECT GetBBox() const;
+  FX_RECT GetTransformedBBox(const CFX_Matrix& matrix) const;
 
   // Get what content stream the object was parsed from in its page. This number
   // is the index of the content stream in the "Contents" array, or 0 if there
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 7d78253..19fea76 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1121,7 +1121,7 @@
 FX_RECT CPDF_RenderStatus::GetObjectClippedRect(
     const CPDF_PageObject* pObj,
     const CFX_Matrix& mtObj2Device) const {
-  FX_RECT rect = pObj->GetBBox(&mtObj2Device);
+  FX_RECT rect = pObj->GetTransformedBBox(mtObj2Device);
   rect.Intersect(m_pDevice->GetClipBox());
   return rect;
 }
@@ -1405,7 +1405,7 @@
   if (pPageObj->IsPath())
     return SelectClipPath(pPageObj->AsPath(), mtObj2Device, bStroke);
   if (pPageObj->IsImage()) {
-    m_pDevice->SetClip_Rect(pPageObj->GetBBox(&mtObj2Device));
+    m_pDevice->SetClip_Rect(pPageObj->GetTransformedBBox(mtObj2Device));
     return true;
   }
   return false;
@@ -1514,7 +1514,7 @@
     }
     return true;
   }
-  FX_RECT rect = pPageObj->GetBBox(&mtObj2Device);
+  FX_RECT rect = pPageObj->GetTransformedBBox(mtObj2Device);
   rect.Intersect(m_pDevice->GetClipBox());
   if (rect.IsEmpty())
     return true;
@@ -2138,7 +2138,7 @@
 
 void CPDF_RenderStatus::ProcessShading(const CPDF_ShadingObject* pShadingObj,
                                        const CFX_Matrix& mtObj2Device) {
-  FX_RECT rect = pShadingObj->GetBBox(&mtObj2Device);
+  FX_RECT rect = pShadingObj->GetTransformedBBox(mtObj2Device);
   FX_RECT clip_box = m_pDevice->GetClipBox();
   rect.Intersect(clip_box);
   if (rect.IsEmpty())