diff options
-rw-r--r-- | core/fpdfapi/page/cpdf_clippath.cpp | 20 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_pageobject.cpp | 10 | ||||
-rw-r--r-- | core/fpdfapi/page/cpdf_pageobject.h | 3 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_renderstatus.cpp | 8 |
4 files changed, 21 insertions, 20 deletions
diff --git a/core/fpdfapi/page/cpdf_clippath.cpp b/core/fpdfapi/page/cpdf_clippath.cpp index 465a2d3549..9782469786 100644 --- a/core/fpdfapi/page/cpdf_clippath.cpp +++ b/core/fpdfapi/page/cpdf_clippath.cpp @@ -55,21 +55,21 @@ CFX_FloatRect CPDF_ClipPath::GetClipBox() const { bool bLayerStarted = false; for (size_t i = 0; i < GetTextCount(); ++i) { CPDF_TextObject* pTextObj = GetText(i); - if (!pTextObj) { - if (!bStarted) { - rect = layer_rect; - bStarted = true; + if (pTextObj) { + if (bLayerStarted) { + layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox())); } else { - rect.Intersect(layer_rect); + layer_rect = CFX_FloatRect(pTextObj->GetBBox()); + bLayerStarted = true; } - bLayerStarted = false; } else { - if (!bLayerStarted) { - layer_rect = CFX_FloatRect(pTextObj->GetBBox(nullptr)); - bLayerStarted = true; + if (bStarted) { + rect.Intersect(layer_rect); } else { - layer_rect.Union(CFX_FloatRect(pTextObj->GetBBox(nullptr))); + rect = layer_rect; + bStarted = true; } + bLayerStarted = false; } } return rect; diff --git a/core/fpdfapi/page/cpdf_pageobject.cpp b/core/fpdfapi/page/cpdf_pageobject.cpp index 604309f6e6..0c3a850936 100644 --- a/core/fpdfapi/page/cpdf_pageobject.cpp +++ b/core/fpdfapi/page/cpdf_pageobject.cpp @@ -98,10 +98,10 @@ void CPDF_PageObject::TransformGeneralState(CFX_Matrix& matrix) { 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 3fc35aa063..1dfe20b6f9 100644 --- a/core/fpdfapi/page/cpdf_pageobject.h +++ b/core/fpdfapi/page/cpdf_pageobject.h @@ -60,7 +60,8 @@ class CPDF_PageObject : public CPDF_GraphicStates { 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 7d78253ea6..19fea76d70 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -1121,7 +1121,7 @@ bool CPDF_RenderStatus::ContinueSingleObject(CPDF_PageObject* pObj, 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 @@ bool CPDF_RenderStatus::ClipPattern(const CPDF_PageObject* pPageObj, 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 @@ bool CPDF_RenderStatus::ProcessTransparency(CPDF_PageObject* pPageObj, } 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::DrawShadingPattern(CPDF_ShadingPattern* pattern, 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()) |