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

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

Issue 2087963003: cc: Stop creating unused 0 property tree nodes other than transform Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 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.h ('k') | cc/trees/property_tree_builder.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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 11 matching lines...) Expand all
22 #include "cc/trees/property_tree.h" 22 #include "cc/trees/property_tree.h"
23 #include "cc/trees/scroll_node.h" 23 #include "cc/trees/scroll_node.h"
24 #include "cc/trees/transform_node.h" 24 #include "cc/trees/transform_node.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 template <typename T> 29 template <typename T>
30 PropertyTree<T>::PropertyTree() 30 PropertyTree<T>::PropertyTree()
31 : needs_update_(false) { 31 : needs_update_(false) {
32 nodes_.push_back(T());
33 back()->id = 0;
34 back()->parent_id = -1;
35 } 32 }
36 33
37 // Equivalent to 34 // Equivalent to
38 // PropertyTree<T>::~PropertyTree() = default; 35 // PropertyTree<T>::~PropertyTree() = default;
39 // but due to a gcc bug the generated destructor will have wrong symbol 36 // but due to a gcc bug the generated destructor will have wrong symbol
40 // visibility in component build. 37 // visibility in component build.
41 template <typename T> 38 template <typename T>
42 PropertyTree<T>::~PropertyTree() {} 39 PropertyTree<T>::~PropertyTree() {}
43 40
44 template <typename T> 41 template <typename T>
45 PropertyTree<T>& PropertyTree<T>::operator=(const PropertyTree<T>&) = default; 42 PropertyTree<T>& PropertyTree<T>::operator=(const PropertyTree<T>&) = default;
46 43
47 TransformTree::TransformTree() 44 TransformTree::TransformTree()
48 : source_to_parent_updates_allowed_(true), 45 : source_to_parent_updates_allowed_(true),
49 page_scale_factor_(1.f), 46 page_scale_factor_(1.f),
50 device_scale_factor_(1.f), 47 device_scale_factor_(1.f),
51 device_transform_scale_factor_(1.f) { 48 device_transform_scale_factor_(1.f) {
52 cached_data_.push_back(TransformCachedNodeData()); 49 Insert(TransformNode(), kInvalidNodeId);
53 } 50 }
54 51
55 TransformTree::~TransformTree() = default; 52 TransformTree::~TransformTree() = default;
56 TransformTree& TransformTree::operator=(const TransformTree&) = default; 53 TransformTree& TransformTree::operator=(const TransformTree&) = default;
57 54
58 template <typename T> 55 template <typename T>
59 int PropertyTree<T>::Insert(const T& tree_node, int parent_id) { 56 int PropertyTree<T>::Insert(const T& tree_node, int parent_id) {
60 DCHECK_GT(nodes_.size(), 0u); 57 if (nodes_.size() == 0u)
58 DCHECK_EQ(parent_id, kInvalidNodeId) << "size" << nodes_.size()
59 << "parentid" << parent_id;
61 nodes_.push_back(tree_node); 60 nodes_.push_back(tree_node);
62 T& node = nodes_.back(); 61 T& node = nodes_.back();
63 node.parent_id = parent_id; 62 node.parent_id = parent_id;
64 node.id = static_cast<int>(nodes_.size()) - 1; 63 node.id = static_cast<int>(nodes_.size()) - 1;
65 return node.id; 64 return node.id;
66 } 65 }
67 66
68 template <typename T> 67 template <typename T>
69 void PropertyTree<T>::clear() { 68 void PropertyTree<T>::clear() {
70 nodes_.clear(); 69 nodes_.clear();
71 nodes_.push_back(T());
72 back()->id = 0;
73 back()->parent_id = -1;
74 } 70 }
75 71
76 template <typename T> 72 template <typename T>
77 bool PropertyTree<T>::operator==(const PropertyTree<T>& other) const { 73 bool PropertyTree<T>::operator==(const PropertyTree<T>& other) const {
78 return nodes_ == other.nodes() && needs_update_ == other.needs_update(); 74 return nodes_ == other.nodes() && needs_update_ == other.needs_update();
79 } 75 }
80 76
81 template <typename T> 77 template <typename T>
82 void PropertyTree<T>::ToProtobuf(proto::PropertyTree* proto) const { 78 void PropertyTree<T>::ToProtobuf(proto::PropertyTree* proto) const {
83 DCHECK_EQ(0, proto->nodes_size()); 79 DCHECK_EQ(0, proto->nodes_size());
84 for (const auto& node : nodes_) 80 for (const auto& node : nodes_)
85 node.ToProtobuf(proto->add_nodes()); 81 node.ToProtobuf(proto->add_nodes());
86 proto->set_needs_update(needs_update_); 82 proto->set_needs_update(needs_update_);
87 } 83 }
88 84
89 template <typename T> 85 template <typename T>
90 void PropertyTree<T>::FromProtobuf( 86 void PropertyTree<T>::FromProtobuf(
91 const proto::PropertyTree& proto, 87 const proto::PropertyTree& proto,
92 std::unordered_map<int, int>* node_id_to_index_map) { 88 std::unordered_map<int, int>* node_id_to_index_map) {
93 // Verify that the property tree is empty. 89 // Add the first node.
94 DCHECK_EQ(static_cast<int>(nodes_.size()), 1); 90 DCHECK_GE(proto.nodes_size(), 0);
95 DCHECK_EQ(back()->id, 0); 91 nodes_.clear();
96 DCHECK_EQ(back()->parent_id, -1);
97 92
98 // Add the first node. 93 node_id_to_index_map->clear();
99 DCHECK_GT(proto.nodes_size(), 0); 94 for (int i = 0; i < proto.nodes_size(); ++i) {
100 nodes_.back().FromProtobuf(proto.nodes(0));
101
102 DCHECK(!node_id_to_index_map || (*node_id_to_index_map).empty());
103 for (int i = 1; i < proto.nodes_size(); ++i) {
104 nodes_.push_back(T()); 95 nodes_.push_back(T());
105 nodes_.back().FromProtobuf(proto.nodes(i)); 96 nodes_.back().FromProtobuf(proto.nodes(i));
106 (*node_id_to_index_map)[nodes_.back().owner_id] = nodes_.back().id; 97 (*node_id_to_index_map)[nodes_.back().owner_id] = nodes_.back().id;
107 } 98 }
108 99
109 needs_update_ = proto.needs_update(); 100 needs_update_ = proto.needs_update();
110 } 101 }
111 102
112 template <typename T> 103 template <typename T>
113 void PropertyTree<T>::AsValueInto(base::trace_event::TracedValue* value) const { 104 void PropertyTree<T>::AsValueInto(base::trace_event::TracedValue* value) const {
114 value->BeginArray("nodes"); 105 value->BeginArray("nodes");
115 for (const auto& node : nodes_) { 106 for (const auto& node : nodes_) {
116 value->BeginDictionary(); 107 value->BeginDictionary();
117 node.AsValueInto(value); 108 node.AsValueInto(value);
118 value->EndDictionary(); 109 value->EndDictionary();
119 } 110 }
120 value->EndArray(); 111 value->EndArray();
121 } 112 }
122 113
123 template class PropertyTree<TransformNode>; 114 template class PropertyTree<TransformNode>;
124 template class PropertyTree<ClipNode>; 115 template class PropertyTree<ClipNode>;
125 template class PropertyTree<EffectNode>; 116 template class PropertyTree<EffectNode>;
126 template class PropertyTree<ScrollNode>; 117 template class PropertyTree<ScrollNode>;
127 118
128 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) { 119 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) {
129 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id); 120 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id);
130 DCHECK_EQ(node_id, static_cast<int>(cached_data_.size())); 121 cached_data_.push_back(TransformCachedNodeData());
122 DCHECK_EQ(size(), cached_data_.size());
131 123
132 cached_data_.push_back(TransformCachedNodeData());
133 return node_id; 124 return node_id;
134 } 125 }
135 126
136 void TransformTree::clear() { 127 void TransformTree::clear() {
137 PropertyTree<TransformNode>::clear(); 128 PropertyTree<TransformNode>::clear();
138 129
139 nodes_affected_by_inner_viewport_bounds_delta_.clear(); 130 nodes_affected_by_inner_viewport_bounds_delta_.clear();
140 nodes_affected_by_outer_viewport_bounds_delta_.clear(); 131 nodes_affected_by_outer_viewport_bounds_delta_.clear();
141 cached_data_.clear(); 132 cached_data_.clear();
142 cached_data_.push_back(TransformCachedNodeData()); 133 Insert(TransformNode(), TransformTree::kInvalidNodeId);
143 } 134 }
144 135
145 bool TransformTree::ComputeTransform(int source_id, 136 bool TransformTree::ComputeTransform(int source_id,
146 int dest_id, 137 int dest_id,
147 gfx::Transform* transform) const { 138 gfx::Transform* transform) const {
148 transform->MakeIdentity(); 139 transform->MakeIdentity();
149 140
150 if (source_id == dest_id) 141 if (source_id == dest_id)
151 return true; 142 return true;
152 143
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 return ComputeTransform(source_id, dest_id, &transform) && 187 return ComputeTransform(source_id, dest_id, &transform) &&
197 transform.Preserves2dAxisAlignment(); 188 transform.Preserves2dAxisAlignment();
198 } 189 }
199 190
200 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { 191 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) {
201 return (source_to_parent_updates_allowed() && 192 return (source_to_parent_updates_allowed() &&
202 node->parent_id != node->source_node_id); 193 node->parent_id != node->source_node_id);
203 } 194 }
204 195
205 void TransformTree::ResetChangeTracking() { 196 void TransformTree::ResetChangeTracking() {
206 for (int id = 1; id < static_cast<int>(size()); ++id) { 197 for (int id = TransformTree::kDeviceNodeId; id < static_cast<int>(size());
198 ++id) {
207 TransformNode* node = Node(id); 199 TransformNode* node = Node(id);
208 node->transform_changed = false; 200 node->transform_changed = false;
209 } 201 }
210 } 202 }
211 203
212 void TransformTree::UpdateTransforms(int id) { 204 void TransformTree::UpdateTransforms(int id) {
213 TransformNode* node = Node(id); 205 TransformNode* node = Node(id);
214 TransformNode* parent_node = parent(node); 206 TransformNode* parent_node = parent(node);
215 TransformNode* target_node = Node(TargetId(id)); 207 TransformNode* target_node = Node(TargetId(id));
216 TransformNode* source_node = Node(node->source_node_id); 208 TransformNode* source_node = Node(node->source_node_id);
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 float layer_scale_factor = 420 float layer_scale_factor =
429 device_scale_factor_ * device_transform_scale_factor_; 421 device_scale_factor_ * device_transform_scale_factor_;
430 if (node->in_subtree_of_page_scale_layer) 422 if (node->in_subtree_of_page_scale_layer)
431 layer_scale_factor *= page_scale_factor_; 423 layer_scale_factor *= page_scale_factor_;
432 node->sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( 424 node->sublayer_scale = MathUtil::ComputeTransform2dScaleComponents(
433 ToScreen(node->id), layer_scale_factor); 425 ToScreen(node->id), layer_scale_factor);
434 } 426 }
435 427
436 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, 428 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node,
437 TransformNode* target_node) { 429 TransformNode* target_node) {
430 DCHECK(node);
431 DCHECK(target_node);
438 gfx::Transform target_space_transform; 432 gfx::Transform target_space_transform;
439 if (node->needs_sublayer_scale) { 433 if (node->needs_sublayer_scale) {
440 target_space_transform.MakeIdentity(); 434 target_space_transform.MakeIdentity();
441 target_space_transform.Scale(node->sublayer_scale.x(), 435 target_space_transform.Scale(node->sublayer_scale.x(),
442 node->sublayer_scale.y()); 436 node->sublayer_scale.y());
443 } else { 437 } else {
444 // In order to include the root transform for the root surface, we walk up 438 // In order to include the root transform for the root surface, we walk up
445 // to the root of the transform tree in ComputeTransform. 439 // to the root of the transform tree in ComputeTransform.
446 int target_id = target_node->id; 440 int target_id = target_node->id;
447 ComputeTransformWithDestinationSublayerScale(node->id, target_id, 441 ComputeTransformWithDestinationSublayerScale(node->id, target_id,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 // become uninvertible due to floating-point arithmetic. 529 // become uninvertible due to floating-point arithmetic.
536 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible) 530 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible)
537 is_invertible = false; 531 is_invertible = false;
538 node->node_and_ancestors_are_animated_or_invertible = 532 node->node_and_ancestors_are_animated_or_invertible =
539 node->has_potential_animation || is_invertible; 533 node->has_potential_animation || is_invertible;
540 } 534 }
541 535
542 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, 536 void TransformTree::SetDeviceTransform(const gfx::Transform& transform,
543 gfx::PointF root_position) { 537 gfx::PointF root_position) {
544 gfx::Transform root_post_local = transform; 538 gfx::Transform root_post_local = transform;
545 TransformNode* node = Node(1); 539 TransformNode* node = Node(TransformTree::kRootNodeId);
546 root_post_local.Scale(node->post_local_scale_factor, 540 root_post_local.Scale(node->post_local_scale_factor,
547 node->post_local_scale_factor); 541 node->post_local_scale_factor);
548 root_post_local.Translate(root_position.x(), root_position.y()); 542 root_post_local.Translate(root_position.x(), root_position.y());
549 if (node->post_local == root_post_local) 543 if (node->post_local == root_post_local)
550 return; 544 return;
551 545
552 node->post_local = root_post_local; 546 node->post_local = root_post_local;
553 node->needs_local_transform_update = true; 547 node->needs_local_transform_update = true;
554 set_needs_update(true); 548 set_needs_update(true);
555 } 549 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 DCHECK(static_cast<int>(cached_data_.size()) > node_id); 634 DCHECK(static_cast<int>(cached_data_.size()) > node_id);
641 cached_data_[node_id].to_screen = transform; 635 cached_data_[node_id].to_screen = transform;
642 } 636 }
643 637
644 int TransformTree::TargetId(int node_id) const { 638 int TransformTree::TargetId(int node_id) const {
645 DCHECK(static_cast<int>(cached_data_.size()) > node_id); 639 DCHECK(static_cast<int>(cached_data_.size()) > node_id);
646 return cached_data_[node_id].target_id; 640 return cached_data_[node_id].target_id;
647 } 641 }
648 642
649 void TransformTree::SetTargetId(int node_id, int target_id) { 643 void TransformTree::SetTargetId(int node_id, int target_id) {
650 DCHECK(static_cast<int>(cached_data_.size()) > node_id); 644 DCHECK(static_cast<int>(cached_data_.size()) > node_id) << node_id;
645 DCHECK(static_cast<int>(size()) > target_id) << target_id << " v.s. "
646 << size();
647 DCHECK_GE(target_id, TransformTree::kDeviceNodeId) << target_id;
648 DCHECK_LE(target_id, node_id) << target_id << " v.s. " << node_id;
651 cached_data_[node_id].target_id = target_id; 649 cached_data_[node_id].target_id = target_id;
652 } 650 }
653 651
654 int TransformTree::ContentTargetId(int node_id) const { 652 int TransformTree::ContentTargetId(int node_id) const {
655 DCHECK(static_cast<int>(cached_data_.size()) > node_id); 653 DCHECK(static_cast<int>(cached_data_.size()) > node_id);
656 return cached_data_[node_id].content_target_id; 654 return cached_data_[node_id].content_target_id;
657 } 655 }
658 656
659 void TransformTree::SetContentTargetId(int node_id, int content_target_id) { 657 void TransformTree::SetContentTargetId(int node_id, int content_target_id) {
660 DCHECK(static_cast<int>(cached_data_.size()) > node_id); 658 DCHECK(static_cast<int>(cached_data_.size()) > node_id);
661 cached_data_[node_id].content_target_id = content_target_id; 659 cached_data_[node_id].content_target_id = content_target_id;
662 } 660 }
663 661
664 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( 662 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale(
665 int id) const { 663 int id) const {
666 DCHECK_GT(id, 0); 664 DCHECK_GE(id, TransformTree::kRootNodeId);
667 if (id == 1) { 665 if (id == TransformTree::kRootNodeId) {
668 return gfx::Transform(); 666 return gfx::Transform();
669 } 667 }
670 const TransformNode* node = Node(id); 668 const TransformNode* node = Node(id);
671 gfx::Transform screen_space_transform = ToScreen(id); 669 gfx::Transform screen_space_transform = ToScreen(id);
672 if (node->sublayer_scale.x() != 0.0 && node->sublayer_scale.y() != 0.0) 670 if (node->sublayer_scale.x() != 0.0 && node->sublayer_scale.y() != 0.0)
673 screen_space_transform.Scale(1.0 / node->sublayer_scale.x(), 671 screen_space_transform.Scale(1.0 / node->sublayer_scale.x(),
674 1.0 / node->sublayer_scale.y()); 672 1.0 / node->sublayer_scale.y());
675 return screen_space_transform; 673 return screen_space_transform;
676 } 674 }
677 675
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 708
711 for (int i = 0; i < static_cast<int>(cached_data_.size()); ++i) 709 for (int i = 0; i < static_cast<int>(cached_data_.size()); ++i)
712 cached_data_[i].ToProtobuf(data->add_cached_data()); 710 cached_data_[i].ToProtobuf(data->add_cached_data());
713 } 711 }
714 712
715 void TransformTree::FromProtobuf( 713 void TransformTree::FromProtobuf(
716 const proto::PropertyTree& proto, 714 const proto::PropertyTree& proto,
717 std::unordered_map<int, int>* node_id_to_index_map) { 715 std::unordered_map<int, int>* node_id_to_index_map) {
718 DCHECK(proto.has_property_type()); 716 DCHECK(proto.has_property_type());
719 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); 717 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform);
718 // Verify that the property tree is empty.
719 DCHECK_EQ(static_cast<int>(size()), TransformTree::kRootNodeId);
720 720
721 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 721 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
722 const proto::TransformTreeData& data = proto.transform_tree_data(); 722 const proto::TransformTreeData& data = proto.transform_tree_data();
723 723
724 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); 724 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed();
725 page_scale_factor_ = data.page_scale_factor(); 725 page_scale_factor_ = data.page_scale_factor();
726 device_scale_factor_ = data.device_scale_factor(); 726 device_scale_factor_ = data.device_scale_factor();
727 device_transform_scale_factor_ = data.device_transform_scale_factor(); 727 device_transform_scale_factor_ = data.device_transform_scale_factor();
728 728
729 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty()); 729 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty());
730 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size(); 730 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size();
731 ++i) { 731 ++i) {
732 nodes_affected_by_inner_viewport_bounds_delta_.push_back( 732 nodes_affected_by_inner_viewport_bounds_delta_.push_back(
733 data.nodes_affected_by_inner_viewport_bounds_delta(i)); 733 data.nodes_affected_by_inner_viewport_bounds_delta(i));
734 } 734 }
735 735
736 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); 736 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty());
737 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); 737 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size();
738 ++i) { 738 ++i) {
739 nodes_affected_by_outer_viewport_bounds_delta_.push_back( 739 nodes_affected_by_outer_viewport_bounds_delta_.push_back(
740 data.nodes_affected_by_outer_viewport_bounds_delta(i)); 740 data.nodes_affected_by_outer_viewport_bounds_delta(i));
741 } 741 }
742
743 DCHECK_EQ(static_cast<int>(cached_data_.size()), 1); 742 DCHECK_EQ(static_cast<int>(cached_data_.size()), 1);
744 cached_data_.back().FromProtobuf(data.cached_data(0)); 743 cached_data_.clear();
745 for (int i = 1; i < data.cached_data_size(); ++i) { 744 // cached_data_.back().FromProtobuf(data.cached_data(0));
745 for (int i = 0; i < data.cached_data_size(); ++i) {
746 cached_data_.push_back(TransformCachedNodeData()); 746 cached_data_.push_back(TransformCachedNodeData());
747 cached_data_.back().FromProtobuf(data.cached_data(i)); 747 cached_data_.back().FromProtobuf(data.cached_data(i));
748 } 748 }
749 } 749 }
750 750
751 EffectTree::EffectTree() {} 751 EffectTree::EffectTree() {}
752 752
753 EffectTree::~EffectTree() {} 753 EffectTree::~EffectTree() {}
754 754
755 void EffectTree::clear() { 755 void EffectTree::clear() {
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 copy_requests_.erase(range.first, range.second); 907 copy_requests_.erase(range.first, range.second);
908 908
909 for (auto& it : *requests) { 909 for (auto& it : *requests) {
910 if (!it->has_area()) 910 if (!it->has_area())
911 continue; 911 continue;
912 912
913 // The area needs to be transformed from the space of content that draws to 913 // The area needs to be transformed from the space of content that draws to
914 // the surface to the space of the surface itself. 914 // the surface to the space of the surface itself.
915 int destination_id = effect_node->transform_id; 915 int destination_id = effect_node->transform_id;
916 int source_id; 916 int source_id;
917 if (effect_node->parent_id != -1) { 917 if (effect_node->parent_id != EffectTree::kInvalidNodeId) {
918 // For non-root surfaces, transform only by sub-layer scale. 918 // For non-root surfaces, transform only by sub-layer scale.
919 source_id = destination_id; 919 source_id = destination_id;
920 } else { 920 } else {
921 // The root surface doesn't have the notion of sub-layer scale, but 921 // The root surface doesn't have the notion of sub-layer scale, but
922 // instead has a similar notion of transforming from the space of the root 922 // instead has a similar notion of transforming from the space of the root
923 // layer to the space of the screen. 923 // layer to the space of the screen.
924 DCHECK_EQ(0, destination_id); 924 DCHECK_EQ(0, destination_id);
925 source_id = 1; 925 source_id = 1;
926 } 926 }
927 gfx::Transform transform; 927 gfx::Transform transform;
(...skipping 14 matching lines...) Expand all
942 node.has_copy_request = false; 942 node.has_copy_request = false;
943 } 943 }
944 944
945 // Any copy requests that are still left will be aborted (sending an empty 945 // Any copy requests that are still left will be aborted (sending an empty
946 // result) on destruction. 946 // result) on destruction.
947 copy_requests_.clear(); 947 copy_requests_.clear();
948 set_needs_update(true); 948 set_needs_update(true);
949 } 949 }
950 950
951 int EffectTree::ClosestAncestorWithCopyRequest(int id) const { 951 int EffectTree::ClosestAncestorWithCopyRequest(int id) const {
952 DCHECK_GE(id, 0); 952 DCHECK_GE(id, EffectTree::kRootNodeId);
953 const EffectNode* node = Node(id); 953 const EffectNode* node = Node(id);
954 while (node->id > 1) { 954 while (node) {
955 if (node->has_copy_request) 955 if (node->has_copy_request)
956 return node->id; 956 return node->id;
957 957
958 node = parent(node); 958 node = parent(node);
959 } 959 }
960 960
961 if (node->has_copy_request) 961 return EffectTree::kInvalidNodeId;
962 return node->id;
963 else
964 return -1;
965 } 962 }
966 963
967 void EffectTree::AddMaskOrReplicaLayerId(int id) { 964 void EffectTree::AddMaskOrReplicaLayerId(int id) {
968 mask_replica_layer_ids_.push_back(id); 965 mask_replica_layer_ids_.push_back(id);
969 } 966 }
970 967
971 bool EffectTree::ContributesToDrawnSurface(int id) { 968 bool EffectTree::ContributesToDrawnSurface(int id) {
972 // All drawn nodes contribute to drawn surface. 969 // All drawn nodes contribute to drawn surface.
973 // Exception : Nodes that are hidden and are drawn only for the sake of 970 // Exception : Nodes that are hidden and are drawn only for the sake of
974 // copy requests. 971 // copy requests.
975 EffectNode* node = Node(id); 972 EffectNode* node = Node(id);
976 EffectNode* parent_node = parent(node); 973 EffectNode* parent_node = parent(node);
977 return node->is_drawn && (!parent_node || parent_node->is_drawn); 974 return node->is_drawn && (!parent_node || parent_node->is_drawn);
978 } 975 }
979 976
980 void EffectTree::ResetChangeTracking() { 977 void EffectTree::ResetChangeTracking() {
981 for (int id = 1; id < static_cast<int>(size()); ++id) { 978 for (int id = EffectTree::kRootNodeId; id < static_cast<int>(size()); ++id) {
982 EffectNode* node = Node(id); 979 EffectNode* node = Node(id);
983 node->effect_changed = false; 980 node->effect_changed = false;
984 } 981 }
985 } 982 }
986 983
987 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( 984 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations(
988 TransformNode* node, 985 TransformNode* node,
989 TransformNode* parent_node) { 986 TransformNode* parent_node) {
990 node->node_and_ancestors_have_only_integer_translation = 987 node->node_and_ancestors_have_only_integer_translation =
991 node->to_parent.IsIdentityOrIntegerTranslation(); 988 node->to_parent.IsIdentityOrIntegerTranslation();
992 if (parent_node) 989 if (parent_node)
993 node->node_and_ancestors_have_only_integer_translation = 990 node->node_and_ancestors_have_only_integer_translation =
994 node->node_and_ancestors_have_only_integer_translation && 991 node->node_and_ancestors_have_only_integer_translation &&
995 parent_node->node_and_ancestors_have_only_integer_translation; 992 parent_node->node_and_ancestors_have_only_integer_translation;
996 } 993 }
997 994
998 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { 995 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) {
999 if (size() < 2) 996 if (size() < 2)
1000 return; 997 return;
1001 ClipNode* node = Node(1); 998 ClipNode* node = Node(ClipTree::kViewportNodeId);
1002 if (viewport_rect == node->clip) 999 if (viewport_rect == node->clip)
1003 return; 1000 return;
1004 node->clip = viewport_rect; 1001 node->clip = viewport_rect;
1005 set_needs_update(true); 1002 set_needs_update(true);
1006 } 1003 }
1007 1004
1008 gfx::RectF ClipTree::ViewportClip() { 1005 gfx::RectF ClipTree::ViewportClip() {
1009 const unsigned long min_size = 1; 1006 const unsigned long min_size = 1;
1010 DCHECK_GT(size(), min_size); 1007 DCHECK_GT(size(), min_size);
1011 return Node(1)->clip; 1008 return Node(ClipTree::kViewportNodeId)->clip;
1012 } 1009 }
1013 1010
1014 bool ClipTree::operator==(const ClipTree& other) const { 1011 bool ClipTree::operator==(const ClipTree& other) const {
1015 return PropertyTree::operator==(other); 1012 return PropertyTree::operator==(other);
1016 } 1013 }
1017 1014
1018 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { 1015 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const {
1019 DCHECK(!proto->has_property_type()); 1016 DCHECK(!proto->has_property_type());
1020 proto->set_property_type(proto::PropertyTree::Clip); 1017 proto->set_property_type(proto::PropertyTree::Clip);
1021 1018
1022 PropertyTree::ToProtobuf(proto); 1019 PropertyTree::ToProtobuf(proto);
1023 } 1020 }
1024 1021
1025 void ClipTree::FromProtobuf( 1022 void ClipTree::FromProtobuf(
1026 const proto::PropertyTree& proto, 1023 const proto::PropertyTree& proto,
1027 std::unordered_map<int, int>* node_id_to_index_map) { 1024 std::unordered_map<int, int>* node_id_to_index_map) {
1028 DCHECK(proto.has_property_type()); 1025 DCHECK(proto.has_property_type());
1029 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip); 1026 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip);
1027 // Verify that the property tree is empty.
1028 DCHECK_EQ(static_cast<int>(size()), ClipTree::kRootNodeId);
1030 1029
1031 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1030 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1032 } 1031 }
1033 1032
1034 EffectTree& EffectTree::operator=(const EffectTree& from) { 1033 EffectTree& EffectTree::operator=(const EffectTree& from) {
1035 PropertyTree::operator=(from); 1034 PropertyTree::operator=(from);
1036 mask_replica_layer_ids_ = from.mask_replica_layer_ids_; 1035 mask_replica_layer_ids_ = from.mask_replica_layer_ids_;
1037 // copy_requests_ are omitted here, since these need to be moved rather 1036 // copy_requests_ are omitted here, since these need to be moved rather
1038 // than copied or assigned. 1037 // than copied or assigned.
1039 return *this; 1038 return *this;
(...skipping 13 matching lines...) Expand all
1053 1052
1054 for (auto i : mask_replica_layer_ids_) 1053 for (auto i : mask_replica_layer_ids_)
1055 data->add_mask_replica_layer_ids(i); 1054 data->add_mask_replica_layer_ids(i);
1056 } 1055 }
1057 1056
1058 void EffectTree::FromProtobuf( 1057 void EffectTree::FromProtobuf(
1059 const proto::PropertyTree& proto, 1058 const proto::PropertyTree& proto,
1060 std::unordered_map<int, int>* node_id_to_index_map) { 1059 std::unordered_map<int, int>* node_id_to_index_map) {
1061 DCHECK(proto.has_property_type()); 1060 DCHECK(proto.has_property_type());
1062 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); 1061 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect);
1062 // Verify that the property tree is empty.
1063 DCHECK_EQ(static_cast<int>(size()), EffectTree::kRootNodeId);
1063 1064
1064 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1065 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1065 const proto::EffectTreeData& data = proto.effect_tree_data(); 1066 const proto::EffectTreeData& data = proto.effect_tree_data();
1066 1067
1067 DCHECK(mask_replica_layer_ids_.empty()); 1068 DCHECK(mask_replica_layer_ids_.empty());
1068 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { 1069 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) {
1069 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); 1070 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i));
1070 } 1071 }
1071 } 1072 }
1072 1073
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 entry->set_layer_id(i.first); 1129 entry->set_layer_id(i.first);
1129 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); 1130 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset());
1130 } 1131 }
1131 } 1132 }
1132 1133
1133 void ScrollTree::FromProtobuf( 1134 void ScrollTree::FromProtobuf(
1134 const proto::PropertyTree& proto, 1135 const proto::PropertyTree& proto,
1135 std::unordered_map<int, int>* node_id_to_index_map) { 1136 std::unordered_map<int, int>* node_id_to_index_map) {
1136 DCHECK(proto.has_property_type()); 1137 DCHECK(proto.has_property_type());
1137 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1138 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1139 // Verify that the property tree is empty.
1140 DCHECK_EQ(static_cast<int>(size()), ScrollTree::kRootNodeId);
1138 1141
1139 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1142 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1140 const proto::ScrollTreeData& data = proto.scroll_tree_data(); 1143 const proto::ScrollTreeData& data = proto.scroll_tree_data();
1141 1144
1142 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); 1145 currently_scrolling_node_id_ = data.currently_scrolling_node_id();
1143 1146
1144 // TODO(khushalsagar): This should probably be removed if the copy constructor 1147 // TODO(khushalsagar): This should probably be removed if the copy constructor
1145 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. 1148 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well.
1146 layer_id_to_scroll_offset_map_.clear(); 1149 layer_id_to_scroll_offset_map_.clear();
1147 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { 1150 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) {
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
1487 non_root_surfaces_enabled(true), 1490 non_root_surfaces_enabled(true),
1488 changed(false), 1491 changed(false),
1489 full_tree_damaged(false), 1492 full_tree_damaged(false),
1490 sequence_number(0), 1493 sequence_number(0),
1491 is_main_thread(true), 1494 is_main_thread(true),
1492 is_active(false) { 1495 is_active(false) {
1493 transform_tree.SetPropertyTrees(this); 1496 transform_tree.SetPropertyTrees(this);
1494 effect_tree.SetPropertyTrees(this); 1497 effect_tree.SetPropertyTrees(this);
1495 clip_tree.SetPropertyTrees(this); 1498 clip_tree.SetPropertyTrees(this);
1496 scroll_tree.SetPropertyTrees(this); 1499 scroll_tree.SetPropertyTrees(this);
1500 transform_id_to_index_map[Layer::INVALID_ID] = TransformTree::kDeviceNodeId;
1497 } 1501 }
1498 1502
1499 PropertyTrees::~PropertyTrees() {} 1503 PropertyTrees::~PropertyTrees() {}
1500 1504
1501 bool PropertyTrees::operator==(const PropertyTrees& other) const { 1505 bool PropertyTrees::operator==(const PropertyTrees& other) const {
1502 return transform_tree == other.transform_tree && 1506 return transform_tree == other.transform_tree &&
1503 effect_tree == other.effect_tree && clip_tree == other.clip_tree && 1507 effect_tree == other.effect_tree && clip_tree == other.clip_tree &&
1504 scroll_tree == other.scroll_tree && 1508 scroll_tree == other.scroll_tree &&
1505 transform_id_to_index_map == other.transform_id_to_index_map && 1509 transform_id_to_index_map == other.transform_id_to_index_map &&
1506 effect_id_to_index_map == other.effect_id_to_index_map && 1510 effect_id_to_index_map == other.effect_id_to_index_map &&
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1654 id_to_index_map = &clip_id_to_index_map; 1658 id_to_index_map = &clip_id_to_index_map;
1655 break; 1659 break;
1656 case SCROLL: 1660 case SCROLL:
1657 id_to_index_map = &scroll_id_to_index_map; 1661 id_to_index_map = &scroll_id_to_index_map;
1658 break; 1662 break;
1659 } 1663 }
1660 return id_to_index_map->find(id) != id_to_index_map->end(); 1664 return id_to_index_map->find(id) != id_to_index_map->end();
1661 } 1665 }
1662 1666
1663 void PropertyTrees::UpdateChangeTracking() { 1667 void PropertyTrees::UpdateChangeTracking() {
1664 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { 1668 for (int id = EffectTree::kRootNodeId;
1669 id < static_cast<int>(effect_tree.size()); ++id) {
1665 EffectNode* node = effect_tree.Node(id); 1670 EffectNode* node = effect_tree.Node(id);
1666 EffectNode* parent_node = effect_tree.parent(node); 1671 EffectNode* parent_node = effect_tree.parent(node);
1667 effect_tree.UpdateEffectChanged(node, parent_node); 1672 effect_tree.UpdateEffectChanged(node, parent_node);
1668 } 1673 }
1669 for (int i = 1; i < static_cast<int>(transform_tree.size()); ++i) { 1674 for (int i = TransformTree::kRootNodeId;
1675 i < static_cast<int>(transform_tree.size()); ++i) {
1670 TransformNode* node = transform_tree.Node(i); 1676 TransformNode* node = transform_tree.Node(i);
1671 TransformNode* parent_node = transform_tree.parent(node); 1677 TransformNode* parent_node = transform_tree.parent(node);
1672 TransformNode* source_node = transform_tree.Node(node->source_node_id); 1678 TransformNode* source_node = transform_tree.Node(node->source_node_id);
1673 transform_tree.UpdateTransformChanged(node, parent_node, source_node); 1679 transform_tree.UpdateTransformChanged(node, parent_node, source_node);
1674 } 1680 }
1675 } 1681 }
1676 1682
1677 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { 1683 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) {
1678 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { 1684 for (int id = EffectTree::kRootNodeId;
1685 id < static_cast<int>(effect_tree.size()); ++id) {
1679 EffectNode* node = effect_tree.Node(id); 1686 EffectNode* node = effect_tree.Node(id);
1680 if (node->effect_changed) { 1687 if (node->effect_changed) {
1681 EffectNode* target_node = tree->effect_tree.Node(node->id); 1688 EffectNode* target_node = tree->effect_tree.Node(node->id);
1682 target_node->effect_changed = true; 1689 target_node->effect_changed = true;
1683 } 1690 }
1684 } 1691 }
1685 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { 1692 for (int id = TransformTree::kRootNodeId;
1693 id < static_cast<int>(transform_tree.size()); ++id) {
1686 TransformNode* node = transform_tree.Node(id); 1694 TransformNode* node = transform_tree.Node(id);
1687 if (node->transform_changed) { 1695 if (node->transform_changed) {
1688 TransformNode* target_node = tree->transform_tree.Node(node->id); 1696 TransformNode* target_node = tree->transform_tree.Node(node->id);
1689 target_node->transform_changed = true; 1697 target_node->transform_changed = true;
1690 } 1698 }
1691 } 1699 }
1692 // Ensure that change tracking is updated even if property trees don't have 1700 // Ensure that change tracking is updated even if property trees don't have
1693 // other reasons to get updated. 1701 // other reasons to get updated.
1694 tree->UpdateChangeTracking(); 1702 tree->UpdateChangeTracking();
1695 tree->full_tree_damaged = full_tree_damaged; 1703 tree->full_tree_damaged = full_tree_damaged;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 cached_data_.property_tree_update_number = 0; 1892 cached_data_.property_tree_update_number = 0;
1885 cached_data_.animation_scales = std::vector<AnimationScaleData>( 1893 cached_data_.animation_scales = std::vector<AnimationScaleData>(
1886 transform_tree.nodes().size(), AnimationScaleData()); 1894 transform_tree.nodes().size(), AnimationScaleData());
1887 } 1895 }
1888 1896
1889 void PropertyTrees::UpdateCachedNumber() { 1897 void PropertyTrees::UpdateCachedNumber() {
1890 cached_data_.property_tree_update_number++; 1898 cached_data_.property_tree_update_number++;
1891 } 1899 }
1892 1900
1893 } // namespace cc 1901 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698