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 |