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 13 matching lines...) Expand all Loading... | |
24 namespace { | 24 namespace { |
25 | 25 |
26 static const int kInvalidPropertyTreeNodeId = -1; | 26 static const int kInvalidPropertyTreeNodeId = -1; |
27 static const int kRootPropertyTreeNodeId = 0; | 27 static const int kRootPropertyTreeNodeId = 0; |
28 | 28 |
29 template <typename LayerType> | 29 template <typename LayerType> |
30 struct DataForRecursion { | 30 struct DataForRecursion { |
31 TransformTree* transform_tree; | 31 TransformTree* transform_tree; |
32 ClipTree* clip_tree; | 32 ClipTree* clip_tree; |
33 EffectTree* effect_tree; | 33 EffectTree* effect_tree; |
34 ScrollTree* scroll_tree; | |
34 LayerType* transform_tree_parent; | 35 LayerType* transform_tree_parent; |
35 LayerType* transform_fixed_parent; | 36 LayerType* transform_fixed_parent; |
36 int render_target; | 37 int render_target; |
37 int clip_tree_parent; | 38 int clip_tree_parent; |
38 int effect_tree_parent; | 39 int effect_tree_parent; |
40 int scroll_tree_parent; | |
39 const LayerType* page_scale_layer; | 41 const LayerType* page_scale_layer; |
40 const LayerType* inner_viewport_scroll_layer; | 42 const LayerType* inner_viewport_scroll_layer; |
41 const LayerType* outer_viewport_scroll_layer; | 43 const LayerType* outer_viewport_scroll_layer; |
42 const LayerType* overscroll_elasticity_layer; | 44 const LayerType* overscroll_elasticity_layer; |
43 gfx::Vector2dF elastic_overscroll; | 45 gfx::Vector2dF elastic_overscroll; |
44 float page_scale_factor; | 46 float page_scale_factor; |
45 bool in_subtree_of_page_scale_layer; | 47 bool in_subtree_of_page_scale_layer; |
46 bool affected_by_inner_viewport_bounds_delta; | 48 bool affected_by_inner_viewport_bounds_delta; |
47 bool affected_by_outer_viewport_bounds_delta; | 49 bool affected_by_outer_viewport_bounds_delta; |
48 bool should_flatten; | 50 bool should_flatten; |
49 bool target_is_clipped; | 51 bool target_is_clipped; |
50 bool is_hidden; | 52 bool is_hidden; |
53 bool scroll_other_criteria; | |
54 ScrollBlocksOn accumulated_scroll_blocks_on; | |
51 const gfx::Transform* device_transform; | 55 const gfx::Transform* device_transform; |
52 gfx::Vector2dF scroll_compensation_adjustment; | 56 gfx::Vector2dF scroll_compensation_adjustment; |
53 gfx::Transform compound_transform_since_render_target; | 57 gfx::Transform compound_transform_since_render_target; |
54 bool axis_align_since_render_target; | 58 bool axis_align_since_render_target; |
55 int sequence_number; | 59 int sequence_number; |
56 }; | 60 }; |
57 | 61 |
58 template <typename LayerType> | 62 template <typename LayerType> |
59 struct DataForRecursionFromChild { | 63 struct DataForRecursionFromChild { |
60 int num_copy_requests_in_subtree; | 64 int num_copy_requests_in_subtree; |
(...skipping 21 matching lines...) Expand all Loading... | |
82 : layer->clip_parent()->clip_tree_index(); | 86 : layer->clip_parent()->clip_tree_index(); |
83 return data.clip_tree->Node(id); | 87 return data.clip_tree->Node(id); |
84 } | 88 } |
85 | 89 |
86 template <typename LayerType> | 90 template <typename LayerType> |
87 static bool LayerClipsSubtree(LayerType* layer) { | 91 static bool LayerClipsSubtree(LayerType* layer) { |
88 return layer->masks_to_bounds() || layer->mask_layer(); | 92 return layer->masks_to_bounds() || layer->mask_layer(); |
89 } | 93 } |
90 | 94 |
91 template <typename LayerType> | 95 template <typename LayerType> |
96 static int GetScrollParentId(const DataForRecursion<LayerType>& data, | |
97 LayerType* layer) { | |
98 const bool inherits_scroll = !layer->parent() || !layer->scroll_parent(); | |
jaydasika
2016/01/22 22:28:28
Why do we need !layer->parent() here ? (The only c
sunxd
2016/01/25 15:37:21
I made this identical to GetClipParentId, is it th
| |
99 const int id = inherits_scroll ? data.scroll_tree_parent | |
100 : layer->scroll_parent()->scroll_tree_index(); | |
101 return id; | |
102 } | |
103 | |
104 template <typename LayerType> | |
92 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, | 105 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, |
93 LayerType* layer, | 106 LayerType* layer, |
94 bool created_render_surface, | 107 bool created_render_surface, |
95 bool created_transform_node, | 108 bool created_transform_node, |
96 DataForRecursion<LayerType>* data_for_children) { | 109 DataForRecursion<LayerType>* data_for_children) { |
97 ClipNode* parent = GetClipParent(data_from_ancestor, layer); | 110 ClipNode* parent = GetClipParent(data_from_ancestor, layer); |
98 int parent_id = parent->id; | 111 int parent_id = parent->id; |
99 | 112 |
100 bool is_root = !layer->parent(); | 113 bool is_root = !layer->parent(); |
101 | 114 |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
613 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); | 626 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); |
614 if (should_create_render_surface) { | 627 if (should_create_render_surface) { |
615 data_for_children->compound_transform_since_render_target = | 628 data_for_children->compound_transform_since_render_target = |
616 gfx::Transform(); | 629 gfx::Transform(); |
617 data_for_children->axis_align_since_render_target = true; | 630 data_for_children->axis_align_since_render_target = true; |
618 } | 631 } |
619 return should_create_render_surface; | 632 return should_create_render_surface; |
620 } | 633 } |
621 | 634 |
622 template <typename LayerType> | 635 template <typename LayerType> |
636 void AddScrollNodeIfNeeded( | |
637 const DataForRecursion<LayerType>& data_from_ancestor, | |
638 LayerType* layer, | |
639 DataForRecursion<LayerType>* data_for_children) { | |
640 int parent_id = GetScrollParentId(data_from_ancestor, layer); | |
641 | |
642 bool is_root = !layer->parent(); | |
643 bool scrollable = layer->scrollable(); | |
644 ScrollBlocksOn scroll_blocks_on = layer->scroll_blocks_on(); | |
645 ScrollBlocksOn accumulated_scroll_blocks_on = | |
646 data_from_ancestor.accumulated_scroll_blocks_on; | |
647 bool contains_non_fast_scrollable_region = | |
648 !layer->non_fast_scrollable_region().IsEmpty(); | |
649 bool should_scroll_on_main_thread = layer->should_scroll_on_main_thread(); | |
650 | |
651 bool other_criteria = is_root || scrollable || | |
652 (scroll_blocks_on | accumulated_scroll_blocks_on) != | |
653 accumulated_scroll_blocks_on || | |
654 contains_non_fast_scrollable_region; | |
655 bool requires_node = | |
656 other_criteria || (should_scroll_on_main_thread && | |
657 data_from_ancestor.scroll_other_criteria); | |
ajuma
2016/01/25 15:19:54
What's the intuition behind passing scroll_other_c
sunxd
2016/01/25 15:37:21
The idea is that we do not create scroll nodes for
ajuma
2016/01/25 16:21:59
Thanks, those names sound clearer. Please also add
| |
658 | |
659 if (!requires_node) { | |
660 data_for_children->scroll_tree_parent = parent_id; | |
661 } else { | |
662 ScrollNode node; | |
663 node.owner_id = layer->id(); | |
664 node.data.scrollable = scrollable; | |
665 node.data.should_scroll_on_main_thread = should_scroll_on_main_thread; | |
666 node.data.scroll_blocks_on = | |
667 scroll_blocks_on | accumulated_scroll_blocks_on; | |
668 node.data.contains_non_fast_scrollable_region = | |
669 contains_non_fast_scrollable_region; | |
670 node.data.transform_id = | |
671 data_for_children->transform_tree_parent->transform_tree_index(); | |
672 data_for_children->scroll_tree_parent = | |
673 data_for_children->scroll_tree->Insert(node, parent_id); | |
674 data_for_children->scroll_other_criteria = other_criteria; | |
675 data_for_children->accumulated_scroll_blocks_on = | |
676 node.data.scroll_blocks_on; | |
677 } | |
678 | |
679 layer->SetScrollTreeIndex(data_for_children->scroll_tree_parent); | |
680 } | |
681 | |
682 template <typename LayerType> | |
623 void BuildPropertyTreesInternal( | 683 void BuildPropertyTreesInternal( |
624 LayerType* layer, | 684 LayerType* layer, |
625 const DataForRecursion<LayerType>& data_from_parent, | 685 const DataForRecursion<LayerType>& data_from_parent, |
626 DataForRecursionFromChild<LayerType>* data_to_parent) { | 686 DataForRecursionFromChild<LayerType>* data_to_parent) { |
627 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); | 687 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); |
628 if (layer->mask_layer()) | 688 if (layer->mask_layer()) |
629 layer->mask_layer()->set_property_tree_sequence_number( | 689 layer->mask_layer()->set_property_tree_sequence_number( |
630 data_from_parent.sequence_number); | 690 data_from_parent.sequence_number); |
631 | 691 |
632 DataForRecursion<LayerType> data_for_children(data_from_parent); | 692 DataForRecursion<LayerType> data_for_children(data_from_parent); |
633 | 693 |
634 bool created_render_surface = | 694 bool created_render_surface = |
635 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); | 695 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); |
636 | 696 |
637 if (created_render_surface) { | 697 if (created_render_surface) { |
638 data_for_children.render_target = data_for_children.effect_tree_parent; | 698 data_for_children.render_target = data_for_children.effect_tree_parent; |
639 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 699 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
640 } else { | 700 } else { |
641 layer->set_draw_blend_mode(layer->blend_mode()); | 701 layer->set_draw_blend_mode(layer->blend_mode()); |
642 } | 702 } |
643 | 703 |
644 bool created_transform_node = AddTransformNodeIfNeeded( | 704 bool created_transform_node = AddTransformNodeIfNeeded( |
645 data_from_parent, layer, created_render_surface, &data_for_children); | 705 data_from_parent, layer, created_render_surface, &data_for_children); |
646 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 706 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
647 created_transform_node, &data_for_children); | 707 created_transform_node, &data_for_children); |
648 | 708 |
709 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children); | |
710 | |
649 data_for_children.is_hidden = | 711 data_for_children.is_hidden = |
650 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; | 712 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; |
651 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); | 713 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); |
652 | 714 |
653 for (size_t i = 0; i < layer->children().size(); ++i) { | 715 for (size_t i = 0; i < layer->children().size(); ++i) { |
654 if (!layer->child_at(i)->scroll_parent()) { | 716 if (!layer->child_at(i)->scroll_parent()) { |
655 DataForRecursionFromChild<LayerType> data_from_child; | 717 DataForRecursionFromChild<LayerType> data_from_child; |
656 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 718 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
657 &data_from_child); | 719 &data_from_child); |
658 data_to_parent->Merge(data_from_child); | 720 data_to_parent->Merge(data_from_child); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
720 root_layer->position()); | 782 root_layer->position()); |
721 return; | 783 return; |
722 } | 784 } |
723 | 785 |
724 property_trees->sequence_number++; | 786 property_trees->sequence_number++; |
725 | 787 |
726 DataForRecursion<LayerType> data_for_recursion; | 788 DataForRecursion<LayerType> data_for_recursion; |
727 data_for_recursion.transform_tree = &property_trees->transform_tree; | 789 data_for_recursion.transform_tree = &property_trees->transform_tree; |
728 data_for_recursion.clip_tree = &property_trees->clip_tree; | 790 data_for_recursion.clip_tree = &property_trees->clip_tree; |
729 data_for_recursion.effect_tree = &property_trees->effect_tree; | 791 data_for_recursion.effect_tree = &property_trees->effect_tree; |
792 data_for_recursion.scroll_tree = &property_trees->scroll_tree; | |
730 data_for_recursion.transform_tree_parent = nullptr; | 793 data_for_recursion.transform_tree_parent = nullptr; |
731 data_for_recursion.transform_fixed_parent = nullptr; | 794 data_for_recursion.transform_fixed_parent = nullptr; |
732 data_for_recursion.render_target = kRootPropertyTreeNodeId; | 795 data_for_recursion.render_target = kRootPropertyTreeNodeId; |
733 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; | 796 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; |
734 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; | 797 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; |
798 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; | |
735 data_for_recursion.page_scale_layer = page_scale_layer; | 799 data_for_recursion.page_scale_layer = page_scale_layer; |
736 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; | 800 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
737 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; | 801 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
738 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; | 802 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; |
739 data_for_recursion.elastic_overscroll = elastic_overscroll; | 803 data_for_recursion.elastic_overscroll = elastic_overscroll; |
740 data_for_recursion.page_scale_factor = page_scale_factor; | 804 data_for_recursion.page_scale_factor = page_scale_factor; |
741 data_for_recursion.in_subtree_of_page_scale_layer = false; | 805 data_for_recursion.in_subtree_of_page_scale_layer = false; |
742 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; | 806 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; |
743 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; | 807 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; |
744 data_for_recursion.should_flatten = false; | 808 data_for_recursion.should_flatten = false; |
745 data_for_recursion.target_is_clipped = false; | 809 data_for_recursion.target_is_clipped = false; |
746 data_for_recursion.is_hidden = false; | 810 data_for_recursion.is_hidden = false; |
811 data_for_recursion.scroll_other_criteria = true; | |
812 data_for_recursion.accumulated_scroll_blocks_on = SCROLL_BLOCKS_ON_NONE; | |
747 data_for_recursion.device_transform = &device_transform; | 813 data_for_recursion.device_transform = &device_transform; |
748 | 814 |
749 data_for_recursion.transform_tree->clear(); | 815 data_for_recursion.transform_tree->clear(); |
750 data_for_recursion.clip_tree->clear(); | 816 data_for_recursion.clip_tree->clear(); |
751 data_for_recursion.effect_tree->clear(); | 817 data_for_recursion.effect_tree->clear(); |
818 data_for_recursion.scroll_tree->clear(); | |
752 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); | 819 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); |
753 data_for_recursion.axis_align_since_render_target = true; | 820 data_for_recursion.axis_align_since_render_target = true; |
754 data_for_recursion.sequence_number = property_trees->sequence_number; | 821 data_for_recursion.sequence_number = property_trees->sequence_number; |
755 data_for_recursion.transform_tree->set_device_scale_factor( | 822 data_for_recursion.transform_tree->set_device_scale_factor( |
756 device_scale_factor); | 823 device_scale_factor); |
757 | 824 |
758 ClipNode root_clip; | 825 ClipNode root_clip; |
759 root_clip.data.resets_clip = true; | 826 root_clip.data.resets_clip = true; |
760 root_clip.data.applies_local_clip = true; | 827 root_clip.data.applies_local_clip = true; |
761 root_clip.data.clip = gfx::RectF(viewport); | 828 root_clip.data.clip = gfx::RectF(viewport); |
762 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 829 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
763 data_for_recursion.clip_tree_parent = | 830 data_for_recursion.clip_tree_parent = |
764 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 831 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
765 | 832 |
766 DataForRecursionFromChild<LayerType> data_from_child; | 833 DataForRecursionFromChild<LayerType> data_from_child; |
767 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 834 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
768 property_trees->needs_rebuild = false; | 835 property_trees->needs_rebuild = false; |
769 | 836 |
770 // The transform tree is kept up-to-date as it is built, but the | 837 // The transform tree is kept up-to-date as it is built, but the |
771 // combined_clips stored in the clip tree aren't computed during tree | 838 // combined_clips stored in the clip tree aren't computed during tree |
772 // building. | 839 // building. |
773 property_trees->transform_tree.set_needs_update(false); | 840 property_trees->transform_tree.set_needs_update(false); |
774 property_trees->clip_tree.set_needs_update(true); | 841 property_trees->clip_tree.set_needs_update(true); |
775 property_trees->effect_tree.set_needs_update(false); | 842 property_trees->effect_tree.set_needs_update(false); |
843 property_trees->scroll_tree.set_needs_update(false); | |
776 } | 844 } |
777 | 845 |
778 void PropertyTreeBuilder::BuildPropertyTrees( | 846 void PropertyTreeBuilder::BuildPropertyTrees( |
779 Layer* root_layer, | 847 Layer* root_layer, |
780 const Layer* page_scale_layer, | 848 const Layer* page_scale_layer, |
781 const Layer* inner_viewport_scroll_layer, | 849 const Layer* inner_viewport_scroll_layer, |
782 const Layer* outer_viewport_scroll_layer, | 850 const Layer* outer_viewport_scroll_layer, |
783 const Layer* overscroll_elasticity_layer, | 851 const Layer* overscroll_elasticity_layer, |
784 const gfx::Vector2dF& elastic_overscroll, | 852 const gfx::Vector2dF& elastic_overscroll, |
785 float page_scale_factor, | 853 float page_scale_factor, |
(...skipping 21 matching lines...) Expand all Loading... | |
807 const gfx::Transform& device_transform, | 875 const gfx::Transform& device_transform, |
808 PropertyTrees* property_trees) { | 876 PropertyTrees* property_trees) { |
809 BuildPropertyTreesTopLevelInternal( | 877 BuildPropertyTreesTopLevelInternal( |
810 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 878 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
811 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 879 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 880 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
813 device_transform, property_trees); | 881 device_transform, property_trees); |
814 } | 882 } |
815 | 883 |
816 } // namespace cc | 884 } // namespace cc |
OLD | NEW |