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> |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "cc/trees/transform_node.h" | 23 #include "cc/trees/transform_node.h" |
24 #include "ui/gfx/geometry/point_f.h" | 24 #include "ui/gfx/geometry/point_f.h" |
25 #include "ui/gfx/geometry/vector2d_conversions.h" | 25 #include "ui/gfx/geometry/vector2d_conversions.h" |
26 | 26 |
27 namespace cc { | 27 namespace cc { |
28 | 28 |
29 class LayerTreeHost; | 29 class LayerTreeHost; |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 static const int kInvalidPropertyTreeNodeId = -1; | |
34 static const int kRootPropertyTreeNodeId = 0; | |
35 static const int kViewportClipTreeNodeId = 1; | |
36 | |
37 template <typename LayerType> | 33 template <typename LayerType> |
38 struct DataForRecursion { | 34 struct DataForRecursion { |
39 PropertyTrees* property_trees; | 35 PropertyTrees* property_trees; |
40 LayerType* transform_tree_parent; | 36 LayerType* transform_tree_parent; |
41 LayerType* transform_fixed_parent; | 37 LayerType* transform_fixed_parent; |
42 int render_target; | 38 int render_target; |
43 int clip_tree_parent; | 39 int clip_tree_parent; |
44 int effect_tree_parent; | 40 int effect_tree_parent; |
45 int scroll_tree_parent; | 41 int scroll_tree_parent; |
46 const LayerType* page_scale_layer; | 42 const LayerType* page_scale_layer; |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 | 510 |
515 bool requires_node = is_root || is_scrollable || has_significant_transform || | 511 bool requires_node = is_root || is_scrollable || has_significant_transform || |
516 has_any_transform_animation || has_surface || is_fixed || | 512 has_any_transform_animation || has_surface || is_fixed || |
517 is_page_scale_layer || is_overscroll_elasticity_layer || | 513 is_page_scale_layer || is_overscroll_elasticity_layer || |
518 scroll_child_has_different_target || | 514 scroll_child_has_different_target || |
519 is_at_boundary_of_3d_rendering_context; | 515 is_at_boundary_of_3d_rendering_context; |
520 | 516 |
521 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); | 517 LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); |
522 DCHECK(is_root || transform_parent); | 518 DCHECK(is_root || transform_parent); |
523 | 519 |
524 int parent_index = kRootPropertyTreeNodeId; | 520 int parent_index = TransformTree::kDeviceNodeId; |
525 if (transform_parent) | 521 if (transform_parent) |
526 parent_index = transform_parent->transform_tree_index(); | 522 parent_index = transform_parent->transform_tree_index(); |
527 | 523 |
528 int source_index = parent_index; | 524 int source_index = parent_index; |
529 | 525 |
530 gfx::Vector2dF source_offset; | 526 gfx::Vector2dF source_offset; |
531 if (transform_parent) { | 527 if (transform_parent) { |
532 if (ScrollParent(layer)) { | 528 if (ScrollParent(layer)) { |
533 LayerType* source = Parent(layer); | 529 LayerType* source = Parent(layer); |
534 source_offset += source->offset_to_transform_parent(); | 530 source_offset += source->offset_to_transform_parent(); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 if (layer == data_from_ancestor.page_scale_layer) | 594 if (layer == data_from_ancestor.page_scale_layer) |
599 data_for_children->in_subtree_of_page_scale_layer = true; | 595 data_for_children->in_subtree_of_page_scale_layer = true; |
600 node->in_subtree_of_page_scale_layer = | 596 node->in_subtree_of_page_scale_layer = |
601 data_for_children->in_subtree_of_page_scale_layer; | 597 data_for_children->in_subtree_of_page_scale_layer; |
602 | 598 |
603 // Surfaces inherently flatten transforms. | 599 // Surfaces inherently flatten transforms. |
604 data_for_children->should_flatten = | 600 data_for_children->should_flatten = |
605 ShouldFlattenTransform(layer) || has_surface; | 601 ShouldFlattenTransform(layer) || has_surface; |
606 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); | 602 DCHECK_GT(data_from_ancestor.property_trees->effect_tree.size(), 0u); |
607 | 603 |
608 data_for_children->property_trees->transform_tree.SetTargetId( | 604 if (data_from_ancestor.render_target == EffectTree::kInvalidNodeId) { |
609 node->id, data_for_children->property_trees->effect_tree | 605 data_for_children->property_trees->transform_tree.SetTargetId( |
610 .Node(data_from_ancestor.render_target) | 606 node->id, TransformTree::kDeviceNodeId); |
611 ->transform_id); | 607 } else { |
| 608 data_for_children->property_trees->transform_tree.SetTargetId( |
| 609 node->id, data_for_children->property_trees->effect_tree |
| 610 .Node(data_from_ancestor.render_target) |
| 611 ->transform_id); |
| 612 } |
612 data_for_children->property_trees->transform_tree.SetContentTargetId( | 613 data_for_children->property_trees->transform_tree.SetContentTargetId( |
613 node->id, data_for_children->property_trees->effect_tree | 614 node->id, data_for_children->property_trees->effect_tree |
614 .Node(data_for_children->render_target) | 615 .Node(data_for_children->render_target) |
615 ->transform_id); | 616 ->transform_id); |
616 DCHECK_NE( | 617 DCHECK_NE( |
617 data_for_children->property_trees->transform_tree.TargetId(node->id), | 618 data_for_children->property_trees->transform_tree.TargetId(node->id), |
618 kInvalidPropertyTreeNodeId); | 619 TransformTree::kInvalidNodeId); |
619 | 620 |
620 node->has_potential_animation = has_potentially_animated_transform; | 621 node->has_potential_animation = has_potentially_animated_transform; |
621 node->is_currently_animating = TransformIsAnimating(layer); | 622 node->is_currently_animating = TransformIsAnimating(layer); |
622 if (has_potentially_animated_transform) { | 623 if (has_potentially_animated_transform) { |
623 node->has_only_translation_animations = | 624 node->has_only_translation_animations = |
624 HasOnlyTranslationTransforms(layer); | 625 HasOnlyTranslationTransforms(layer); |
625 } | 626 } |
626 | 627 |
627 float post_local_scale_factor = 1.0f; | 628 float post_local_scale_factor = 1.0f; |
628 if (is_root) | 629 if (is_root) |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 node.transform_id = | 990 node.transform_id = |
990 data_from_ancestor.property_trees->transform_tree.next_available_id(); | 991 data_from_ancestor.property_trees->transform_tree.next_available_id(); |
991 node.has_unclipped_descendants = (NumUnclippedDescendants(layer) != 0); | 992 node.has_unclipped_descendants = (NumUnclippedDescendants(layer) != 0); |
992 } | 993 } |
993 node.clip_id = data_from_ancestor.clip_tree_parent; | 994 node.clip_id = data_from_ancestor.clip_tree_parent; |
994 } else { | 995 } else { |
995 // Root render surface acts the unbounded and untransformed to draw content | 996 // Root render surface acts the unbounded and untransformed to draw content |
996 // into. Transform node created from root layer (includes device scale | 997 // into. Transform node created from root layer (includes device scale |
997 // factor) and clip node created from root layer (include viewports) applies | 998 // factor) and clip node created from root layer (include viewports) applies |
998 // to root render surface's content, but not root render surface itself. | 999 // to root render surface's content, but not root render surface itself. |
999 node.transform_id = kRootPropertyTreeNodeId; | 1000 node.transform_id = TransformTree::kDeviceNodeId; |
1000 node.clip_id = kViewportClipTreeNodeId; | 1001 node.clip_id = ClipTree::kRootNodeId; |
1001 } | 1002 } |
1002 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); | 1003 data_for_children->effect_tree_parent = effect_tree.Insert(node, parent_id); |
1003 int node_id = data_for_children->effect_tree_parent; | 1004 int node_id = data_for_children->effect_tree_parent; |
1004 layer->SetEffectTreeIndex(node_id); | 1005 layer->SetEffectTreeIndex(node_id); |
1005 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = | 1006 data_for_children->property_trees->effect_id_to_index_map[layer->id()] = |
1006 data_for_children->effect_tree_parent; | 1007 data_for_children->effect_tree_parent; |
1007 | 1008 |
1008 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; | 1009 std::vector<std::unique_ptr<CopyOutputRequest>> layer_copy_requests; |
1009 TakeCopyRequests(layer, &layer_copy_requests); | 1010 TakeCopyRequests(layer, &layer_copy_requests); |
1010 for (auto& it : layer_copy_requests) { | 1011 for (auto& it : layer_copy_requests) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 ScrollNode node; | 1054 ScrollNode node; |
1054 node.owner_id = layer->id(); | 1055 node.owner_id = layer->id(); |
1055 node.scrollable = scrollable; | 1056 node.scrollable = scrollable; |
1056 node.main_thread_scrolling_reasons = main_thread_scrolling_reasons; | 1057 node.main_thread_scrolling_reasons = main_thread_scrolling_reasons; |
1057 node.contains_non_fast_scrollable_region = | 1058 node.contains_non_fast_scrollable_region = |
1058 contains_non_fast_scrollable_region; | 1059 contains_non_fast_scrollable_region; |
1059 gfx::Size clip_bounds; | 1060 gfx::Size clip_bounds; |
1060 if (layer->scroll_clip_layer()) { | 1061 if (layer->scroll_clip_layer()) { |
1061 clip_bounds = layer->scroll_clip_layer()->bounds(); | 1062 clip_bounds = layer->scroll_clip_layer()->bounds(); |
1062 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != | 1063 DCHECK(layer->scroll_clip_layer()->transform_tree_index() != |
1063 kInvalidPropertyTreeNodeId); | 1064 TransformTree::kInvalidNodeId); |
1064 node.max_scroll_offset_affected_by_page_scale = | 1065 node.max_scroll_offset_affected_by_page_scale = |
1065 !data_from_ancestor.property_trees->transform_tree | 1066 !data_from_ancestor.property_trees->transform_tree |
1066 .Node(layer->scroll_clip_layer()->transform_tree_index()) | 1067 .Node(layer->scroll_clip_layer()->transform_tree_index()) |
1067 ->in_subtree_of_page_scale_layer && | 1068 ->in_subtree_of_page_scale_layer && |
1068 data_from_ancestor.in_subtree_of_page_scale_layer; | 1069 data_from_ancestor.in_subtree_of_page_scale_layer; |
1069 } | 1070 } |
1070 | 1071 |
1071 node.scroll_clip_layer_bounds = clip_bounds; | 1072 node.scroll_clip_layer_bounds = clip_bounds; |
1072 node.is_inner_viewport_scroll_layer = | 1073 node.is_inner_viewport_scroll_layer = |
1073 layer == data_from_ancestor.inner_viewport_scroll_layer; | 1074 layer == data_from_ancestor.inner_viewport_scroll_layer; |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1304 root_layer->position()); | 1305 root_layer->position()); |
1305 return; | 1306 return; |
1306 } | 1307 } |
1307 | 1308 |
1308 property_trees->sequence_number++; | 1309 property_trees->sequence_number++; |
1309 | 1310 |
1310 DataForRecursion<LayerType> data_for_recursion; | 1311 DataForRecursion<LayerType> data_for_recursion; |
1311 data_for_recursion.property_trees = property_trees; | 1312 data_for_recursion.property_trees = property_trees; |
1312 data_for_recursion.transform_tree_parent = nullptr; | 1313 data_for_recursion.transform_tree_parent = nullptr; |
1313 data_for_recursion.transform_fixed_parent = nullptr; | 1314 data_for_recursion.transform_fixed_parent = nullptr; |
1314 data_for_recursion.render_target = kRootPropertyTreeNodeId; | 1315 data_for_recursion.render_target = EffectTree::kInvalidNodeId; |
1315 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; | 1316 data_for_recursion.clip_tree_parent = ClipTree::kInvalidNodeId; |
1316 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; | 1317 data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId; |
1317 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; | 1318 data_for_recursion.scroll_tree_parent = ScrollTree::kInvalidNodeId; |
1318 data_for_recursion.page_scale_layer = page_scale_layer; | 1319 data_for_recursion.page_scale_layer = page_scale_layer; |
1319 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; | 1320 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
1320 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; | 1321 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
1321 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; | 1322 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; |
1322 data_for_recursion.elastic_overscroll = elastic_overscroll; | 1323 data_for_recursion.elastic_overscroll = elastic_overscroll; |
1323 data_for_recursion.page_scale_factor = page_scale_factor; | 1324 data_for_recursion.page_scale_factor = page_scale_factor; |
1324 data_for_recursion.in_subtree_of_page_scale_layer = false; | 1325 data_for_recursion.in_subtree_of_page_scale_layer = false; |
1325 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; | 1326 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; |
1326 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; | 1327 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; |
1327 data_for_recursion.should_flatten = false; | 1328 data_for_recursion.should_flatten = false; |
(...skipping 18 matching lines...) Expand all Loading... |
1346 data_for_recursion.property_trees->effect_id_to_index_map.clear(); | 1347 data_for_recursion.property_trees->effect_id_to_index_map.clear(); |
1347 data_for_recursion.property_trees->clip_id_to_index_map.clear(); | 1348 data_for_recursion.property_trees->clip_id_to_index_map.clear(); |
1348 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); | 1349 data_for_recursion.property_trees->scroll_id_to_index_map.clear(); |
1349 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids | 1350 data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids |
1350 .clear(); | 1351 .clear(); |
1351 | 1352 |
1352 ClipNode root_clip; | 1353 ClipNode root_clip; |
1353 root_clip.resets_clip = true; | 1354 root_clip.resets_clip = true; |
1354 root_clip.applies_local_clip = true; | 1355 root_clip.applies_local_clip = true; |
1355 root_clip.clip = gfx::RectF(viewport); | 1356 root_clip.clip = gfx::RectF(viewport); |
1356 root_clip.transform_id = kRootPropertyTreeNodeId; | 1357 root_clip.transform_id = TransformTree::kDeviceNodeId; |
1357 data_for_recursion.clip_tree_parent = | 1358 data_for_recursion.clip_tree_parent = |
1358 data_for_recursion.property_trees->clip_tree.Insert( | 1359 data_for_recursion.property_trees->clip_tree.Insert( |
1359 root_clip, kRootPropertyTreeNodeId); | 1360 root_clip, ClipTree::kInvalidNodeId); |
1360 | 1361 |
1361 DataForRecursionFromChild<LayerType> data_from_child; | 1362 DataForRecursionFromChild<LayerType> data_from_child; |
1362 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 1363 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
1363 property_trees->needs_rebuild = false; | 1364 property_trees->needs_rebuild = false; |
1364 | 1365 |
1365 // The transform tree is kept up to date as it is built, but the | 1366 // The transform tree is kept up to date as it is built, but the |
1366 // combined_clips stored in the clip tree and the screen_space_opacity and | 1367 // combined_clips stored in the clip tree and the screen_space_opacity and |
1367 // is_drawn in the effect tree aren't computed during tree building. | 1368 // is_drawn in the effect tree aren't computed during tree building. |
1368 property_trees->transform_tree.set_needs_update(false); | 1369 property_trees->transform_tree.set_needs_update(false); |
1369 property_trees->clip_tree.set_needs_update(true); | 1370 property_trees->clip_tree.set_needs_update(true); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1439 color = SkColorSetA(color, 255); | 1440 color = SkColorSetA(color, 255); |
1440 BuildPropertyTreesTopLevelInternal( | 1441 BuildPropertyTreesTopLevelInternal( |
1441 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 1442 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
1442 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 1443 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
1443 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 1444 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
1444 device_transform, property_trees, color); | 1445 device_transform, property_trees, color); |
1445 property_trees->ResetCachedData(); | 1446 property_trees->ResetCachedData(); |
1446 } | 1447 } |
1447 | 1448 |
1448 } // namespace cc | 1449 } // namespace cc |
OLD | NEW |