summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderSVGResourceMasker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderSVGResourceMasker.cpp')
-rw-r--r--WebCore/rendering/RenderSVGResourceMasker.cpp16
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;
}