Chromium Code Reviews| Index: cc/tree_synchronizer.cc |
| diff --git a/cc/tree_synchronizer.cc b/cc/tree_synchronizer.cc |
| index b7e76bbe9ab16d6843bfb26937329c17e35b6233..d7f63cb98b8adf9d83a2ec6eb44afb10cc51f530 100644 |
| --- a/cc/tree_synchronizer.cc |
| +++ b/cc/tree_synchronizer.cc |
| @@ -19,7 +19,7 @@ scoped_ptr<CCLayerImpl> TreeSynchronizer::synchronizeTrees(LayerChromium* layerC |
| ScopedPtrCCLayerImplMap oldLayers; |
| RawPtrCCLayerImplMap newLayers; |
| - collectExistingCCLayerImplRecursive(oldLayers, oldCCLayerImplRoot.Pass()); |
| + collectExistingCCLayerImplRecursive(layerChromiumRoot, oldLayers, oldCCLayerImplRoot.Pass()); |
| scoped_ptr<CCLayerImpl> newTree = synchronizeTreeRecursive(newLayers, oldLayers, layerChromiumRoot, hostImpl); |
| @@ -28,17 +28,26 @@ scoped_ptr<CCLayerImpl> TreeSynchronizer::synchronizeTrees(LayerChromium* layerC |
| return newTree.Pass(); |
| } |
| -void TreeSynchronizer::collectExistingCCLayerImplRecursive(ScopedPtrCCLayerImplMap& oldLayers, scoped_ptr<CCLayerImpl> ccLayerImpl) |
| +void TreeSynchronizer::collectExistingCCLayerImplRecursive(LayerChromium* layer, ScopedPtrCCLayerImplMap& oldLayers, scoped_ptr<CCLayerImpl> ccLayerImpl) |
| { |
| - if (!ccLayerImpl) |
| + if (!layer || !ccLayerImpl || layer->id() != ccLayerImpl->id()) |
| return; |
| - ScopedPtrVector<CCLayerImpl>& children = ccLayerImpl->m_children; |
| - for (size_t i = 0; i < children.size(); ++i) |
| - collectExistingCCLayerImplRecursive(oldLayers, children.take(i)); |
| + if (!layer->deferUpdates()) { |
| + ScopedPtrVector<CCLayerImpl>& oldChildren = ccLayerImpl->m_children; |
| + ScopedPtrCCLayerImplMap oldChildrenMap; |
| + for (size_t i = 0; i < oldChildren.size(); ++i) { |
| + int oldChildId = oldChildren[i]->id(); |
| + oldChildrenMap.set(oldChildId, oldChildren.take(i)); |
| + } |
| - collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_maskLayer.Pass()); |
| - collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_replicaLayer.Pass()); |
| + const LayerChromium::LayerList& children = layer->children(); |
| + for (size_t i = 0; i < children.size(); ++i) |
| + collectExistingCCLayerImplRecursive(children[i].get(), oldLayers, oldChildrenMap.take(children[i]->id())); |
|
piman
2012/10/17 21:26:32
Why is it a problem to collect all the older layer
jonathan.backer
2012/10/18 20:20:35
Collecting all the old layers detroys the LayerImp
|
| + |
| + collectExistingCCLayerImplRecursive(layer->maskLayer(), oldLayers, ccLayerImpl->m_maskLayer.Pass()); |
| + collectExistingCCLayerImplRecursive(layer->replicaLayer(), oldLayers, ccLayerImpl->m_replicaLayer.Pass()); |
| + } |
| int id = ccLayerImpl->id(); |
| oldLayers.set(id, ccLayerImpl.Pass()); |
| @@ -60,6 +69,9 @@ scoped_ptr<CCLayerImpl> TreeSynchronizer::synchronizeTreeRecursive(RawPtrCCLayer |
| if (!layer) |
| return scoped_ptr<CCLayerImpl>(); |
| + if (layer->deferUpdates()) |
| + return oldLayers.take(layer->id()); |
| + |
| scoped_ptr<CCLayerImpl> ccLayerImpl = reuseOrCreateCCLayerImpl(newLayers, oldLayers, layer); |
| ccLayerImpl->clearChildList(); |