OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/auto_reset.h" | 5 #include "base/auto_reset.h" |
6 #include "cc/animation/animation_host.h" | 6 #include "cc/animation/animation_host.h" |
7 #include "cc/layers/layer.h" | 7 #include "cc/layers/layer.h" |
8 #include "cc/proto/layer_tree.pb.h" | 8 #include "cc/proto/layer_tree.pb.h" |
9 #include "cc/trees/layer_tree.h" | 9 #include "cc/trees/layer_tree.h" |
| 10 #include "cc/trees/layer_tree_host.h" |
10 | 11 |
11 namespace cc { | 12 namespace cc { |
12 | 13 |
13 LayerTree::LayerTree(std::unique_ptr<AnimationHost> animation_host) | 14 LayerTree::LayerTree(std::unique_ptr<AnimationHost> animation_host, |
| 15 LayerTreeHost* layer_tree_host) |
14 : in_paint_layer_contents_(false), | 16 : in_paint_layer_contents_(false), |
15 animation_host_(std::move(animation_host)) { | 17 animation_host_(std::move(animation_host)), |
| 18 layer_tree_host_(layer_tree_host) { |
16 DCHECK(animation_host_); | 19 DCHECK(animation_host_); |
| 20 DCHECK(layer_tree_host_); |
| 21 animation_host_->SetMutatorHostClient(this); |
17 } | 22 } |
18 | 23 |
19 LayerTree::~LayerTree() {} | 24 LayerTree::~LayerTree() { |
| 25 animation_host_->SetMutatorHostClient(nullptr); |
| 26 } |
20 | 27 |
21 void LayerTree::RegisterLayer(Layer* layer) { | 28 void LayerTree::RegisterLayer(Layer* layer) { |
22 DCHECK(!LayerById(layer->id())); | 29 DCHECK(!LayerById(layer->id())); |
23 DCHECK(!in_paint_layer_contents_); | 30 DCHECK(!in_paint_layer_contents_); |
24 layer_id_map_[layer->id()] = layer; | 31 layer_id_map_[layer->id()] = layer; |
25 if (layer->element_id()) { | 32 if (layer->element_id()) { |
26 animation_host_->RegisterElement(layer->element_id(), | 33 animation_host_->RegisterElement(layer->element_id(), |
27 ElementListType::ACTIVE); | 34 ElementListType::ACTIVE); |
28 } | 35 } |
29 } | 36 } |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 proto->set_in_paint_layer_contents(in_paint_layer_contents()); | 86 proto->set_in_paint_layer_contents(in_paint_layer_contents()); |
80 } | 87 } |
81 | 88 |
82 void LayerTree::FromProtobuf(const proto::LayerTree& proto) { | 89 void LayerTree::FromProtobuf(const proto::LayerTree& proto) { |
83 for (auto layer_id : proto.layers_that_should_push_properties()) { | 90 for (auto layer_id : proto.layers_that_should_push_properties()) { |
84 AddLayerShouldPushProperties(layer_id_map_[layer_id]); | 91 AddLayerShouldPushProperties(layer_id_map_[layer_id]); |
85 } | 92 } |
86 in_paint_layer_contents_ = proto.in_paint_layer_contents(); | 93 in_paint_layer_contents_ = proto.in_paint_layer_contents(); |
87 } | 94 } |
88 | 95 |
| 96 Layer* LayerTree::LayerByElementId(ElementId element_id) const { |
| 97 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); |
| 98 return iter != element_layers_map_.end() ? iter->second : nullptr; |
| 99 } |
| 100 |
| 101 void LayerTree::AddToElementMap(Layer* layer) { |
| 102 if (!layer->element_id()) |
| 103 return; |
| 104 |
| 105 element_layers_map_[layer->element_id()] = layer; |
| 106 } |
| 107 |
| 108 void LayerTree::RemoveFromElementMap(Layer* layer) { |
| 109 if (!layer->element_id()) |
| 110 return; |
| 111 |
| 112 element_layers_map_.erase(layer->element_id()); |
| 113 } |
| 114 |
| 115 bool LayerTree::IsElementInList(ElementId element_id, |
| 116 ElementListType list_type) const { |
| 117 return list_type == ElementListType::ACTIVE && LayerByElementId(element_id); |
| 118 } |
| 119 |
| 120 void LayerTree::SetMutatorsNeedCommit() { |
| 121 layer_tree_host_->SetNeedsCommit(); |
| 122 } |
| 123 |
| 124 void LayerTree::SetMutatorsNeedRebuildPropertyTrees() { |
| 125 layer_tree_host_->property_trees()->needs_rebuild = true; |
| 126 } |
| 127 |
| 128 void LayerTree::SetElementFilterMutated(ElementId element_id, |
| 129 ElementListType list_type, |
| 130 const FilterOperations& filters) { |
| 131 Layer* layer = LayerByElementId(element_id); |
| 132 DCHECK(layer); |
| 133 layer->OnFilterAnimated(filters); |
| 134 } |
| 135 |
| 136 void LayerTree::SetElementOpacityMutated(ElementId element_id, |
| 137 ElementListType list_type, |
| 138 float opacity) { |
| 139 Layer* layer = LayerByElementId(element_id); |
| 140 DCHECK(layer); |
| 141 layer->OnOpacityAnimated(opacity); |
| 142 } |
| 143 |
| 144 void LayerTree::SetElementTransformMutated(ElementId element_id, |
| 145 ElementListType list_type, |
| 146 const gfx::Transform& transform) { |
| 147 Layer* layer = LayerByElementId(element_id); |
| 148 DCHECK(layer); |
| 149 layer->OnTransformAnimated(transform); |
| 150 } |
| 151 |
| 152 void LayerTree::SetElementScrollOffsetMutated( |
| 153 ElementId element_id, |
| 154 ElementListType list_type, |
| 155 const gfx::ScrollOffset& scroll_offset) { |
| 156 Layer* layer = LayerByElementId(element_id); |
| 157 DCHECK(layer); |
| 158 layer->OnScrollOffsetAnimated(scroll_offset); |
| 159 } |
| 160 |
| 161 void LayerTree::ElementTransformIsAnimatingChanged( |
| 162 ElementId element_id, |
| 163 ElementListType list_type, |
| 164 AnimationChangeType change_type, |
| 165 bool is_animating) { |
| 166 Layer* layer = LayerByElementId(element_id); |
| 167 if (layer) { |
| 168 switch (change_type) { |
| 169 case AnimationChangeType::POTENTIAL: |
| 170 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); |
| 171 break; |
| 172 case AnimationChangeType::RUNNING: |
| 173 layer->OnTransformIsCurrentlyAnimatingChanged(is_animating); |
| 174 break; |
| 175 case AnimationChangeType::BOTH: |
| 176 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); |
| 177 layer->OnTransformIsCurrentlyAnimatingChanged(is_animating); |
| 178 break; |
| 179 } |
| 180 } |
| 181 } |
| 182 |
| 183 void LayerTree::ElementOpacityIsAnimatingChanged( |
| 184 ElementId element_id, |
| 185 ElementListType list_type, |
| 186 AnimationChangeType change_type, |
| 187 bool is_animating) { |
| 188 Layer* layer = LayerByElementId(element_id); |
| 189 if (layer) { |
| 190 switch (change_type) { |
| 191 case AnimationChangeType::POTENTIAL: |
| 192 layer->OnOpacityIsPotentiallyAnimatingChanged(is_animating); |
| 193 break; |
| 194 case AnimationChangeType::RUNNING: |
| 195 layer->OnOpacityIsCurrentlyAnimatingChanged(is_animating); |
| 196 break; |
| 197 case AnimationChangeType::BOTH: |
| 198 layer->OnOpacityIsPotentiallyAnimatingChanged(is_animating); |
| 199 layer->OnOpacityIsCurrentlyAnimatingChanged(is_animating); |
| 200 break; |
| 201 } |
| 202 } |
| 203 } |
| 204 |
| 205 void LayerTree::ElementFilterIsAnimatingChanged(ElementId element_id, |
| 206 ElementListType list_type, |
| 207 AnimationChangeType change_type, |
| 208 bool is_animating) { |
| 209 Layer* layer = LayerByElementId(element_id); |
| 210 if (layer) { |
| 211 switch (change_type) { |
| 212 case AnimationChangeType::POTENTIAL: |
| 213 layer->OnFilterIsPotentiallyAnimatingChanged(is_animating); |
| 214 break; |
| 215 case AnimationChangeType::RUNNING: |
| 216 layer->OnFilterIsCurrentlyAnimatingChanged(is_animating); |
| 217 break; |
| 218 case AnimationChangeType::BOTH: |
| 219 layer->OnFilterIsPotentiallyAnimatingChanged(is_animating); |
| 220 layer->OnFilterIsCurrentlyAnimatingChanged(is_animating); |
| 221 break; |
| 222 } |
| 223 } |
| 224 } |
| 225 |
| 226 gfx::ScrollOffset LayerTree::GetScrollOffsetForAnimation( |
| 227 ElementId element_id) const { |
| 228 Layer* layer = LayerByElementId(element_id); |
| 229 DCHECK(layer); |
| 230 return layer->ScrollOffsetForAnimation(); |
| 231 } |
| 232 |
| 233 LayerListIterator<Layer> LayerTree::begin() const { |
| 234 return LayerListIterator<Layer>(layer_tree_host_->root_layer()); |
| 235 } |
| 236 |
| 237 LayerListIterator<Layer> LayerTree::end() const { |
| 238 return LayerListIterator<Layer>(nullptr); |
| 239 } |
| 240 |
| 241 LayerListReverseIterator<Layer> LayerTree::rbegin() { |
| 242 return LayerListReverseIterator<Layer>(layer_tree_host_->root_layer()); |
| 243 } |
| 244 |
| 245 LayerListReverseIterator<Layer> LayerTree::rend() { |
| 246 return LayerListReverseIterator<Layer>(nullptr); |
| 247 } |
| 248 |
89 } // namespace cc | 249 } // namespace cc |
OLD | NEW |