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#ifndef CC_TREES_TREE_SYNCHRONIZER_H_
6#define CC_TREES_TREE_SYNCHRONIZER_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "cc/base/cc_export.h"
11
12namespace cc {
13
14class LayerImpl;
15class LayerTreeImpl;
16class Layer;
17
18class CC_EXPORT TreeSynchronizer {
19 public:
20  // Accepts a Layer tree and returns a reference to a LayerImpl tree that
21  // duplicates the structure of the Layer tree, reusing the LayerImpls in the
22  // tree provided by old_layer_impl_root if possible.
23  static scoped_ptr<LayerImpl> SynchronizeTrees(
24      Layer* layer_root,
25      scoped_ptr<LayerImpl> old_layer_impl_root,
26      LayerTreeImpl* tree_impl);
27  static scoped_ptr<LayerImpl> SynchronizeTrees(
28      LayerImpl* layer_root,
29      scoped_ptr<LayerImpl> old_layer_impl_root,
30      LayerTreeImpl* tree_impl);
31
32  // Pushes properties from a Layer or LayerImpl tree to a structurally
33  // equivalent LayerImpl tree.
34  static void PushProperties(Layer* layer_root,
35                             LayerImpl* layer_impl_root);
36  static void PushProperties(LayerImpl* layer_root, LayerImpl* layer_impl_root);
37
38 private:
39  TreeSynchronizer();  // Not instantiable.
40
41  template <typename LayerType>
42  static void PushPropertiesInternal(
43      LayerType* layer,
44      LayerImpl* layer_impl,
45      size_t* num_dependents_need_push_properties_for_parent);
46
47  DISALLOW_COPY_AND_ASSIGN(TreeSynchronizer);
48};
49
50}  // namespace cc
51
52#endif  // CC_TREES_TREE_SYNCHRONIZER_H_
53