Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index 10b57090264f2556569695ca5801ce7d253c12f3..ef70964c712e1d7fd01a56e9db84767adfde6634 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -1397,6 +1397,34 @@ void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo |
return; |
} |
+ if (repaintContainer->compositingState() == PaintsIntoGroupedBacking) { |
+ ASSERT(repaintContainer->groupedMapping()); |
+ |
+ // Not clean, but if squashing layer does not yet exist here (e.g. repaint invalidation coming from within recomputing compositing requirements) |
+ // then it's ok to just exit here, since the squashing layer will get repainted when it is newly created. |
+ if (!repaintContainer->groupedMapping()->squashingLayer()) |
+ return; |
+ |
+ |
+ IntRect offsetRect(r); |
+ |
+ // First, convert the repaint rect into the space of the repaintContainer |
+ TransformState transformState(TransformState::ApplyTransformDirection, FloatQuad(FloatRect(r))); |
+ mapLocalToContainer(repaintContainer, transformState, ApplyContainerFlip); |
+ transformState.flatten(); |
+ offsetRect = transformState.lastPlanarQuad().enclosingBoundingBox(); |
+ |
+ // FIXME: the repaint rect computed below could be tighter in uncommon nested transform cases, if we passed the quad |
+ // directly to the next chunk of code. |
+ |
+ // Then, convert the repaint rect from repaintConainer space into the squashing GraphicsLayer's coordinates. |
+ if (repaintContainer->hasTransform()) |
+ offsetRect = repaintContainer->layer()->transform()->mapRect(r); |
+ offsetRect.move(-repaintContainer->layer()->offsetFromSquashingLayerOrigin()); |
+ repaintContainer->groupedMapping()->squashingLayer()->setNeedsDisplayInRect(offsetRect); |
+ return; |
+ } |
+ |
if (repaintContainer->isRenderFlowThread()) { |
toRenderFlowThread(repaintContainer)->repaintRectangleInRegions(r); |
return; |