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_tree_parent_created_by_uninheritable_criteria; |
51 const gfx::Transform* device_transform; | 54 const gfx::Transform* device_transform; |
52 gfx::Vector2dF scroll_compensation_adjustment; | 55 gfx::Vector2dF scroll_compensation_adjustment; |
53 gfx::Transform compound_transform_since_render_target; | 56 gfx::Transform compound_transform_since_render_target; |
54 bool axis_align_since_render_target; | 57 bool axis_align_since_render_target; |
55 int sequence_number; | 58 int sequence_number; |
56 }; | 59 }; |
57 | 60 |
58 template <typename LayerType> | 61 template <typename LayerType> |
59 struct DataForRecursionFromChild { | 62 struct DataForRecursionFromChild { |
60 int num_copy_requests_in_subtree; | 63 int num_copy_requests_in_subtree; |
61 | 64 |
62 DataForRecursionFromChild() : num_copy_requests_in_subtree(0) {} | 65 DataForRecursionFromChild() : num_copy_requests_in_subtree(0) {} |
63 | 66 |
64 void Merge(const DataForRecursionFromChild& data) { | 67 void Merge(const DataForRecursionFromChild& data) { |
65 num_copy_requests_in_subtree += data.num_copy_requests_in_subtree; | 68 num_copy_requests_in_subtree += data.num_copy_requests_in_subtree; |
66 } | 69 } |
67 }; | 70 }; |
68 | 71 |
69 template <typename LayerType> | 72 template <typename LayerType> |
70 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, | 73 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, |
71 LayerType* layer) { | 74 LayerType* layer) { |
72 return layer->position_constraint().is_fixed_position() | 75 return layer->position_constraint().is_fixed_position() |
73 ? data.transform_fixed_parent | 76 ? data.transform_fixed_parent |
74 : data.transform_tree_parent; | 77 : data.transform_tree_parent; |
75 } | 78 } |
76 | 79 |
77 template <typename LayerType> | 80 template <typename LayerType> |
78 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, | 81 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, |
79 LayerType* layer) { | 82 LayerType* layer) { |
80 const bool inherits_clip = !layer->parent() || !layer->clip_parent(); | 83 const bool inherits_clip = !layer->clip_parent(); |
81 const int id = inherits_clip ? data.clip_tree_parent | 84 const int id = inherits_clip ? data.clip_tree_parent |
82 : layer->clip_parent()->clip_tree_index(); | 85 : layer->clip_parent()->clip_tree_index(); |
83 return data.clip_tree->Node(id); | 86 return data.clip_tree->Node(id); |
84 } | 87 } |
85 | 88 |
86 template <typename LayerType> | 89 template <typename LayerType> |
87 static bool LayerClipsSubtree(LayerType* layer) { | 90 static bool LayerClipsSubtree(LayerType* layer) { |
88 return layer->masks_to_bounds() || layer->mask_layer(); | 91 return layer->masks_to_bounds() || layer->mask_layer(); |
89 } | 92 } |
90 | 93 |
91 template <typename LayerType> | 94 template <typename LayerType> |
| 95 static int GetScrollParentId(const DataForRecursion<LayerType>& data, |
| 96 LayerType* layer) { |
| 97 const bool inherits_scroll = !layer->scroll_parent(); |
| 98 const int id = inherits_scroll ? data.scroll_tree_parent |
| 99 : layer->scroll_parent()->scroll_tree_index(); |
| 100 return id; |
| 101 } |
| 102 |
| 103 template <typename LayerType> |
92 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, | 104 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, |
93 LayerType* layer, | 105 LayerType* layer, |
94 bool created_render_surface, | 106 bool created_render_surface, |
95 bool created_transform_node, | 107 bool created_transform_node, |
96 DataForRecursion<LayerType>* data_for_children) { | 108 DataForRecursion<LayerType>* data_for_children) { |
97 ClipNode* parent = GetClipParent(data_from_ancestor, layer); | 109 ClipNode* parent = GetClipParent(data_from_ancestor, layer); |
98 int parent_id = parent->id; | 110 int parent_id = parent->id; |
99 | 111 |
100 bool is_root = !layer->parent(); | 112 bool is_root = !layer->parent(); |
101 | 113 |
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); | 627 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); |
616 if (should_create_render_surface) { | 628 if (should_create_render_surface) { |
617 data_for_children->compound_transform_since_render_target = | 629 data_for_children->compound_transform_since_render_target = |
618 gfx::Transform(); | 630 gfx::Transform(); |
619 data_for_children->axis_align_since_render_target = true; | 631 data_for_children->axis_align_since_render_target = true; |
620 } | 632 } |
621 return should_create_render_surface; | 633 return should_create_render_surface; |
622 } | 634 } |
623 | 635 |
624 template <typename LayerType> | 636 template <typename LayerType> |
| 637 void AddScrollNodeIfNeeded( |
| 638 const DataForRecursion<LayerType>& data_from_ancestor, |
| 639 LayerType* layer, |
| 640 DataForRecursion<LayerType>* data_for_children) { |
| 641 int parent_id = GetScrollParentId(data_from_ancestor, layer); |
| 642 |
| 643 bool is_root = !layer->parent(); |
| 644 bool scrollable = layer->scrollable(); |
| 645 bool contains_non_fast_scrollable_region = |
| 646 !layer->non_fast_scrollable_region().IsEmpty(); |
| 647 bool should_scroll_on_main_thread = layer->should_scroll_on_main_thread(); |
| 648 |
| 649 bool scroll_node_uninheritable_criteria = |
| 650 is_root || scrollable || contains_non_fast_scrollable_region; |
| 651 bool requires_node = |
| 652 scroll_node_uninheritable_criteria || |
| 653 (should_scroll_on_main_thread && |
| 654 data_from_ancestor.scroll_tree_parent_created_by_uninheritable_criteria); |
| 655 |
| 656 if (!requires_node) { |
| 657 data_for_children->scroll_tree_parent = parent_id; |
| 658 } else { |
| 659 ScrollNode node; |
| 660 node.owner_id = layer->id(); |
| 661 node.data.scrollable = scrollable; |
| 662 node.data.should_scroll_on_main_thread = should_scroll_on_main_thread; |
| 663 node.data.contains_non_fast_scrollable_region = |
| 664 contains_non_fast_scrollable_region; |
| 665 node.data.transform_id = |
| 666 data_for_children->transform_tree_parent->transform_tree_index(); |
| 667 data_for_children->scroll_tree_parent = |
| 668 data_for_children->scroll_tree->Insert(node, parent_id); |
| 669 data_for_children->scroll_tree_parent_created_by_uninheritable_criteria = |
| 670 scroll_node_uninheritable_criteria; |
| 671 } |
| 672 |
| 673 layer->SetScrollTreeIndex(data_for_children->scroll_tree_parent); |
| 674 } |
| 675 |
| 676 template <typename LayerType> |
625 void BuildPropertyTreesInternal( | 677 void BuildPropertyTreesInternal( |
626 LayerType* layer, | 678 LayerType* layer, |
627 const DataForRecursion<LayerType>& data_from_parent, | 679 const DataForRecursion<LayerType>& data_from_parent, |
628 DataForRecursionFromChild<LayerType>* data_to_parent) { | 680 DataForRecursionFromChild<LayerType>* data_to_parent) { |
629 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); | 681 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); |
630 if (layer->mask_layer()) | 682 if (layer->mask_layer()) |
631 layer->mask_layer()->set_property_tree_sequence_number( | 683 layer->mask_layer()->set_property_tree_sequence_number( |
632 data_from_parent.sequence_number); | 684 data_from_parent.sequence_number); |
633 | 685 |
634 DataForRecursion<LayerType> data_for_children(data_from_parent); | 686 DataForRecursion<LayerType> data_for_children(data_from_parent); |
635 | 687 |
636 bool created_render_surface = | 688 bool created_render_surface = |
637 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); | 689 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); |
638 | 690 |
639 if (created_render_surface) { | 691 if (created_render_surface) { |
640 data_for_children.render_target = data_for_children.effect_tree_parent; | 692 data_for_children.render_target = data_for_children.effect_tree_parent; |
641 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 693 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
642 } else { | 694 } else { |
643 layer->set_draw_blend_mode(layer->blend_mode()); | 695 layer->set_draw_blend_mode(layer->blend_mode()); |
644 } | 696 } |
645 | 697 |
646 bool created_transform_node = AddTransformNodeIfNeeded( | 698 bool created_transform_node = AddTransformNodeIfNeeded( |
647 data_from_parent, layer, created_render_surface, &data_for_children); | 699 data_from_parent, layer, created_render_surface, &data_for_children); |
648 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 700 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
649 created_transform_node, &data_for_children); | 701 created_transform_node, &data_for_children); |
650 | 702 |
| 703 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 704 |
651 for (size_t i = 0; i < layer->children().size(); ++i) { | 705 for (size_t i = 0; i < layer->children().size(); ++i) { |
652 if (!layer->child_at(i)->scroll_parent()) { | 706 if (!layer->child_at(i)->scroll_parent()) { |
653 DataForRecursionFromChild<LayerType> data_from_child; | 707 DataForRecursionFromChild<LayerType> data_from_child; |
654 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 708 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
655 &data_from_child); | 709 &data_from_child); |
656 data_to_parent->Merge(data_from_child); | 710 data_to_parent->Merge(data_from_child); |
657 } else { | 711 } else { |
658 // The child should be included in its scroll parent's list of scroll | 712 // The child should be included in its scroll parent's list of scroll |
659 // children. | 713 // children. |
660 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( | 714 DCHECK(layer->child_at(i)->scroll_parent()->scroll_children()->count( |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
718 root_layer->position()); | 772 root_layer->position()); |
719 return; | 773 return; |
720 } | 774 } |
721 | 775 |
722 property_trees->sequence_number++; | 776 property_trees->sequence_number++; |
723 | 777 |
724 DataForRecursion<LayerType> data_for_recursion; | 778 DataForRecursion<LayerType> data_for_recursion; |
725 data_for_recursion.transform_tree = &property_trees->transform_tree; | 779 data_for_recursion.transform_tree = &property_trees->transform_tree; |
726 data_for_recursion.clip_tree = &property_trees->clip_tree; | 780 data_for_recursion.clip_tree = &property_trees->clip_tree; |
727 data_for_recursion.effect_tree = &property_trees->effect_tree; | 781 data_for_recursion.effect_tree = &property_trees->effect_tree; |
| 782 data_for_recursion.scroll_tree = &property_trees->scroll_tree; |
728 data_for_recursion.transform_tree_parent = nullptr; | 783 data_for_recursion.transform_tree_parent = nullptr; |
729 data_for_recursion.transform_fixed_parent = nullptr; | 784 data_for_recursion.transform_fixed_parent = nullptr; |
730 data_for_recursion.render_target = kRootPropertyTreeNodeId; | 785 data_for_recursion.render_target = kRootPropertyTreeNodeId; |
731 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; | 786 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; |
732 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; | 787 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; |
| 788 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; |
733 data_for_recursion.page_scale_layer = page_scale_layer; | 789 data_for_recursion.page_scale_layer = page_scale_layer; |
734 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; | 790 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
735 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; | 791 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
736 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; | 792 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; |
737 data_for_recursion.elastic_overscroll = elastic_overscroll; | 793 data_for_recursion.elastic_overscroll = elastic_overscroll; |
738 data_for_recursion.page_scale_factor = page_scale_factor; | 794 data_for_recursion.page_scale_factor = page_scale_factor; |
739 data_for_recursion.in_subtree_of_page_scale_layer = false; | 795 data_for_recursion.in_subtree_of_page_scale_layer = false; |
740 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; | 796 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; |
741 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; | 797 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; |
742 data_for_recursion.should_flatten = false; | 798 data_for_recursion.should_flatten = false; |
743 data_for_recursion.target_is_clipped = false; | 799 data_for_recursion.target_is_clipped = false; |
744 data_for_recursion.is_hidden = false; | 800 data_for_recursion.is_hidden = false; |
| 801 data_for_recursion.scroll_tree_parent_created_by_uninheritable_criteria = |
| 802 true; |
745 data_for_recursion.device_transform = &device_transform; | 803 data_for_recursion.device_transform = &device_transform; |
746 | 804 |
747 data_for_recursion.transform_tree->clear(); | 805 data_for_recursion.transform_tree->clear(); |
748 data_for_recursion.clip_tree->clear(); | 806 data_for_recursion.clip_tree->clear(); |
749 data_for_recursion.effect_tree->clear(); | 807 data_for_recursion.effect_tree->clear(); |
| 808 data_for_recursion.scroll_tree->clear(); |
750 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); | 809 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); |
751 data_for_recursion.axis_align_since_render_target = true; | 810 data_for_recursion.axis_align_since_render_target = true; |
752 data_for_recursion.sequence_number = property_trees->sequence_number; | 811 data_for_recursion.sequence_number = property_trees->sequence_number; |
753 data_for_recursion.transform_tree->set_device_scale_factor( | 812 data_for_recursion.transform_tree->set_device_scale_factor( |
754 device_scale_factor); | 813 device_scale_factor); |
755 | 814 |
756 ClipNode root_clip; | 815 ClipNode root_clip; |
757 root_clip.data.resets_clip = true; | 816 root_clip.data.resets_clip = true; |
758 root_clip.data.applies_local_clip = true; | 817 root_clip.data.applies_local_clip = true; |
759 root_clip.data.clip = gfx::RectF(viewport); | 818 root_clip.data.clip = gfx::RectF(viewport); |
760 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 819 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
761 data_for_recursion.clip_tree_parent = | 820 data_for_recursion.clip_tree_parent = |
762 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 821 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
763 | 822 |
764 DataForRecursionFromChild<LayerType> data_from_child; | 823 DataForRecursionFromChild<LayerType> data_from_child; |
765 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 824 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
766 property_trees->needs_rebuild = false; | 825 property_trees->needs_rebuild = false; |
767 | 826 |
768 // The transform tree is kept up-to-date as it is built, but the | 827 // The transform tree is kept up-to-date as it is built, but the |
769 // combined_clips stored in the clip tree and the screen_space_opacity and | 828 // combined_clips stored in the clip tree and the screen_space_opacity and |
770 // is_drawn in the effect tree aren't computed during tree building. | 829 // is_drawn in the effect tree aren't computed during tree building. |
771 property_trees->transform_tree.set_needs_update(false); | 830 property_trees->transform_tree.set_needs_update(false); |
772 property_trees->clip_tree.set_needs_update(true); | 831 property_trees->clip_tree.set_needs_update(true); |
773 property_trees->effect_tree.set_needs_update(true); | 832 property_trees->effect_tree.set_needs_update(true); |
| 833 property_trees->scroll_tree.set_needs_update(false); |
774 } | 834 } |
775 | 835 |
776 void PropertyTreeBuilder::BuildPropertyTrees( | 836 void PropertyTreeBuilder::BuildPropertyTrees( |
777 Layer* root_layer, | 837 Layer* root_layer, |
778 const Layer* page_scale_layer, | 838 const Layer* page_scale_layer, |
779 const Layer* inner_viewport_scroll_layer, | 839 const Layer* inner_viewport_scroll_layer, |
780 const Layer* outer_viewport_scroll_layer, | 840 const Layer* outer_viewport_scroll_layer, |
781 const Layer* overscroll_elasticity_layer, | 841 const Layer* overscroll_elasticity_layer, |
782 const gfx::Vector2dF& elastic_overscroll, | 842 const gfx::Vector2dF& elastic_overscroll, |
783 float page_scale_factor, | 843 float page_scale_factor, |
(...skipping 21 matching lines...) Expand all Loading... |
805 const gfx::Transform& device_transform, | 865 const gfx::Transform& device_transform, |
806 PropertyTrees* property_trees) { | 866 PropertyTrees* property_trees) { |
807 BuildPropertyTreesTopLevelInternal( | 867 BuildPropertyTreesTopLevelInternal( |
808 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 868 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
809 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 869 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
810 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 870 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
811 device_transform, property_trees); | 871 device_transform, property_trees); |
812 } | 872 } |
813 | 873 |
814 } // namespace cc | 874 } // namespace cc |
OLD | NEW |