Index: Source/core/rendering/compositing/CompositingLayerAssigner.cpp |
diff --git a/Source/core/rendering/compositing/CompositingLayerAssigner.cpp b/Source/core/rendering/compositing/CompositingLayerAssigner.cpp |
index 22e2c90fdc6a7db14f8b796df09bd15c0e516cf9..dee2bb4f26e744b67e4d9050944243fa0d882e38 100644 |
--- a/Source/core/rendering/compositing/CompositingLayerAssigner.cpp |
+++ b/Source/core/rendering/compositing/CompositingLayerAssigner.cpp |
@@ -45,10 +45,10 @@ CompositingLayerAssigner::~CompositingLayerAssigner() |
{ |
} |
-void CompositingLayerAssigner::assign(RenderLayer* updateRoot, bool& layersChanged) |
+void CompositingLayerAssigner::assign(RenderLayer* updateRoot, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint) |
{ |
SquashingState squashingState; |
- assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged); |
+ assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged, layersNeedingRepaint); |
if (squashingState.hasMostRecentMapping) |
squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squashingState.nextSquashedLayerIndex); |
} |
@@ -161,7 +161,8 @@ bool CompositingLayerAssigner::canSquashIntoCurrentSquashingOwner(const RenderLa |
return true; |
} |
-bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, SquashingState& squashingState, const CompositingStateTransitionType compositedLayerUpdate) |
+bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, SquashingState& squashingState, const CompositingStateTransitionType compositedLayerUpdate, |
+ Vector<RenderLayer*>& layersNeedingRepaint) |
{ |
// NOTE: In the future as we generalize this, the background of this layer may need to be assigned to a different backing than |
// the squashed RenderLayer's own primary contents. This would happen when we have a composited negative z-index element that needs |
@@ -183,16 +184,8 @@ bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ |
layer->clipper().clearClipRectsIncludingDescendants(); |
- // FIXME: it seems premature to compute this before all compositing state has been updated? |
- // This layer and all of its descendants have cached repaints rects that are relative to |
- // the repaint container, so change when compositing changes; we need to update them here. |
- |
- // FIXME: what's up with parent()? |
- if (layer->parent()) |
- layer->repainter().computeRepaintRectsIncludingDescendants(); |
- |
// Issue a repaint, since |layer| may have been added to an already-existing squashing layer. |
- m_compositor->repaintOnCompositingChange(layer); |
+ layersNeedingRepaint.append(layer); |
return true; |
} |
@@ -204,12 +197,8 @@ bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ |
layer->setGroupedMapping(0); |
} |
- // This layer and all of its descendants have cached repaints rects that are relative to |
- // the repaint container, so change when compositing changes; we need to update them here. |
- layer->repainter().computeRepaintRectsIncludingDescendants(); |
- |
// If we need to repaint, do so now that we've removed it from a squashed layer. |
- m_compositor->repaintOnCompositingChange(layer); |
+ layersNeedingRepaint.append(layer); |
layer->setLostGroupedMapping(false); |
return true; |
@@ -218,10 +207,11 @@ bool CompositingLayerAssigner::updateSquashingAssignment(RenderLayer* layer, Squ |
return false; |
} |
-void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLayer* reflectionLayer, bool& layersChanged) |
+void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLayer* reflectionLayer, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint) |
{ |
CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(reflectionLayer); |
if (compositedLayerUpdate != NoCompositingStateChange) { |
+ layersNeedingRepaint.append(reflectionLayer); |
layersChanged = true; |
m_compositor->allocateOrClearCompositedLayerMapping(reflectionLayer, compositedLayerUpdate); |
} |
@@ -230,23 +220,25 @@ void CompositingLayerAssigner::assignLayersToBackingsForReflectionLayer(RenderLa |
reflectionLayer->compositedLayerMapping()->updateGraphicsLayerConfiguration(GraphicsLayerUpdater::ForceUpdate); |
} |
-void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, bool& layersChanged) |
+void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, bool& layersChanged, Vector<RenderLayer*>& layersNeedingRepaint) |
{ |
if (m_layerSquashingEnabled && requiresSquashing(layer->compositingReasons()) && !canSquashIntoCurrentSquashingOwner(layer, squashingState)) |
layer->setCompositingReasons(layer->compositingReasons() | CompositingReasonNoSquashingTargetFound); |
CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer); |
- if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate)) |
+ if (m_compositor->allocateOrClearCompositedLayerMapping(layer, compositedLayerUpdate)) { |
+ layersNeedingRepaint.append(layer); |
layersChanged = true; |
+ } |
// FIXME: special-casing reflection layers here is not right. |
if (layer->reflectionInfo()) |
- assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflectionLayer(), layersChanged); |
+ assignLayersToBackingsForReflectionLayer(layer->reflectionInfo()->reflectionLayer(), layersChanged, layersNeedingRepaint); |
// Add this layer to a squashing backing if needed. |
if (m_layerSquashingEnabled) { |
- if (updateSquashingAssignment(layer, squashingState, compositedLayerUpdate)) |
+ if (updateSquashingAssignment(layer, squashingState, compositedLayerUpdate, layersNeedingRepaint)) |
layersChanged = true; |
const bool layerIsSquashed = compositedLayerUpdate == PutInSquashingLayer || (compositedLayerUpdate == NoCompositingStateChange && layer->groupedMapping()); |
@@ -261,7 +253,7 @@ void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer |
if (layer->stackingNode()->isStackingContext()) { |
RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NegativeZOrderChildren); |
while (RenderLayerStackingNode* curNode = iterator.next()) |
- assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged); |
+ assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged, layersNeedingRepaint); |
} |
if (m_layerSquashingEnabled) { |
@@ -274,7 +266,7 @@ void CompositingLayerAssigner::assignLayersToBackingsInternal(RenderLayer* layer |
RenderLayerStackingNodeIterator iterator(*layer->stackingNode(), NormalFlowChildren | PositiveZOrderChildren); |
while (RenderLayerStackingNode* curNode = iterator.next()) |
- assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged); |
+ assignLayersToBackingsInternal(curNode->layer(), squashingState, layersChanged, layersNeedingRepaint); |
if (squashingState.hasMostRecentMapping && &squashingState.mostRecentMapping->owningLayer() == layer) |
squashingState.haveAssignedBackingsToEntireSquashingLayerSubtree = true; |