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.
7 #include "TreeSynchronizer.h"
9 #include "CCLayerImpl.h"
10 #include "CCScrollbarAnimationController.h"
11 #include "CCScrollbarLayerImpl.h"
12 #include "LayerChromium.h"
13 #include "ScrollbarLayerChromium.h"
17 PassOwnPtr
<CCLayerImpl
> TreeSynchronizer::synchronizeTrees(LayerChromium
* layerChromiumRoot
, PassOwnPtr
<CCLayerImpl
> oldCCLayerImplRoot
, CCLayerTreeHostImpl
* hostImpl
)
19 OwnPtrCCLayerImplMap oldLayers
;
20 RawPtrCCLayerImplMap newLayers
;
22 collectExistingCCLayerImplRecursive(oldLayers
, oldCCLayerImplRoot
);
24 OwnPtr
<CCLayerImpl
> newTree
= synchronizeTreeRecursive(newLayers
, oldLayers
, layerChromiumRoot
, hostImpl
);
26 updateScrollbarLayerPointersRecursive(newLayers
, layerChromiumRoot
);
28 return newTree
.release();
31 void TreeSynchronizer::collectExistingCCLayerImplRecursive(OwnPtrCCLayerImplMap
& oldLayers
, PassOwnPtr
<CCLayerImpl
> popCCLayerImpl
)
33 OwnPtr
<CCLayerImpl
> ccLayerImpl
= popCCLayerImpl
;
38 OwnPtrVector
<CCLayerImpl
>& children
= ccLayerImpl
->m_children
;
39 for (size_t i
= 0; i
< children
.size(); ++i
)
40 collectExistingCCLayerImplRecursive(oldLayers
, children
.take(i
));
42 collectExistingCCLayerImplRecursive(oldLayers
, ccLayerImpl
->m_maskLayer
.release());
43 collectExistingCCLayerImplRecursive(oldLayers
, ccLayerImpl
->m_replicaLayer
.release());
45 int id
= ccLayerImpl
->id();
46 oldLayers
.set(id
, ccLayerImpl
.release());
49 PassOwnPtr
<CCLayerImpl
> TreeSynchronizer::reuseOrCreateCCLayerImpl(RawPtrCCLayerImplMap
& newLayers
, OwnPtrCCLayerImplMap
& oldLayers
, LayerChromium
* layer
)
51 OwnPtr
<CCLayerImpl
> ccLayerImpl
= oldLayers
.take(layer
->id());
54 ccLayerImpl
= layer
->createCCLayerImpl();
56 newLayers
.set(layer
->id(), ccLayerImpl
.get());
57 return ccLayerImpl
.release();
60 PassOwnPtr
<CCLayerImpl
> TreeSynchronizer::synchronizeTreeRecursive(RawPtrCCLayerImplMap
& newLayers
, OwnPtrCCLayerImplMap
& oldLayers
, LayerChromium
* layer
, CCLayerTreeHostImpl
* hostImpl
)
65 OwnPtr
<CCLayerImpl
> ccLayerImpl
= reuseOrCreateCCLayerImpl(newLayers
, oldLayers
, layer
);
67 ccLayerImpl
->clearChildList();
68 const std::vector
<scoped_refptr
<LayerChromium
> >& children
= layer
->children();
69 for (size_t i
= 0; i
< children
.size(); ++i
)
70 ccLayerImpl
->addChild(synchronizeTreeRecursive(newLayers
, oldLayers
, children
[i
].get(), hostImpl
));
72 ccLayerImpl
->setMaskLayer(synchronizeTreeRecursive(newLayers
, oldLayers
, layer
->maskLayer(), hostImpl
));
73 ccLayerImpl
->setReplicaLayer(synchronizeTreeRecursive(newLayers
, oldLayers
, layer
->replicaLayer(), hostImpl
));
75 layer
->pushPropertiesTo(ccLayerImpl
.get());
76 ccLayerImpl
->setLayerTreeHostImpl(hostImpl
);
78 // Remove all dangling pointers. The pointers will be setup later in updateScrollbarLayerPointersRecursive phase
79 if (CCScrollbarAnimationController
* scrollbarController
= ccLayerImpl
->scrollbarAnimationController()) {
80 scrollbarController
->setHorizontalScrollbarLayer(0);
81 scrollbarController
->setVerticalScrollbarLayer(0);
84 return ccLayerImpl
.release();
87 void TreeSynchronizer::updateScrollbarLayerPointersRecursive(const RawPtrCCLayerImplMap
& newLayers
, LayerChromium
* layer
)
92 const std::vector
<scoped_refptr
<LayerChromium
> >& children
= layer
->children();
93 for (size_t i
= 0; i
< children
.size(); ++i
)
94 updateScrollbarLayerPointersRecursive(newLayers
, children
[i
].get());
96 ScrollbarLayerChromium
* scrollbarLayer
= layer
->toScrollbarLayerChromium();
100 CCScrollbarLayerImpl
* ccScrollbarLayerImpl
= static_cast<CCScrollbarLayerImpl
*>(newLayers
.get(scrollbarLayer
->id()));
101 ASSERT(ccScrollbarLayerImpl
);
102 CCLayerImpl
* ccScrollLayerImpl
= newLayers
.get(scrollbarLayer
->scrollLayerId());
103 ASSERT(ccScrollLayerImpl
);
105 if (ccScrollbarLayerImpl
->orientation() == WebKit::WebScrollbar::Horizontal
)
106 ccScrollLayerImpl
->setHorizontalScrollbarLayer(ccScrollbarLayerImpl
);
108 ccScrollLayerImpl
->setVerticalScrollbarLayer(ccScrollbarLayerImpl
);