Index: Source/core/rendering/svg/RenderSVGBlock.cpp |
diff --git a/Source/core/rendering/svg/RenderSVGBlock.cpp b/Source/core/rendering/svg/RenderSVGBlock.cpp |
index a3dc5c9d07b3722ad48f2003efcd85788a24a8b3..4744ea897d690f3509f48cfbddbdaaf201598d29 100644 |
--- a/Source/core/rendering/svg/RenderSVGBlock.cpp |
+++ b/Source/core/rendering/svg/RenderSVGBlock.cpp |
@@ -126,8 +126,29 @@ void RenderSVGBlock::invalidateTreeIfNeeded(const PaintInvalidationState& paintI |
if (!shouldCheckForPaintInvalidation(paintInvalidationState)) |
return; |
+ if (paintInvalidationState.cachedOffsetsEnabled()) { |
+ m_cachedPaintInvalidationTransform = paintInvalidationState.svgTransform(); |
+ } else { |
+ m_cachedPaintInvalidationTransform.makeIdentity(); |
+ RenderObject* next = parent(); |
+ while (!next->isSVGRoot()) { |
+ m_cachedPaintInvalidationTransform = next->localToParentTransform() * m_cachedPaintInvalidationTransform; |
+ next = next->parent(); |
+ ASSERT(next); |
+ } |
+ m_cachedPaintInvalidationTransform = toRenderSVGRoot(next)->localToBorderBoxTransform() * m_cachedPaintInvalidationTransform; |
+ } |
+ |
ForceHorriblySlowRectMapping slowRectMapping(&paintInvalidationState); |
RenderBlockFlow::invalidateTreeIfNeeded(paintInvalidationState); |
} |
+void RenderSVGBlock::updatePaintInfoRect(IntRect& rect) |
+{ |
+ if (rect != LayoutRect::infiniteRect()) { |
+ AffineTransform transformToRoot = m_cachedPaintInvalidationTransform * localTransform(); |
+ rect = enclosingIntRect(transformToRoot.inverse().mapRect(FloatRect(rect))); |
+ } |
+} |
+ |
} |