Index: Source/core/rendering/RenderLayer.cpp |
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp |
index 6c0ea164646c03824f057d169cb1329ea6e755bd..30b50b4b74f7f2b1334bb89347e2116a728285bb 100644 |
--- a/Source/core/rendering/RenderLayer.cpp |
+++ b/Source/core/rendering/RenderLayer.cpp |
@@ -133,6 +133,7 @@ RenderLayer::RenderLayer(RenderLayerModelObject* renderer) |
, m_staticInlinePosition(0) |
, m_staticBlockPosition(0) |
, m_enclosingPaginationLayer(0) |
+ , m_groupedMapping(0) |
, m_repainter(renderer) |
, m_clipper(renderer) |
{ |
@@ -1109,15 +1110,16 @@ static inline const RenderLayer* compositingContainer(const RenderLayer* layer) |
// FIXME: having two different functions named enclosingCompositingLayer and enclosingCompositingLayerForRepaint |
// is error-prone and misleading for reading code that uses these functions - especially compounded with |
-// the includeSelf option. It is very likely that some call sites of this function actually mean to use |
-// enclosingCompositingLayerForRepaint(). |
+// the includeSelf option. It is very likely that we don't even want either of these functions; A layer |
+// should be told explicitly which GraphicsLayer is the repaintContainer for a RenderLayer, and |
+// any other use cases should probably have an API between the non-compositing and compositing sides of code. |
RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const |
{ |
- if (includeSelf && hasCompositedLayerMapping()) |
+ if (includeSelf && compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking) |
return const_cast<RenderLayer*>(this); |
for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) { |
- if (curr->hasCompositedLayerMapping()) |
+ if (curr->compositingState() != NotComposited && curr->compositingState() != PaintsIntoGroupedBacking) |
return const_cast<RenderLayer*>(curr); |
} |
@@ -1126,11 +1128,11 @@ RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const |
RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const |
{ |
- if (includeSelf && compositingState() == PaintsIntoOwnBacking) |
+ if (includeSelf && (compositingState() == PaintsIntoOwnBacking || compositingState() == PaintsIntoGroupedBacking)) |
return const_cast<RenderLayer*>(this); |
for (const RenderLayer* curr = compositingContainer(this); curr; curr = compositingContainer(curr)) { |
- if (curr->compositingState() == PaintsIntoOwnBacking) |
+ if (curr->compositingState() == PaintsIntoOwnBacking || curr->compositingState() == PaintsIntoGroupedBacking) |
return const_cast<RenderLayer*>(curr); |
} |
@@ -1883,7 +1885,7 @@ static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag |
void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
{ |
- if (compositingState() != NotComposited) { |
+ if (compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking) { |
// The updatingControlTints() painting pass goes through compositing layers, |
// but we need to ensure that we don't cache clip rects computed with the wrong root in this case. |
if (context->updatingControlTints() || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)) { |
@@ -2224,6 +2226,11 @@ void RenderLayer::paintChildren(unsigned childrenToVisit, GraphicsContext* conte |
RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit); |
while (RenderLayerStackingNode* child = iterator.next()) { |
RenderLayer* childLayer = child->layer(); |
+ |
+ // Squashed RenderLayers should not paint into their ancestor. |
+ if (childLayer->compositingState() == PaintsIntoGroupedBacking) |
+ continue; |
+ |
if (!childLayer->isPaginated()) |
childLayer->paintLayer(context, paintingInfo, paintFlags); |
else |
@@ -3635,6 +3642,12 @@ CompositingState RenderLayer::compositingState() const |
// This is computed procedurally so there is no redundant state variable that |
// can get out of sync from the real actual compositing state. |
+ if (m_groupedMapping) { |
+ ASSERT(compositor()->isLayerSquashingEnabled()); |
+ ASSERT(!m_compositedLayerMapping); |
+ return PaintsIntoGroupedBacking; |
+ } |
+ |
if (!m_compositedLayerMapping) |
return NotComposited; |
@@ -3993,10 +4006,20 @@ void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle) |
|| needsCompositingLayersRebuiltForClip(oldStyle, newStyle) |
|| needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) |
|| needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintWithFilters) |
- || needsCompositingLayersRebuiltForBlending(oldStyle, newStyle)) |
+ || needsCompositingLayersRebuiltForBlending(oldStyle, newStyle)) { |
compositor()->setCompositingLayersNeedRebuild(); |
- else if (hasCompositedLayerMapping()) |
+ } else if (compositingState() == PaintsIntoOwnBacking || compositingState() == HasOwnBackingButPaintsIntoAncestor) { |
+ ASSERT(hasCompositedLayerMapping()); |
compositedLayerMapping()->updateGraphicsLayerGeometry(); |
+ } else if (compositingState() == PaintsIntoGroupedBacking) { |
+ ASSERT(compositor()->isLayerSquashingEnabled()); |
+ ASSERT(groupedMapping()); |
+ // updateGraphicsLayerGeometry() is called to update the squashingLayer in case its size/position has changed. |
+ // FIXME: Make sure to create a layout test that covers this scenario. |
+ // FIXME: It is not expected that any other layers on the compositedLayerMapping would change. we should |
+ // be able to just update the squashing layer only and save a lot of computation. |
+ groupedMapping()->updateGraphicsLayerGeometry(); |
+ } |
} |
bool RenderLayer::scrollsOverflow() const |