| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "cc/base/math_util.h" | 12 #include "cc/base/math_util.h" |
| 13 #include "cc/layers/layer.h" | 13 #include "cc/layers/layer.h" |
| 14 #include "cc/layers/layer_impl.h" | 14 #include "cc/layers/layer_impl.h" |
| 15 #include "cc/output/copy_output_request.h" | 15 #include "cc/output/copy_output_request.h" |
| 16 #include "cc/trees/draw_property_utils.h" | 16 #include "cc/trees/draw_property_utils.h" |
| 17 #include "cc/trees/layer_tree_host.h" | 17 #include "cc/trees/layer_tree_host.h" |
| 18 #include "cc/trees/layer_tree_impl.h" | 18 #include "cc/trees/layer_tree_impl.h" |
| 19 #include "ui/gfx/geometry/point_f.h" | 19 #include "ui/gfx/geometry/point_f.h" |
| 20 #include "ui/gfx/geometry/vector2d_conversions.h" | 20 #include "ui/gfx/geometry/vector2d_conversions.h" |
| 21 | 21 |
| 22 namespace cc { | 22 namespace cc { |
| 23 | 23 |
| 24 class LayerTreeHost; | 24 class LayerTreeHost; |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 static const int kInvalidPropertyTreeNodeId = -1; | |
| 29 static const int kRootPropertyTreeNodeId = 0; | |
| 30 static const int kViewportClipTreeNodeId = 1; | |
| 31 | |
| 32 template <typename LayerType> | 28 template <typename LayerType> |
| 33 struct DataForRecursion { | 29 struct DataForRecursion { |
| 34 PropertyTrees* property_trees; | 30 PropertyTrees* property_trees; |
| 35 LayerType* transform_tree_parent; | 31 LayerType* transform_tree_parent; |
| 36 LayerType* transform_fixed_parent; | 32 LayerType* transform_fixed_parent; |
| 37 int render_target; | 33 int render_target; |
| 38 int clip_tree_parent; | 34 int clip_tree_parent; |
| 39 int effect_tree_parent; | 35 int effect_tree_parent; |
| 40 int scroll_tree_parent; | 36 int scroll_tree_parent; |
| 41 const LayerType* page_scale_layer; | 37 const LayerType* page_scale_layer; |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 | 440 |
| 445 bool requires_node = is_root || is_scrollable || has_significant_transform || | 441 bool requires_node = is_root || is_scrollable || has_significant_transform || |
| 446 has_any_transform_animation || has_surface || is_fixed || | 442 has_any_transform_animation || has_surface || is_fixed || |
| 447 is_page_scale_layer || is_overscroll_elasticity_layer || | 443 is_page_scale_layer || is_overscroll_elasticity_layer || |
| 448 scroll_child_has_different_target || | 444 scroll_child_has_different_target || |
| 449 is_at_boundary_of_3d_rendering_context; | 445 is_at_boundary_of_3d_rendering_context; |
| 450 | 446 |
| 451 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); | 447 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); |
| 452 DCHECK(is_root || transform_parent); | 448 DCHECK(is_root || transform_parent); |
| 453 | 449 |
| 454 int parent_index = kRootPropertyTreeNodeId; | 450 int parent_index = TransformTree::kDeviceNodeId; |
| 455 if (transform_parent) | 451 if (transform_parent) |
| 456 parent_index = transform_parent->transform_tree_index(); | 452 parent_index = transform_parent->transform_tree_index(); |
| 457 | 453 |
| 458 int source_index = parent_index; | 454 int source_index = parent_index; |
| 459 | 455 |
| 460 gfx::Vector2dF source_offset; | 456 gfx::Vector2dF source_offset; |
| 461 if (transform_parent) { | 457 if (transform_parent) { |
| 462 if (ScrollParent(layer)) { | 458 if (ScrollParent(layer)) { |
| 463 LayerType* source = layer->parent(); | 459 LayerType* source = layer->parent(); |
| 464 source_offset += source->offset_to_transform_parent(); | 460 source_offset += source->offset_to_transform_parent(); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 if (layer == data_from_ancestor.page_scale_layer) | 524 if (layer == data_from_ancestor.page_scale_layer) |
| 529 data_for_children->in_subtree_of_page_scale_layer = true; | 525 data_for_children->in_subtree_of_page_scale_layer = true; |
| 530 node->data.in_subtree_of_page_scale_layer = | 526 node->data.in_subtree_of_page_scale_layer = |
| 531 data_for_children->in_subtree_of_page_scale_layer; | 527 data_for_children->in_subtree_of_page_scale_layer; |
| 532 | 528 |
| 533 // Surfaces inherently flatten transforms. | 529 // Surfaces inherently flatten transforms. |
| 534 data_for_children->should_flatten = | 530 data_for_children->should_flatten = |
| 535 ShouldFlattenTransform(layer) || has_surface; | 531 ShouldFlattenTransform(layer) || has_surface; |
| 536 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); | 532 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); |
| 537 | 533 |
| 538 data_for_children->property_trees->transform_tree.SetTargetId( | 534 if (data_from_ancestor.render_target == EffectTree::kInvalidNodeId) { |
| 539 node->id, data_for_children->property_trees->effect_tree | 535 data_for_children->property_trees->transform_tree.SetTargetId( |
| 540 .Node(data_from_ancestor.render_target) | 536 node->id, TransformTree::kDeviceNodeId); |
| 541 ->data.transform_id); | 537 } else { |
| 538 data_for_children->property_trees->transform_tree.SetTargetId( |
| 539 node->id, data_for_children->property_trees->effect_tree |
| 540 .Node(data_from_ancestor.render_target) |
| 541 ->data.transform_id); |
| 542 } |
| 542 data_for_children->property_trees->transform_tree.SetContentTargetId( | 543 data_for_children->property_trees->transform_tree.SetContentTargetId( |
| 543 node->id, data_for_children->property_trees->effect_tree | 544 node->id, data_for_children->property_trees->effect_tree |
| 544 .Node(data_for_children->render_target) | 545 .Node(data_for_children->render_target) |
| 545 ->data.transform_id); | 546 ->data.transform_id); |
| 546 DCHECK_NE( | 547 DCHECK_NE( |
| 547 data_for_children->property_trees->transform_tree.TargetId(node->id), | 548 data_for_children->property_trees->transform_tree.TargetId(node->id), |
| 548 kInvalidPropertyTreeNodeId); | 549 TransformTree::kInvalidNodeId); |
| 549 | 550 |
| 550 node->data.has_potential_animation = has_potentially_animated_transform; | 551 node->data.has_potential_animation = has_potentially_animated_transform; |
| 551 node->data.is_currently_animating = layer->TransformIsAnimating(); | 552 node->data.is_currently_animating = layer->TransformIsAnimating(); |
| 552 if (has_potentially_animated_transform) { | 553 if (has_potentially_animated_transform) { |
| 553 float maximum_animation_target_scale = 0.f; | 554 float maximum_animation_target_scale = 0.f; |
| 554 if (layer->MaximumTargetScale(&maximum_animation_target_scale)) { | 555 if (layer->MaximumTargetScale(&maximum_animation_target_scale)) { |
| 555 node->data.local_maximum_animation_target_scale = | 556 node->data.local_maximum_animation_target_scale = |
| 556 maximum_animation_target_scale; | 557 maximum_animation_target_scale; |
| 557 } | 558 } |
| 558 | 559 |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 data_from_ancestor.property_trees->transform_tree.next_available_id(); | 925 data_from_ancestor.property_trees->transform_tree.next_available_id(); |
| 925 node.data.has_unclipped_descendants = | 926 node.data.has_unclipped_descendants = |
| 926 (NumUnclippedDescendants(layer) != 0); | 927 (NumUnclippedDescendants(layer) != 0); |
| 927 } | 928 } |
| 928 node.data.clip_id = data_from_ancestor.clip_tree_parent; | 929 node.data.clip_id = data_from_ancestor.clip_tree_parent; |
| 929 } else { | 930 } else { |
| 930 // Root render surface acts the unbounded and untransformed to draw content | 931 // Root render surface acts the unbounded and untransformed to draw content |
| 931 // into. Transform node created from root layer (includes device scale | 932 // into. Transform node created from root layer (includes device scale |
| 932 // factor) and clip node created from root layer (include viewports) applies | 933 // factor) and clip node created from root layer (include viewports) applies |
| 933 // to root render surface's content, but not root render surface itself. | 934 // to root render surface's content, but not root render surface itself. |
| 934 node.data.transform_id = kRootPropertyTreeNodeId; | 935 node.data.transform_id = TransformTree::kDeviceNodeId; |
| 935 node.data.clip_id = kViewportClipTreeNodeId; | 936 node.data.clip_id = ClipTree::kRootNodeId; |
| 936 } | 937 } |
| 937 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); | 938 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); |
| 938 int node_id = data_for_children->effect_tree_parent; | 939 int node_id = data_for_children->effect_tree_parent; |
| 939 layer->SetEffectTreeIndex(node_id); | 940 layer->SetEffectTreeIndex(node_id); |
| 940 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = | 941 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = |
| 941 data_for_children->effect_tree_parent; | 942 data_for_children->effect_tree_parent; |
| 942 | 943 |
| 943 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; | 944 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; |
| 944 TakeCopyRequests(layer, &layer_copy_requests); | 945 TakeCopyRequests(layer, &layer_copy_requests); |
| 945 for (auto& it : layer_copy_requests) { | 946 for (auto& it : layer_copy_requests) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 ScrollNode node; | 989 ScrollNode node; |
| 989 node.owner_id = layer->id(); | 990 node.owner_id = layer->id(); |
| 990 node.data.scrollable = scrollable; | 991 node.data.scrollable = scrollable; |
| 991 node.data.main_thread_scrolling_reasons = main_thread_scrolling_reasons; | 992 node.data.main_thread_scrolling_reasons = main_thread_scrolling_reasons; |
| 992 node.data.contains_non_fast_scrollable_region = | 993 node.data.contains_non_fast_scrollable_region = |
| 993 contains_non_fast_scrollable_region; | 994 contains_non_fast_scrollable_region; |
| 994 gfx::Size clip_bounds; | 995 gfx::Size clip_bounds; |
| 995 if (layer->scroll_clip_layer()) { | 996 if (layer->scroll_clip_layer()) { |
| 996 clip_bounds = layer->scroll_clip_layer()->bounds(); | 997 clip_bounds = layer->scroll_clip_layer()->bounds(); |
| 997 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != | 998 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != |
| 998 kInvalidPropertyTreeNodeId); | 999 TransformTree::kInvalidNodeId); |
| 999 node.data.max_scroll_offset_affected_by_page_scale = | 1000 node.data.max_scroll_offset_affected_by_page_scale = |
| 1000 !data_from_ancestor.property_trees->transform_tree | 1001 !data_from_ancestor.property_trees->transform_tree |
| 1001 .Node(layer->scroll_clip_layer()->transform_tree_index()) | 1002 .Node(layer->scroll_clip_layer()->transform_tree_index()) |
| 1002 ->data.in_subtree_of_page_scale_layer && | 1003 ->data.in_subtree_of_page_scale_layer && |
| 1003 data_from_ancestor.in_subtree_of_page_scale_layer; | 1004 data_from_ancestor.in_subtree_of_page_scale_layer; |
| 1004 } | 1005 } |
| 1005 | 1006 |
| 1006 node.data.scroll_clip_layer_bounds = clip_bounds; | 1007 node.data.scroll_clip_layer_bounds = clip_bounds; |
| 1007 node.data.is_inner_viewport_scroll_layer = | 1008 node.data.is_inner_viewport_scroll_layer = |
| 1008 layer == data_from_ancestor.inner_viewport_scroll_layer; | 1009 layer == data_from_ancestor.inner_viewport_scroll_layer; |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 root_layer->position()); | 1241 root_layer->position()); |
| 1241 return; | 1242 return; |
| 1242 } | 1243 } |
| 1243 | 1244 |
| 1244 property_trees->sequence_number++; | 1245 property_trees->sequence_number++; |
| 1245 | 1246 |
| 1246 DataForRecursion<LayerType> data_for_recursion; | 1247 DataForRecursion<LayerType> data_for_recursion; |
| 1247 data_for_recursion.property_trees = property_trees; | 1248 data_for_recursion.property_trees = property_trees; |
| 1248 data_for_recursion.transform_tree_parent = nullptr; | 1249 data_for_recursion.transform_tree_parent = nullptr; |
| 1249 data_for_recursion.transform_fixed_parent = nullptr; | 1250 data_for_recursion.transform_fixed_parent = nullptr; |
| 1250 data_for_recursion.render_target = kRootPropertyTreeNodeId; | 1251 data_for_recursion.render_target = EffectTree::kInvalidNodeId; |
| 1251 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; | 1252 data_for_recursion.clip_tree_parent = ClipTree::kInvalidNodeId; |
| 1252 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; | 1253 data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId; |
| 1253 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; | 1254 data_for_recursion.scroll_tree_parent = ScrollTree::kInvalidNodeId; |
| 1254 data_for_recursion.page_scale_layer = page_scale_layer; | 1255 data_for_recursion.page_scale_layer = page_scale_layer; |
| 1255 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; | 1256 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
| 1256 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; | 1257 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
| 1257 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; | 1258 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; |
| 1258 data_for_recursion.elastic_overscroll = elastic_overscroll; | 1259 data_for_recursion.elastic_overscroll = elastic_overscroll; |
| 1259 data_for_recursion.page_scale_factor = page_scale_factor; | 1260 data_for_recursion.page_scale_factor = page_scale_factor; |
| 1260 data_for_recursion.in_subtree_of_page_scale_layer = false; | 1261 data_for_recursion.in_subtree_of_page_scale_layer = false; |
| 1261 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; | 1262 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; |
| 1262 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; | 1263 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; |
| 1263 data_for_recursion.should_flatten = false; | 1264 data_for_recursion.should_flatten = false; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1282 data_for_recursion.property_trees->effect_id_to_index_map.clear(); | 1283 data_for_recursion.property_trees->effect_id_to_index_map.clear(); |
| 1283 data_for_recursion.property_trees->clip_id_to_index_map.clear(); | 1284 data_for_recursion.property_trees->clip_id_to_index_map.clear(); |
| 1284 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); | 1285 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); |
| 1285 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids | 1286 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids |
| 1286 .clear(); | 1287 .clear(); |
| 1287 | 1288 |
| 1288 ClipNode root_clip; | 1289 ClipNode root_clip; |
| 1289 root_clip.data.resets_clip = true; | 1290 root_clip.data.resets_clip = true; |
| 1290 root_clip.data.applies_local_clip = true; | 1291 root_clip.data.applies_local_clip = true; |
| 1291 root_clip.data.clip = gfx::RectF(viewport); | 1292 root_clip.data.clip = gfx::RectF(viewport); |
| 1292 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 1293 root_clip.data.transform_id = TransformTree::kDeviceNodeId; |
| 1293 data_for_recursion.clip_tree_parent = | 1294 data_for_recursion.clip_tree_parent = |
| 1294 data_for_recursion.property_trees->clip_tree.Insert( | 1295 data_for_recursion.property_trees->clip_tree.Insert( |
| 1295 root_clip, kRootPropertyTreeNodeId); | 1296 root_clip, ClipTree::kInvalidNodeId); |
| 1296 | 1297 |
| 1297 DataForRecursionFromChild<LayerType> data_from_child; | 1298 DataForRecursionFromChild<LayerType> data_from_child; |
| 1298 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 1299 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
| 1299 property_trees->needs_rebuild = false; | 1300 property_trees->needs_rebuild = false; |
| 1300 | 1301 |
| 1301 // The transform tree is kept up-to-date as it is built, but the | 1302 // The transform tree is kept up-to-date as it is built, but the |
| 1302 // combined_clips stored in the clip tree and the screen_space_opacity and | 1303 // combined_clips stored in the clip tree and the screen_space_opacity and |
| 1303 // is_drawn in the effect tree aren't computed during tree building. | 1304 // is_drawn in the effect tree aren't computed during tree building. |
| 1304 property_trees->transform_tree.set_needs_update(false); | 1305 property_trees->transform_tree.set_needs_update(false); |
| 1305 property_trees->clip_tree.set_needs_update(true); | 1306 property_trees->clip_tree.set_needs_update(true); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 if (SkColorGetA(color) != 255) | 1375 if (SkColorGetA(color) != 255) |
| 1375 color = SkColorSetA(color, 255); | 1376 color = SkColorSetA(color, 255); |
| 1376 BuildPropertyTreesTopLevelInternal( | 1377 BuildPropertyTreesTopLevelInternal( |
| 1377 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 1378 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
| 1378 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 1379 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
| 1379 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 1380 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
| 1380 device_transform, property_trees, color); | 1381 device_transform, property_trees, color); |
| 1381 } | 1382 } |
| 1382 | 1383 |
| 1383 } // namespace cc | 1384 } // namespace cc |
| OLD | NEW |