| 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 |