| 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) || |
| 236 layer->OpacityCanAnimateOnImplThread(); |
| 237 bool requires_node = is_root || has_transparency || has_animated_opacity; |
| 238 |
| 239 int parent_id = data_from_ancestor.opacity_tree_parent; |
| 240 |
| 241 if (!requires_node) { |
| 242 layer->set_opacity_tree_index(parent_id); |
| 243 data_for_children->opacity_tree_parent = parent_id; |
| 244 return; |
| 245 } |
| 246 |
| 247 OpacityNode node; |
| 248 node.data = layer->opacity(); |
| 249 data_for_children->opacity_tree_parent = |
| 250 data_for_children->opacity_tree->Insert(node, parent_id); |
| 251 layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); |
| 252 } |
| 253 |
| 226 void BuildPropertyTreesInternal(Layer* layer, | 254 void BuildPropertyTreesInternal(Layer* layer, |
| 227 const DataForRecursion& data_from_parent) { | 255 const DataForRecursion& data_from_parent) { |
| 228 DataForRecursion data_for_children(data_from_parent); | 256 DataForRecursion data_for_children(data_from_parent); |
| 229 if (layer->render_surface()) | 257 if (layer->render_surface()) |
| 230 data_for_children.render_target = layer; | 258 data_for_children.render_target = layer; |
| 231 | 259 |
| 232 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); | 260 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 233 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); | 261 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 234 | 262 |
| 263 if (data_from_parent.opacity_tree) |
| 264 AddOpacityNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 265 |
| 235 if (layer == data_from_parent.page_scale_layer) | 266 if (layer == data_from_parent.page_scale_layer) |
| 236 data_for_children.in_subtree_of_page_scale_application_layer = true; | 267 data_for_children.in_subtree_of_page_scale_application_layer = true; |
| 237 | 268 |
| 238 for (size_t i = 0; i < layer->children().size(); ++i) { | 269 for (size_t i = 0; i < layer->children().size(); ++i) { |
| 239 if (!layer->children()[i]->scroll_parent()) | 270 if (!layer->children()[i]->scroll_parent()) |
| 240 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); | 271 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); |
| 241 } | 272 } |
| 242 | 273 |
| 243 if (layer->scroll_children()) { | 274 if (layer->scroll_children()) { |
| 244 for (Layer* scroll_child : *layer->scroll_children()) { | 275 for (Layer* scroll_child : *layer->scroll_children()) { |
| 245 BuildPropertyTreesInternal(scroll_child, data_for_children); | 276 BuildPropertyTreesInternal(scroll_child, data_for_children); |
| 246 } | 277 } |
| 247 } | 278 } |
| 248 | 279 |
| 249 if (layer->has_replica()) | 280 if (layer->has_replica()) |
| 250 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children); | 281 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children); |
| 251 } | 282 } |
| 252 | 283 |
| 253 } // namespace | 284 } // namespace |
| 254 | 285 |
| 255 void PropertyTreeBuilder::BuildPropertyTrees( | 286 void PropertyTreeBuilder::BuildPropertyTrees( |
| 256 Layer* root_layer, | 287 Layer* root_layer, |
| 257 const Layer* page_scale_layer, | 288 const Layer* page_scale_layer, |
| 258 float page_scale_factor, | 289 float page_scale_factor, |
| 259 float device_scale_factor, | 290 float device_scale_factor, |
| 260 const gfx::Rect& viewport, | 291 const gfx::Rect& viewport, |
| 261 const gfx::Transform& device_transform, | 292 const gfx::Transform& device_transform, |
| 262 TransformTree* transform_tree, | 293 TransformTree* transform_tree, |
| 263 ClipTree* clip_tree) { | 294 ClipTree* clip_tree, |
| 295 OpacityTree* opacity_tree) { |
| 264 DataForRecursion data_for_recursion; | 296 DataForRecursion data_for_recursion; |
| 265 data_for_recursion.transform_tree = transform_tree; | 297 data_for_recursion.transform_tree = transform_tree; |
| 266 data_for_recursion.clip_tree = clip_tree; | 298 data_for_recursion.clip_tree = clip_tree; |
| 299 data_for_recursion.opacity_tree = opacity_tree; |
| 267 data_for_recursion.transform_tree_parent = nullptr; | 300 data_for_recursion.transform_tree_parent = nullptr; |
| 268 data_for_recursion.transform_fixed_parent = nullptr; | 301 data_for_recursion.transform_fixed_parent = nullptr; |
| 269 data_for_recursion.render_target = root_layer; | 302 data_for_recursion.render_target = root_layer; |
| 270 data_for_recursion.clip_tree_parent = 0; | 303 data_for_recursion.clip_tree_parent = 0; |
| 304 data_for_recursion.opacity_tree_parent = -1; |
| 271 data_for_recursion.page_scale_layer = page_scale_layer; | 305 data_for_recursion.page_scale_layer = page_scale_layer; |
| 272 data_for_recursion.page_scale_factor = page_scale_factor; | 306 data_for_recursion.page_scale_factor = page_scale_factor; |
| 273 data_for_recursion.device_scale_factor = device_scale_factor; | 307 data_for_recursion.device_scale_factor = device_scale_factor; |
| 274 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 308 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
| 275 data_for_recursion.device_transform = &device_transform; | 309 data_for_recursion.device_transform = &device_transform; |
| 276 | 310 |
| 277 ClipNode root_clip; | 311 ClipNode root_clip; |
| 278 root_clip.data.clip = viewport; | 312 root_clip.data.clip = viewport; |
| 279 root_clip.data.transform_id = 0; | 313 root_clip.data.transform_id = 0; |
| 280 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); | 314 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); |
| 281 BuildPropertyTreesInternal(root_layer, data_for_recursion); | 315 BuildPropertyTreesInternal(root_layer, data_for_recursion); |
| 282 } | 316 } |
| 283 | 317 |
| 284 } // namespace cc | 318 } // namespace cc |
| OLD | NEW |