OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "cc/trees/property_tree_builder.h" | 5 #include "cc/trees/property_tree_builder.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
11 #include "cc/layers/layer.h" | 11 #include "cc/layers/layer.h" |
12 #include "cc/trees/layer_tree_host.h" | 12 #include "cc/trees/layer_tree_host.h" |
13 #include "ui/gfx/geometry/point_f.h" | 13 #include "ui/gfx/geometry/point_f.h" |
14 | 14 |
15 namespace cc { | 15 namespace cc { |
16 | 16 |
17 class LayerTreeHost; | 17 class LayerTreeHost; |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 struct DataForRecursion { | 21 struct DataForRecursion { |
22 TransformTree* transform_tree; | 22 TransformTree* transform_tree; |
23 ClipTree* clip_tree; | 23 ClipTree* clip_tree; |
24 OpacityTree* opacity_tree; | |
24 Layer* transform_tree_parent; | 25 Layer* transform_tree_parent; |
25 Layer* transform_fixed_parent; | 26 Layer* transform_fixed_parent; |
26 Layer* render_target; | 27 Layer* render_target; |
27 int clip_tree_parent; | 28 int clip_tree_parent; |
29 int opacity_tree_parent; | |
28 gfx::Vector2dF offset_to_transform_tree_parent; | 30 gfx::Vector2dF offset_to_transform_tree_parent; |
29 gfx::Vector2dF offset_to_transform_fixed_parent; | 31 gfx::Vector2dF offset_to_transform_fixed_parent; |
30 const Layer* page_scale_layer; | 32 const Layer* page_scale_layer; |
31 float page_scale_factor; | 33 float page_scale_factor; |
32 float device_scale_factor; | 34 float device_scale_factor; |
33 bool in_subtree_of_page_scale_application_layer; | 35 bool in_subtree_of_page_scale_application_layer; |
34 const gfx::Transform* device_transform; | 36 const gfx::Transform* device_transform; |
35 }; | 37 }; |
36 | 38 |
37 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { | 39 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 node->data.pre_local.Translate3d(-layer->transform_origin().x(), | 218 node->data.pre_local.Translate3d(-layer->transform_origin().x(), |
217 -layer->transform_origin().y(), | 219 -layer->transform_origin().y(), |
218 -layer->transform_origin().z()); | 220 -layer->transform_origin().z()); |
219 | 221 |
220 node->data.needs_local_transform_update = true; | 222 node->data.needs_local_transform_update = true; |
221 data_from_ancestor.transform_tree->UpdateTransforms(node->id); | 223 data_from_ancestor.transform_tree->UpdateTransforms(node->id); |
222 | 224 |
223 layer->set_offset_to_transform_parent(gfx::Vector2dF()); | 225 layer->set_offset_to_transform_parent(gfx::Vector2dF()); |
224 } | 226 } |
225 | 227 |
228 void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, | |
229 Layer* layer, | |
230 DataForRecursion* data_for_children) { | |
231 const bool is_root = !layer->parent(); | |
232 const bool has_transparency = layer->opacity() != 1.f; | |
233 const bool has_animated_opacity = | |
234 layer->layer_animation_controller()->IsAnimatingProperty( | |
235 Animation::OPACITY); | |
Ian Vollick
2015/02/24 21:25:36
Does this capture impl-only opacity animations? Th
ajuma
2015/02/24 21:30:38
Afaik, PZ scrollbars no longer use impl-only anima
ajuma
2015/02/24 21:53:29
Updated to also create nodes for layers that can a
| |
236 bool requires_node = is_root || has_transparency || has_animated_opacity; | |
237 | |
238 int parent_id = data_from_ancestor.opacity_tree_parent; | |
239 | |
240 if (!requires_node) { | |
241 layer->set_opacity_tree_index(parent_id); | |
242 data_for_children->opacity_tree_parent = parent_id; | |
243 return; | |
244 } | |
245 | |
246 OpacityNode node; | |
247 node.data = layer->opacity(); | |
248 data_for_children->opacity_tree_parent = | |
249 data_for_children->opacity_tree->Insert(node, parent_id); | |
250 layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); | |
251 } | |
252 | |
226 void BuildPropertyTreesInternal(Layer* layer, | 253 void BuildPropertyTreesInternal(Layer* layer, |
227 const DataForRecursion& data_from_parent) { | 254 const DataForRecursion& data_from_parent) { |
228 DataForRecursion data_for_children(data_from_parent); | 255 DataForRecursion data_for_children(data_from_parent); |
229 if (layer->render_surface()) | 256 if (layer->render_surface()) |
230 data_for_children.render_target = layer; | 257 data_for_children.render_target = layer; |
231 | 258 |
232 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); | 259 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); |
233 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); | 260 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); |
261 AddOpacityNodeIfNeeded(data_from_parent, layer, &data_for_children); | |
234 | 262 |
235 if (layer == data_from_parent.page_scale_layer) | 263 if (layer == data_from_parent.page_scale_layer) |
236 data_for_children.in_subtree_of_page_scale_application_layer = true; | 264 data_for_children.in_subtree_of_page_scale_application_layer = true; |
237 | 265 |
238 for (size_t i = 0; i < layer->children().size(); ++i) { | 266 for (size_t i = 0; i < layer->children().size(); ++i) { |
239 if (!layer->children()[i]->scroll_parent()) | 267 if (!layer->children()[i]->scroll_parent()) |
240 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); | 268 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); |
241 } | 269 } |
242 | 270 |
243 if (layer->scroll_children()) { | 271 if (layer->scroll_children()) { |
244 for (Layer* scroll_child : *layer->scroll_children()) { | 272 for (Layer* scroll_child : *layer->scroll_children()) { |
245 BuildPropertyTreesInternal(scroll_child, data_for_children); | 273 BuildPropertyTreesInternal(scroll_child, data_for_children); |
246 } | 274 } |
247 } | 275 } |
248 | 276 |
249 if (layer->has_replica()) | 277 if (layer->has_replica()) |
250 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children); | 278 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children); |
251 } | 279 } |
252 | 280 |
253 } // namespace | 281 } // namespace |
254 | 282 |
255 void PropertyTreeBuilder::BuildPropertyTrees( | 283 void PropertyTreeBuilder::BuildPropertyTrees( |
256 Layer* root_layer, | 284 Layer* root_layer, |
257 const Layer* page_scale_layer, | 285 const Layer* page_scale_layer, |
258 float page_scale_factor, | 286 float page_scale_factor, |
259 float device_scale_factor, | 287 float device_scale_factor, |
260 const gfx::Rect& viewport, | 288 const gfx::Rect& viewport, |
261 const gfx::Transform& device_transform, | 289 const gfx::Transform& device_transform, |
262 TransformTree* transform_tree, | 290 TransformTree* transform_tree, |
263 ClipTree* clip_tree) { | 291 ClipTree* clip_tree, |
292 OpacityTree* opacity_tree) { | |
264 DataForRecursion data_for_recursion; | 293 DataForRecursion data_for_recursion; |
265 data_for_recursion.transform_tree = transform_tree; | 294 data_for_recursion.transform_tree = transform_tree; |
266 data_for_recursion.clip_tree = clip_tree; | 295 data_for_recursion.clip_tree = clip_tree; |
296 data_for_recursion.opacity_tree = opacity_tree; | |
267 data_for_recursion.transform_tree_parent = nullptr; | 297 data_for_recursion.transform_tree_parent = nullptr; |
268 data_for_recursion.transform_fixed_parent = nullptr; | 298 data_for_recursion.transform_fixed_parent = nullptr; |
269 data_for_recursion.render_target = root_layer; | 299 data_for_recursion.render_target = root_layer; |
270 data_for_recursion.clip_tree_parent = 0; | 300 data_for_recursion.clip_tree_parent = 0; |
301 data_for_recursion.opacity_tree_parent = -1; | |
271 data_for_recursion.page_scale_layer = page_scale_layer; | 302 data_for_recursion.page_scale_layer = page_scale_layer; |
272 data_for_recursion.page_scale_factor = page_scale_factor; | 303 data_for_recursion.page_scale_factor = page_scale_factor; |
273 data_for_recursion.device_scale_factor = device_scale_factor; | 304 data_for_recursion.device_scale_factor = device_scale_factor; |
274 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 305 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
275 data_for_recursion.device_transform = &device_transform; | 306 data_for_recursion.device_transform = &device_transform; |
276 | 307 |
277 ClipNode root_clip; | 308 ClipNode root_clip; |
278 root_clip.data.clip = viewport; | 309 root_clip.data.clip = viewport; |
279 root_clip.data.transform_id = 0; | 310 root_clip.data.transform_id = 0; |
280 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); | 311 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); |
281 BuildPropertyTreesInternal(root_layer, data_for_recursion); | 312 BuildPropertyTreesInternal(root_layer, data_for_recursion); |
282 } | 313 } |
283 | 314 |
284 } // namespace cc | 315 } // namespace cc |
OLD | NEW |