| 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; |
| 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; |
| 61 | 65 |
| 62 DataForRecursionFromChild() : num_copy_requests_in_subtree(0) {} | 66 DataForRecursionFromChild() : num_copy_requests_in_subtree(0) {} |
| 63 | 67 |
| 64 void Merge(const DataForRecursionFromChild& data) { | 68 void Merge(const DataForRecursionFromChild& data) { |
| 65 num_copy_requests_in_subtree += data.num_copy_requests_in_subtree; | 69 num_copy_requests_in_subtree += data.num_copy_requests_in_subtree; |
| 66 } | 70 } |
| 67 }; | 71 }; |
| 68 | 72 |
| 69 template <typename LayerType> | 73 template <typename LayerType> |
| 70 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, | 74 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, |
| 71 LayerType* layer) { | 75 LayerType* layer) { |
| 72 return layer->position_constraint().is_fixed_position() | 76 return layer->position_constraint().is_fixed_position() |
| 73 ? data.transform_fixed_parent | 77 ? data.transform_fixed_parent |
| 74 : data.transform_tree_parent; | 78 : data.transform_tree_parent; |
| 75 } | 79 } |
| 76 | 80 |
| 77 template <typename LayerType> | 81 template <typename LayerType> |
| 78 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, | 82 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, |
| 79 LayerType* layer) { | 83 LayerType* layer) { |
| 80 const bool inherits_clip = !layer->parent() || !layer->clip_parent(); | 84 const bool inherits_clip = !layer->clip_parent(); |
| 81 const int id = inherits_clip ? data.clip_tree_parent | 85 const int id = inherits_clip ? data.clip_tree_parent |
| 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->scroll_parent(); |
| 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 scroll_node_uninheritable_criteria = |
| 652 is_root || scrollable || |
| 653 (scroll_blocks_on | accumulated_scroll_blocks_on) != |
| 654 accumulated_scroll_blocks_on || |
| 655 contains_non_fast_scrollable_region; |
| 656 bool requires_node = |
| 657 scroll_node_uninheritable_criteria || |
| 658 (should_scroll_on_main_thread && |
| 659 data_from_ancestor.scroll_tree_parent_created_by_uninheritable_criteria); |
| 660 |
| 661 if (!requires_node) { |
| 662 data_for_children->scroll_tree_parent = parent_id; |
| 663 } else { |
| 664 ScrollNode node; |
| 665 node.owner_id = layer->id(); |
| 666 node.data.scrollable = scrollable; |
| 667 node.data.should_scroll_on_main_thread = should_scroll_on_main_thread; |
| 668 node.data.scroll_blocks_on = |
| 669 scroll_blocks_on | accumulated_scroll_blocks_on; |
| 670 node.data.contains_non_fast_scrollable_region = |
| 671 contains_non_fast_scrollable_region; |
| 672 node.data.transform_id = |
| 673 data_for_children->transform_tree_parent->transform_tree_index(); |
| 674 data_for_children->scroll_tree_parent = |
| 675 data_for_children->scroll_tree->Insert(node, parent_id); |
| 676 data_for_children->scroll_tree_parent_created_by_uninheritable_criteria = |
| 677 scroll_node_uninheritable_criteria; |
| 678 data_for_children->accumulated_scroll_blocks_on = |
| 679 node.data.scroll_blocks_on; |
| 680 } |
| 681 |
| 682 layer->SetScrollTreeIndex(data_for_children->scroll_tree_parent); |
| 683 } |
| 684 |
| 685 template <typename LayerType> |
| 623 void BuildPropertyTreesInternal( | 686 void BuildPropertyTreesInternal( |
| 624 LayerType* layer, | 687 LayerType* layer, |
| 625 const DataForRecursion<LayerType>& data_from_parent, | 688 const DataForRecursion<LayerType>& data_from_parent, |
| 626 DataForRecursionFromChild<LayerType>* data_to_parent) { | 689 DataForRecursionFromChild<LayerType>* data_to_parent) { |
| 627 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); | 690 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); |
| 628 if (layer->mask_layer()) | 691 if (layer->mask_layer()) |
| 629 layer->mask_layer()->set_property_tree_sequence_number( | 692 layer->mask_layer()->set_property_tree_sequence_number( |
| 630 data_from_parent.sequence_number); | 693 data_from_parent.sequence_number); |
| 631 | 694 |
| 632 DataForRecursion<LayerType> data_for_children(data_from_parent); | 695 DataForRecursion<LayerType> data_for_children(data_from_parent); |
| 633 | 696 |
| 634 bool created_render_surface = | 697 bool created_render_surface = |
| 635 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); | 698 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 636 | 699 |
| 637 if (created_render_surface) { | 700 if (created_render_surface) { |
| 638 data_for_children.render_target = data_for_children.effect_tree_parent; | 701 data_for_children.render_target = data_for_children.effect_tree_parent; |
| 639 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); | 702 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); |
| 640 } else { | 703 } else { |
| 641 layer->set_draw_blend_mode(layer->blend_mode()); | 704 layer->set_draw_blend_mode(layer->blend_mode()); |
| 642 } | 705 } |
| 643 | 706 |
| 644 bool created_transform_node = AddTransformNodeIfNeeded( | 707 bool created_transform_node = AddTransformNodeIfNeeded( |
| 645 data_from_parent, layer, created_render_surface, &data_for_children); | 708 data_from_parent, layer, created_render_surface, &data_for_children); |
| 646 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, | 709 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
| 647 created_transform_node, &data_for_children); | 710 created_transform_node, &data_for_children); |
| 648 | 711 |
| 712 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| 713 |
| 649 data_for_children.is_hidden = | 714 data_for_children.is_hidden = |
| 650 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; | 715 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; |
| 651 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); | 716 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); |
| 652 | 717 |
| 653 for (size_t i = 0; i < layer->children().size(); ++i) { | 718 for (size_t i = 0; i < layer->children().size(); ++i) { |
| 654 if (!layer->child_at(i)->scroll_parent()) { | 719 if (!layer->child_at(i)->scroll_parent()) { |
| 655 DataForRecursionFromChild<LayerType> data_from_child; | 720 DataForRecursionFromChild<LayerType> data_from_child; |
| 656 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, | 721 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, |
| 657 &data_from_child); | 722 &data_from_child); |
| 658 data_to_parent->Merge(data_from_child); | 723 data_to_parent->Merge(data_from_child); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 root_layer->position()); | 785 root_layer->position()); |
| 721 return; | 786 return; |
| 722 } | 787 } |
| 723 | 788 |
| 724 property_trees->sequence_number++; | 789 property_trees->sequence_number++; |
| 725 | 790 |
| 726 DataForRecursion<LayerType> data_for_recursion; | 791 DataForRecursion<LayerType> data_for_recursion; |
| 727 data_for_recursion.transform_tree = &property_trees->transform_tree; | 792 data_for_recursion.transform_tree = &property_trees->transform_tree; |
| 728 data_for_recursion.clip_tree = &property_trees->clip_tree; | 793 data_for_recursion.clip_tree = &property_trees->clip_tree; |
| 729 data_for_recursion.effect_tree = &property_trees->effect_tree; | 794 data_for_recursion.effect_tree = &property_trees->effect_tree; |
| 795 data_for_recursion.scroll_tree = &property_trees->scroll_tree; |
| 730 data_for_recursion.transform_tree_parent = nullptr; | 796 data_for_recursion.transform_tree_parent = nullptr; |
| 731 data_for_recursion.transform_fixed_parent = nullptr; | 797 data_for_recursion.transform_fixed_parent = nullptr; |
| 732 data_for_recursion.render_target = kRootPropertyTreeNodeId; | 798 data_for_recursion.render_target = kRootPropertyTreeNodeId; |
| 733 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; | 799 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; |
| 734 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; | 800 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; |
| 801 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; |
| 735 data_for_recursion.page_scale_layer = page_scale_layer; | 802 data_for_recursion.page_scale_layer = page_scale_layer; |
| 736 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; | 803 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
| 737 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; | 804 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
| 738 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; | 805 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; |
| 739 data_for_recursion.elastic_overscroll = elastic_overscroll; | 806 data_for_recursion.elastic_overscroll = elastic_overscroll; |
| 740 data_for_recursion.page_scale_factor = page_scale_factor; | 807 data_for_recursion.page_scale_factor = page_scale_factor; |
| 741 data_for_recursion.in_subtree_of_page_scale_layer = false; | 808 data_for_recursion.in_subtree_of_page_scale_layer = false; |
| 742 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; | 809 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; |
| 743 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; | 810 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; |
| 744 data_for_recursion.should_flatten = false; | 811 data_for_recursion.should_flatten = false; |
| 745 data_for_recursion.target_is_clipped = false; | 812 data_for_recursion.target_is_clipped = false; |
| 746 data_for_recursion.is_hidden = false; | 813 data_for_recursion.is_hidden = false; |
| 814 data_for_recursion.scroll_tree_parent_created_by_uninheritable_criteria = |
| 815 true; |
| 816 data_for_recursion.accumulated_scroll_blocks_on = SCROLL_BLOCKS_ON_NONE; |
| 747 data_for_recursion.device_transform = &device_transform; | 817 data_for_recursion.device_transform = &device_transform; |
| 748 | 818 |
| 749 data_for_recursion.transform_tree->clear(); | 819 data_for_recursion.transform_tree->clear(); |
| 750 data_for_recursion.clip_tree->clear(); | 820 data_for_recursion.clip_tree->clear(); |
| 751 data_for_recursion.effect_tree->clear(); | 821 data_for_recursion.effect_tree->clear(); |
| 822 data_for_recursion.scroll_tree->clear(); |
| 752 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); | 823 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); |
| 753 data_for_recursion.axis_align_since_render_target = true; | 824 data_for_recursion.axis_align_since_render_target = true; |
| 754 data_for_recursion.sequence_number = property_trees->sequence_number; | 825 data_for_recursion.sequence_number = property_trees->sequence_number; |
| 755 data_for_recursion.transform_tree->set_device_scale_factor( | 826 data_for_recursion.transform_tree->set_device_scale_factor( |
| 756 device_scale_factor); | 827 device_scale_factor); |
| 757 | 828 |
| 758 ClipNode root_clip; | 829 ClipNode root_clip; |
| 759 root_clip.data.resets_clip = true; | 830 root_clip.data.resets_clip = true; |
| 760 root_clip.data.applies_local_clip = true; | 831 root_clip.data.applies_local_clip = true; |
| 761 root_clip.data.clip = gfx::RectF(viewport); | 832 root_clip.data.clip = gfx::RectF(viewport); |
| 762 root_clip.data.transform_id = kRootPropertyTreeNodeId; | 833 root_clip.data.transform_id = kRootPropertyTreeNodeId; |
| 763 data_for_recursion.clip_tree_parent = | 834 data_for_recursion.clip_tree_parent = |
| 764 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); | 835 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); |
| 765 | 836 |
| 766 DataForRecursionFromChild<LayerType> data_from_child; | 837 DataForRecursionFromChild<LayerType> data_from_child; |
| 767 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); | 838 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); |
| 768 property_trees->needs_rebuild = false; | 839 property_trees->needs_rebuild = false; |
| 769 | 840 |
| 770 // The transform tree is kept up-to-date as it is built, but the | 841 // 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 | 842 // combined_clips stored in the clip tree aren't computed during tree |
| 772 // building. | 843 // building. |
| 773 property_trees->transform_tree.set_needs_update(false); | 844 property_trees->transform_tree.set_needs_update(false); |
| 774 property_trees->clip_tree.set_needs_update(true); | 845 property_trees->clip_tree.set_needs_update(true); |
| 775 property_trees->effect_tree.set_needs_update(false); | 846 property_trees->effect_tree.set_needs_update(false); |
| 847 property_trees->scroll_tree.set_needs_update(false); |
| 776 } | 848 } |
| 777 | 849 |
| 778 void PropertyTreeBuilder::BuildPropertyTrees( | 850 void PropertyTreeBuilder::BuildPropertyTrees( |
| 779 Layer* root_layer, | 851 Layer* root_layer, |
| 780 const Layer* page_scale_layer, | 852 const Layer* page_scale_layer, |
| 781 const Layer* inner_viewport_scroll_layer, | 853 const Layer* inner_viewport_scroll_layer, |
| 782 const Layer* outer_viewport_scroll_layer, | 854 const Layer* outer_viewport_scroll_layer, |
| 783 const Layer* overscroll_elasticity_layer, | 855 const Layer* overscroll_elasticity_layer, |
| 784 const gfx::Vector2dF& elastic_overscroll, | 856 const gfx::Vector2dF& elastic_overscroll, |
| 785 float page_scale_factor, | 857 float page_scale_factor, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 807 const gfx::Transform& device_transform, | 879 const gfx::Transform& device_transform, |
| 808 PropertyTrees* property_trees) { | 880 PropertyTrees* property_trees) { |
| 809 BuildPropertyTreesTopLevelInternal( | 881 BuildPropertyTreesTopLevelInternal( |
| 810 root_layer, page_scale_layer, inner_viewport_scroll_layer, | 882 root_layer, page_scale_layer, inner_viewport_scroll_layer, |
| 811 outer_viewport_scroll_layer, overscroll_elasticity_layer, | 883 outer_viewport_scroll_layer, overscroll_elasticity_layer, |
| 812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, | 884 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, |
| 813 device_transform, property_trees); | 885 device_transform, property_trees); |
| 814 } | 886 } |
| 815 | 887 |
| 816 } // namespace cc | 888 } // namespace cc |
| OLD | NEW |