Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp |
diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
index 5101d1624c157ef5013bdb0e12e08bbfd1798ce8..1c0d59e41b161cad9e24d3afc9ed091604bccf7a 100644 |
--- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
+++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
@@ -619,6 +619,51 @@ bool RenderLayerCompositor::parentFrameContentLayers(RenderPart* renderer) |
return true; |
} |
+bool RenderLayerCompositor::computeEnclosingCompositingLayer(Node* node, RenderLayer*& renderLayer, GraphicsLayer*& graphicsLayer) |
+{ |
+ if (!node || !node->renderer()) |
+ return false; |
+ |
+ // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries |
+ // to find a suitable layer. |
+ RenderObject* renderer = node->renderer(); |
+ do { |
+ renderLayer = renderer->enclosingLayer()->enclosingLayerForPaintInvalidation(); |
+ if (!renderLayer) { |
+ renderer = renderer->frame()->ownerRenderer(); |
+ if (!renderer) |
+ return false; |
+ } |
+ } while (!renderLayer); |
+ |
+ ASSERT(renderLayer->compositingState() != NotComposited); |
+ |
+ graphicsLayer = renderLayer->graphicsLayerBacking(); |
+ if (!graphicsLayer->drawsContent()) { |
+ graphicsLayer = renderLayer->graphicsLayerBackingForScrolling(); |
+ } |
+ |
+ return true; |
+} |
+ |
+static FloatPoint convertTargetSpacePointToCompositedLayer(const FloatPoint& point, RenderObject* targetRenderer, RenderObject* compositedRenderer) |
+{ |
+ IntPoint roundedPoint(roundedIntPoint(point)); |
+ roundedPoint = targetRenderer->frame()->view()->contentsToWindow(roundedPoint); |
+ roundedPoint = compositedRenderer->frame()->view()->windowToContents(roundedPoint); |
+ return compositedRenderer->absoluteToLocal(roundedPoint, UseTransforms); |
+} |
+ |
+void RenderLayerCompositor::convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, RenderObject* compositedRenderer, FloatQuad& compositedSpaceQuad) |
+{ |
+ ASSERT(targetRenderer); |
+ ASSERT(compositedRenderer); |
+ compositedSpaceQuad.setP1(convertTargetSpacePointToCompositedLayer(targetSpaceQuad.p1(), targetRenderer, compositedRenderer)); |
+ compositedSpaceQuad.setP2(convertTargetSpacePointToCompositedLayer(targetSpaceQuad.p2(), targetRenderer, compositedRenderer)); |
+ compositedSpaceQuad.setP3(convertTargetSpacePointToCompositedLayer(targetSpaceQuad.p3(), targetRenderer, compositedRenderer)); |
+ compositedSpaceQuad.setP4(convertTargetSpacePointToCompositedLayer(targetSpaceQuad.p4(), targetRenderer, compositedRenderer)); |
+} |
+ |
void RenderLayerCompositor::repaintCompositedLayers() |
{ |
recursiveRepaintLayer(rootRenderLayer()); |