Chromium Code Reviews| Index: Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
| diff --git a/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp b/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
| index 4b1ef4df0d2a50e0abae356538608ad271ee726b..c7beadd6a523fe0a302ca5cdfd9b8196fb123aeb 100644 |
| --- a/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
| +++ b/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
| @@ -2266,36 +2266,40 @@ bool CompositedDeprecatedPaintLayerMapping::updateSquashingLayerAssignment(Depre |
| // NOTE: composited bounds are updated elsewhere |
| // NOTE: offsetFromLayoutObject is updated elsewhere |
| - // Change tracking on squashing layers: at the first sign of something changed, just invalidate the layer. |
| - // FIXME: Perhaps we can find a tighter more clever mechanism later. |
| - bool updatedAssignment = false; |
| + DeprecatedPaintLayer* formerLayer = nullptr; |
| if (nextSquashedLayerIndex < m_squashedLayers.size()) { |
| - if (paintInfo.paintLayer != m_squashedLayers[nextSquashedLayerIndex].paintLayer) { |
| - compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
| - updatedAssignment = true; |
| - m_squashedLayers[nextSquashedLayerIndex] = paintInfo; |
| - } |
| + if (paintInfo.paintLayer == m_squashedLayers[nextSquashedLayerIndex].paintLayer) |
| + return false; |
| + |
| + // Track previous entry, but don't remove it yet. We don't want to shuffle the vector. |
| + formerLayer = m_squashedLayers[nextSquashedLayerIndex].paintLayer; |
| + m_squashedLayers[nextSquashedLayerIndex] = paintInfo; |
| } else { |
| - compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
| m_squashedLayers.append(paintInfo); |
| - updatedAssignment = true; |
| } |
| squashedLayer->setGroupedMapping(this); |
| - return updatedAssignment; |
| + |
| + // Change tracking on squashing layers: at the first sign of something changed, just invalidate the layer. |
| + // FIXME: Perhaps we can find a tighter more clever mechanism later. |
| + compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
| + |
| + // Reset the mapping on the previous entry |
| + if (formerLayer) |
| + formerLayer->setGroupedMapping(nullptr); |
|
Stephen Chennney
2015/06/30 19:44:02
This unfortunately has the side effect of doing so
|
| + |
| + return true; |
| } |
| void CompositedDeprecatedPaintLayerMapping::removeLayerFromSquashingGraphicsLayer(const DeprecatedPaintLayer* layer) |
| { |
| - size_t layerIndex = kNotFound; |
| - |
| - for (size_t i = 0; i < m_squashedLayers.size(); ++i) { |
| - if (m_squashedLayers[i].paintLayer == layer) { |
| - layerIndex = i; |
| + size_t layerIndex = 0; |
| + for (; layerIndex < m_squashedLayers.size(); ++layerIndex) { |
| + if (m_squashedLayers[layerIndex].paintLayer == layer) { |
| break; |
| } |
| } |
| - if (layerIndex == kNotFound) |
| + if (layerIndex == m_squashedLayers.size()) |
| return; |
| m_squashedLayers.remove(layerIndex); |
| @@ -2303,8 +2307,15 @@ void CompositedDeprecatedPaintLayerMapping::removeLayerFromSquashingGraphicsLaye |
| void CompositedDeprecatedPaintLayerMapping::finishAccumulatingSquashingLayers(size_t nextSquashedLayerIndex) |
| { |
| - // Any additional squashed Layers in the array no longer exist, and removing invalidates the squashingLayer contents. |
| - if (nextSquashedLayerIndex < m_squashedLayers.size()) |
| + // Any additional squashed Layers in the array no longer exist, and removing invalidates the |
| + // squashingLayer contents. |
|
Stephen Chennney
2015/06/30 19:44:02
I'm having trouble interpreting this comment. Is i
|
| + for (size_t i = nextSquashedLayerIndex ; i < m_squashedLayers.size(); ++i) { |
| + // Setting to nullptr removes from the vector, via removeLayerFromSquashingGraphicsLayer, |
| + // except when the layer is being destroyed. |
| + m_squashedLayers[i].paintLayer->setGroupedMapping(nullptr); |
|
Stephen Chennney
2015/06/30 19:44:02
See comment about, might be a real bad idea.
|
| + } |
| + |
| + if (nextSquashedLayerIndex < m_squashedLayers.size()) { |
| m_squashedLayers.remove(nextSquashedLayerIndex, m_squashedLayers.size() - nextSquashedLayerIndex); |
| } |