| 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 |