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 <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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |