diff options
Diffstat (limited to 'WebCore/rendering/RenderSVGResourceMasker.cpp')
-rw-r--r-- | WebCore/rendering/RenderSVGResourceMasker.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/WebCore/rendering/RenderSVGResourceMasker.cpp b/WebCore/rendering/RenderSVGResourceMasker.cpp index 2bfb283..ea79439 100644 --- a/WebCore/rendering/RenderSVGResourceMasker.cpp +++ b/WebCore/rendering/RenderSVGResourceMasker.cpp @@ -210,12 +210,22 @@ void RenderSVGResourceMasker::calculateMaskContentRepaintRect() } } -FloatRect RenderSVGResourceMasker::resourceBoundingBox(const FloatRect& objectBoundingBox) +FloatRect RenderSVGResourceMasker::resourceBoundingBox(RenderObject* object) { + // Save the reference to the calling object for relayouting it on changing resource properties. + if (!m_masker.contains(object)) + m_masker.set(object, new MaskerData); + + // Resource was not layouted yet. Give back clipping rect of the mask. + SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); + FloatRect objectBoundingBox = object->objectBoundingBox(); + FloatRect maskBoundaries = maskElement->maskBoundingBox(objectBoundingBox); + if (selfNeedsLayout()) + return maskBoundaries; + if (m_maskBoundaries.isEmpty()) calculateMaskContentRepaintRect(); - SVGMaskElement* maskElement = static_cast<SVGMaskElement*>(node()); if (!maskElement) return FloatRect(); @@ -227,7 +237,7 @@ FloatRect RenderSVGResourceMasker::resourceBoundingBox(const FloatRect& objectBo maskRect = transform.mapRect(maskRect); } - maskRect.intersect(maskElement->maskBoundingBox(objectBoundingBox)); + maskRect.intersect(maskBoundaries); return maskRect; } |