blob: 9b42e7330a6df0d6d42494b478b2a36e1a19d344 [file] [log] [blame]
[email protected]94f206c12012-08-25 00:09:141// 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#include <wtf/RefPtr.h>
15
[email protected]9c88e562012-09-14 22:21:3016namespace cc {
[email protected]94f206c12012-08-25 00:09:1417
18PassOwnPtr<CCLayerImpl> TreeSynchronizer::synchronizeTrees(LayerChromium* layerChromiumRoot, PassOwnPtr<CCLayerImpl> oldCCLayerImplRoot, CCLayerTreeHostImpl* hostImpl)
19{
20 OwnPtrCCLayerImplMap oldLayers;
21 RawPtrCCLayerImplMap newLayers;
22
23 collectExistingCCLayerImplRecursive(oldLayers, oldCCLayerImplRoot);
24
25 OwnPtr<CCLayerImpl> newTree = synchronizeTreeRecursive(newLayers, oldLayers, layerChromiumRoot, hostImpl);
26
27 updateScrollbarLayerPointersRecursive(newLayers, layerChromiumRoot);
28
29 return newTree.release();
30}
31
32void TreeSynchronizer::collectExistingCCLayerImplRecursive(OwnPtrCCLayerImplMap& oldLayers, PassOwnPtr<CCLayerImpl> popCCLayerImpl)
33{
34 OwnPtr<CCLayerImpl> ccLayerImpl = popCCLayerImpl;
35
36 if (!ccLayerImpl)
37 return;
38
39 Vector<OwnPtr<CCLayerImpl> >& children = ccLayerImpl->m_children;
40 for (size_t i = 0; i < children.size(); ++i)
41 collectExistingCCLayerImplRecursive(oldLayers, children[i].release());
42
43 collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_maskLayer.release());
44 collectExistingCCLayerImplRecursive(oldLayers, ccLayerImpl->m_replicaLayer.release());
45
46 int id = ccLayerImpl->id();
47 oldLayers.set(id, ccLayerImpl.release());
48}
49
50PassOwnPtr<CCLayerImpl> TreeSynchronizer::reuseOrCreateCCLayerImpl(RawPtrCCLayerImplMap& newLayers, OwnPtrCCLayerImplMap& oldLayers, LayerChromium* layer)
51{
52 OwnPtr<CCLayerImpl> ccLayerImpl = oldLayers.take(layer->id());
53
54 if (!ccLayerImpl)
55 ccLayerImpl = layer->createCCLayerImpl();
56
57 newLayers.set(layer->id(), ccLayerImpl.get());
58 return ccLayerImpl.release();
59}
60
61PassOwnPtr<CCLayerImpl> TreeSynchronizer::synchronizeTreeRecursive(RawPtrCCLayerImplMap& newLayers, OwnPtrCCLayerImplMap& oldLayers, LayerChromium* layer, CCLayerTreeHostImpl* hostImpl)
62{
63 if (!layer)
64 return nullptr;
65
66 OwnPtr<CCLayerImpl> ccLayerImpl = reuseOrCreateCCLayerImpl(newLayers, oldLayers, layer);
67
68 ccLayerImpl->clearChildList();
69 const Vector<RefPtr<LayerChromium> >& children = layer->children();
70 for (size_t i = 0; i < children.size(); ++i)
71 ccLayerImpl->addChild(synchronizeTreeRecursive(newLayers, oldLayers, children[i].get(), hostImpl));
72
73 ccLayerImpl->setMaskLayer(synchronizeTreeRecursive(newLayers, oldLayers, layer->maskLayer(), hostImpl));
74 ccLayerImpl->setReplicaLayer(synchronizeTreeRecursive(newLayers, oldLayers, layer->replicaLayer(), hostImpl));
75
76 layer->pushPropertiesTo(ccLayerImpl.get());
77 ccLayerImpl->setLayerTreeHostImpl(hostImpl);
78
79 // Remove all dangling pointers. The pointers will be setup later in updateScrollbarLayerPointersRecursive phase
80 if (CCScrollbarAnimationController* scrollbarController = ccLayerImpl->scrollbarAnimationController()) {
81 scrollbarController->setHorizontalScrollbarLayer(0);
82 scrollbarController->setVerticalScrollbarLayer(0);
83 }
84
85 return ccLayerImpl.release();
86}
87
88void TreeSynchronizer::updateScrollbarLayerPointersRecursive(const RawPtrCCLayerImplMap& newLayers, LayerChromium* layer)
89{
90 if (!layer)
91 return;
92
93 const Vector<RefPtr<LayerChromium> >& children = layer->children();
94 for (size_t i = 0; i < children.size(); ++i)
95 updateScrollbarLayerPointersRecursive(newLayers, children[i].get());
96
97 ScrollbarLayerChromium* scrollbarLayer = layer->toScrollbarLayerChromium();
98 if (!scrollbarLayer)
99 return;
100
101 CCScrollbarLayerImpl* ccScrollbarLayerImpl = static_cast<CCScrollbarLayerImpl*>(newLayers.get(scrollbarLayer->id()));
102 ASSERT(ccScrollbarLayerImpl);
103 CCLayerImpl* ccScrollLayerImpl = newLayers.get(scrollbarLayer->scrollLayerId());
104 ASSERT(ccScrollLayerImpl);
105
106 if (ccScrollbarLayerImpl->orientation() == WebKit::WebScrollbar::Horizontal)
107 ccScrollLayerImpl->setHorizontalScrollbarLayer(ccScrollbarLayerImpl);
108 else
109 ccScrollLayerImpl->setVerticalScrollbarLayer(ccScrollbarLayerImpl);
110}
111
[email protected]9c88e562012-09-14 22:21:30112} // namespace cc