OLD | NEW |
| (Empty) |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 | |
7 #include "TreeSynchronizer.h" | |
8 | |
9 #include "CCLayerImpl.h" | |
10 #include "CCScrollbarAnimationController.h" | |
11 #include "CCScrollbarLayerImpl.h" | |
12 #include "LayerChromium.h" | |
13 #include "ScrollbarLayerChromium.h" | |
14 | |
15 namespace cc { | |
16 | |
17 scoped_ptr<CCLayerImpl> TreeSynchronizer::synchronizeTrees(LayerChromium* layerC
hromiumRoot, scoped_ptr<CCLayerImpl> oldCCLayerImplRoot, CCLayerTreeHostImpl* ho
stImpl) | |
18 { | |
19 ScopedPtrCCLayerImplMap oldLayers; | |
20 RawPtrCCLayerImplMap newLayers; | |
21 | |
22 collectExistingCCLayerImplRecursive(oldLayers, oldCCLayerImplRoot.Pass()); | |
23 | |
24 scoped_ptr<CCLayerImpl> newTree = synchronizeTreeRecursive(newLayers, oldLay
ers, layerChromiumRoot, hostImpl); | |
25 | |
26 updateScrollbarLayerPointersRecursive(newLayers, layerChromiumRoot); | |
27 | |
28 return newTree.Pass(); | |
29 } | |
30 | |
31 void TreeSynchronizer::collectExistingCCLayerImplRecursive(ScopedPtrCCLayerImplM
ap& oldLayers, scoped_ptr<CCLayerImpl> ccLayerImpl) | |
32 { | |
33 if (!ccLayerImpl) | |
34 return; | |
35 | |
36 ScopedPtrVector<CCLayerImpl>& children = ccLayerImpl->m_children; | |
37 for (size_t i = 0; i < children.size(); ++i) | |
38 collectExistingCCLayerImplRecursive(oldLayers, children.take(i)); | |
39 | |
40 collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_maskLayer.Pass
()); | |
41 collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_replicaLayer.P
ass()); | |
42 | |
43 int id = ccLayerImpl->id(); | |
44 oldLayers.set(id, ccLayerImpl.Pass()); | |
45 } | |
46 | |
47 scoped_ptr<CCLayerImpl> TreeSynchronizer::reuseOrCreateCCLayerImpl(RawPtrCCLayer
ImplMap& newLayers, ScopedPtrCCLayerImplMap& oldLayers, LayerChromium* layer) | |
48 { | |
49 scoped_ptr<CCLayerImpl> ccLayerImpl = oldLayers.take(layer->id()); | |
50 | |
51 if (!ccLayerImpl) | |
52 ccLayerImpl = layer->createCCLayerImpl(); | |
53 | |
54 newLayers[layer->id()] = ccLayerImpl.get(); | |
55 return ccLayerImpl.Pass(); | |
56 } | |
57 | |
58 scoped_ptr<CCLayerImpl> TreeSynchronizer::synchronizeTreeRecursive(RawPtrCCLayer
ImplMap& newLayers, ScopedPtrCCLayerImplMap& oldLayers, LayerChromium* layer, CC
LayerTreeHostImpl* hostImpl) | |
59 { | |
60 if (!layer) | |
61 return scoped_ptr<CCLayerImpl>(); | |
62 | |
63 scoped_ptr<CCLayerImpl> ccLayerImpl = reuseOrCreateCCLayerImpl(newLayers, ol
dLayers, layer); | |
64 | |
65 ccLayerImpl->clearChildList(); | |
66 const std::vector<scoped_refptr<LayerChromium> >& children = layer->children
(); | |
67 for (size_t i = 0; i < children.size(); ++i) | |
68 ccLayerImpl->addChild(synchronizeTreeRecursive(newLayers, oldLayers, chi
ldren[i].get(), hostImpl)); | |
69 | |
70 ccLayerImpl->setMaskLayer(synchronizeTreeRecursive(newLayers, oldLayers, lay
er->maskLayer(), hostImpl)); | |
71 ccLayerImpl->setReplicaLayer(synchronizeTreeRecursive(newLayers, oldLayers,
layer->replicaLayer(), hostImpl)); | |
72 | |
73 layer->pushPropertiesTo(ccLayerImpl.get()); | |
74 ccLayerImpl->setLayerTreeHostImpl(hostImpl); | |
75 | |
76 // Remove all dangling pointers. The pointers will be setup later in updateS
crollbarLayerPointersRecursive phase | |
77 if (CCScrollbarAnimationController* scrollbarController = ccLayerImpl->scrol
lbarAnimationController()) { | |
78 scrollbarController->setHorizontalScrollbarLayer(0); | |
79 scrollbarController->setVerticalScrollbarLayer(0); | |
80 } | |
81 | |
82 return ccLayerImpl.Pass(); | |
83 } | |
84 | |
85 void TreeSynchronizer::updateScrollbarLayerPointersRecursive(const RawPtrCCLayer
ImplMap& newLayers, LayerChromium* layer) | |
86 { | |
87 if (!layer) | |
88 return; | |
89 | |
90 const std::vector<scoped_refptr<LayerChromium> >& children = layer->children
(); | |
91 for (size_t i = 0; i < children.size(); ++i) | |
92 updateScrollbarLayerPointersRecursive(newLayers, children[i].get()); | |
93 | |
94 ScrollbarLayerChromium* scrollbarLayer = layer->toScrollbarLayerChromium(); | |
95 if (!scrollbarLayer) | |
96 return; | |
97 | |
98 RawPtrCCLayerImplMap::const_iterator iter = newLayers.find(scrollbarLayer->i
d()); | |
99 CCScrollbarLayerImpl* ccScrollbarLayerImpl = iter != newLayers.end() ? stati
c_cast<CCScrollbarLayerImpl*>(iter->second) : NULL; | |
100 iter = newLayers.find(scrollbarLayer->scrollLayerId()); | |
101 CCLayerImpl* ccScrollLayerImpl = iter != newLayers.end() ? iter->second : NU
LL; | |
102 | |
103 ASSERT(ccScrollbarLayerImpl); | |
104 ASSERT(ccScrollLayerImpl); | |
105 | |
106 if (ccScrollbarLayerImpl->orientation() == WebKit::WebScrollbar::Horizontal) | |
107 ccScrollLayerImpl->setHorizontalScrollbarLayer(ccScrollbarLayerImpl); | |
108 else | |
109 ccScrollLayerImpl->setVerticalScrollbarLayer(ccScrollbarLayerImpl); | |
110 } | |
111 | |
112 } // namespace cc | |
OLD | NEW |