Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: cc/trees/property_tree_builder.cc

Issue 1626513003: Add ScrollTree builder and unit test (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge with master Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698