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())