Chromium Code Reviews| 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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 } | 59 } |
| 60 | 60 |
| 61 template struct TreeNode<TransformNodeData>; | 61 template struct TreeNode<TransformNodeData>; |
| 62 template struct TreeNode<ClipNodeData>; | 62 template struct TreeNode<ClipNodeData>; |
| 63 template struct TreeNode<EffectNodeData>; | 63 template struct TreeNode<EffectNodeData>; |
| 64 template struct TreeNode<ScrollNodeData>; | 64 template struct TreeNode<ScrollNodeData>; |
| 65 | 65 |
| 66 template <typename T> | 66 template <typename T> |
| 67 PropertyTree<T>::PropertyTree() | 67 PropertyTree<T>::PropertyTree() |
| 68 : needs_update_(false) { | 68 : needs_update_(false) { |
| 69 nodes_.push_back(T()); | |
| 70 back()->id = 0; | |
| 71 back()->parent_id = -1; | |
| 72 } | 69 } |
| 73 | 70 |
| 74 template <typename T> | 71 template <typename T> |
| 75 PropertyTree<T>::~PropertyTree() { | 72 PropertyTree<T>::~PropertyTree() { |
| 76 } | 73 } |
| 77 | 74 |
| 78 TransformTree::TransformTree() | 75 TransformTree::TransformTree() |
| 79 : source_to_parent_updates_allowed_(true), | 76 : source_to_parent_updates_allowed_(true), |
| 80 page_scale_factor_(1.f), | 77 page_scale_factor_(1.f), |
| 81 device_scale_factor_(1.f), | 78 device_scale_factor_(1.f), |
| 82 device_transform_scale_factor_(1.f) { | 79 device_transform_scale_factor_(1.f) { |
| 83 cached_data_.push_back(TransformCachedNodeData()); | 80 Insert(TreeNode<TransformNodeData>(), kInvalidNodeId); |
| 84 } | 81 } |
| 85 | 82 |
| 86 TransformTree::~TransformTree() { | 83 TransformTree::~TransformTree() { |
| 87 } | 84 } |
| 88 | 85 |
| 89 template <typename T> | 86 template <typename T> |
| 90 int PropertyTree<T>::Insert(const T& tree_node, int parent_id) { | 87 int PropertyTree<T>::Insert(const T& tree_node, int parent_id) { |
| 91 DCHECK_GT(nodes_.size(), 0u); | 88 if (nodes_.size() == 0u) |
| 89 DCHECK_EQ(parent_id, kInvalidNodeId) << "size" << nodes_.size() | |
| 90 << "parentid" << parent_id; | |
| 92 nodes_.push_back(tree_node); | 91 nodes_.push_back(tree_node); |
| 93 T& node = nodes_.back(); | 92 T& node = nodes_.back(); |
| 94 node.parent_id = parent_id; | 93 node.parent_id = parent_id; |
| 95 node.id = static_cast<int>(nodes_.size()) - 1; | 94 node.id = static_cast<int>(nodes_.size()) - 1; |
| 96 return node.id; | 95 return node.id; |
| 97 } | 96 } |
| 98 | 97 |
| 99 template <typename T> | 98 template <typename T> |
| 100 void PropertyTree<T>::clear() { | 99 void PropertyTree<T>::clear() { |
| 101 nodes_.clear(); | 100 nodes_.clear(); |
| 102 nodes_.push_back(T()); | |
| 103 back()->id = 0; | |
| 104 back()->parent_id = -1; | |
| 105 } | 101 } |
| 106 | 102 |
| 107 template <typename T> | 103 template <typename T> |
| 108 bool PropertyTree<T>::operator==(const PropertyTree<T>& other) const { | 104 bool PropertyTree<T>::operator==(const PropertyTree<T>& other) const { |
| 109 return nodes_ == other.nodes() && needs_update_ == other.needs_update(); | 105 return nodes_ == other.nodes() && needs_update_ == other.needs_update(); |
| 110 } | 106 } |
| 111 | 107 |
| 112 template <typename T> | 108 template <typename T> |
| 113 void PropertyTree<T>::ToProtobuf(proto::PropertyTree* proto) const { | 109 void PropertyTree<T>::ToProtobuf(proto::PropertyTree* proto) const { |
| 114 DCHECK_EQ(0, proto->nodes_size()); | 110 DCHECK_EQ(0, proto->nodes_size()); |
| 115 for (const auto& node : nodes_) | 111 for (const auto& node : nodes_) |
| 116 node.ToProtobuf(proto->add_nodes()); | 112 node.ToProtobuf(proto->add_nodes()); |
| 117 proto->set_needs_update(needs_update_); | 113 proto->set_needs_update(needs_update_); |
| 118 } | 114 } |
| 119 | 115 |
| 120 template <typename T> | 116 template <typename T> |
| 121 void PropertyTree<T>::FromProtobuf( | 117 void PropertyTree<T>::FromProtobuf( |
| 122 const proto::PropertyTree& proto, | 118 const proto::PropertyTree& proto, |
| 123 std::unordered_map<int, int>* node_id_to_index_map) { | 119 std::unordered_map<int, int>* node_id_to_index_map) { |
| 124 // Verify that the property tree is empty. | 120 // Add the first node. |
|
ajuma
2016/06/22 13:29:51
I think this comment is obsolete now.
| |
| 125 DCHECK_EQ(static_cast<int>(nodes_.size()), 1); | 121 DCHECK_GE(proto.nodes_size(), 0); |
| 126 DCHECK_EQ(back()->id, 0); | 122 nodes_.clear(); |
| 127 DCHECK_EQ(back()->parent_id, -1); | |
| 128 | 123 |
| 129 // Add the first node. | 124 node_id_to_index_map->clear(); |
| 130 DCHECK_GT(proto.nodes_size(), 0); | 125 for (int i = 0; i < proto.nodes_size(); ++i) { |
| 131 nodes_.back().FromProtobuf(proto.nodes(0)); | |
| 132 | |
| 133 DCHECK(!node_id_to_index_map || (*node_id_to_index_map).empty()); | |
| 134 for (int i = 1; i < proto.nodes_size(); ++i) { | |
| 135 nodes_.push_back(T()); | 126 nodes_.push_back(T()); |
| 136 nodes_.back().FromProtobuf(proto.nodes(i)); | 127 nodes_.back().FromProtobuf(proto.nodes(i)); |
| 137 (*node_id_to_index_map)[nodes_.back().owner_id] = nodes_.back().id; | 128 (*node_id_to_index_map)[nodes_.back().owner_id] = nodes_.back().id; |
| 138 } | 129 } |
| 139 | 130 |
| 140 needs_update_ = proto.needs_update(); | 131 needs_update_ = proto.needs_update(); |
| 141 } | 132 } |
| 142 | 133 |
| 143 template <typename T> | 134 template <typename T> |
| 144 void PropertyTree<T>::AsValueInto(base::trace_event::TracedValue* value) const { | 135 void PropertyTree<T>::AsValueInto(base::trace_event::TracedValue* value) const { |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 MathUtil::AddToTracedValue("local", local, value); | 379 MathUtil::AddToTracedValue("local", local, value); |
| 389 MathUtil::AddToTracedValue("post_local", post_local, value); | 380 MathUtil::AddToTracedValue("post_local", post_local, value); |
| 390 // TODO(sunxd): make frameviewer work without target_id | 381 // TODO(sunxd): make frameviewer work without target_id |
| 391 value->SetInteger("target_id", 0); | 382 value->SetInteger("target_id", 0); |
| 392 value->SetInteger("content_target_id", 0); | 383 value->SetInteger("content_target_id", 0); |
| 393 value->SetInteger("source_node_id", source_node_id); | 384 value->SetInteger("source_node_id", source_node_id); |
| 394 value->SetInteger("sorting_context_id", sorting_context_id); | 385 value->SetInteger("sorting_context_id", sorting_context_id); |
| 395 } | 386 } |
| 396 | 387 |
| 397 TransformCachedNodeData::TransformCachedNodeData() | 388 TransformCachedNodeData::TransformCachedNodeData() |
| 398 : target_id(-1), content_target_id(-1) {} | 389 : target_id(TransformTree::kDeviceNodeId), |
| 390 content_target_id(TransformTree::kDeviceNodeId) {} | |
| 399 | 391 |
| 400 TransformCachedNodeData::TransformCachedNodeData( | 392 TransformCachedNodeData::TransformCachedNodeData( |
| 401 const TransformCachedNodeData& other) = default; | 393 const TransformCachedNodeData& other) = default; |
| 402 | 394 |
| 403 TransformCachedNodeData::~TransformCachedNodeData() {} | 395 TransformCachedNodeData::~TransformCachedNodeData() {} |
| 404 | 396 |
| 405 bool TransformCachedNodeData::operator==( | 397 bool TransformCachedNodeData::operator==( |
| 406 const TransformCachedNodeData& other) const { | 398 const TransformCachedNodeData& other) const { |
| 407 return from_target == other.from_target && to_target == other.to_target && | 399 return from_target == other.from_target && to_target == other.to_target && |
| 408 from_screen == other.from_screen && to_screen == other.to_screen && | 400 from_screen == other.from_screen && to_screen == other.to_screen && |
| 409 target_id == other.target_id && | 401 target_id == other.target_id && |
| 410 content_target_id == other.content_target_id; | 402 content_target_id == other.content_target_id; |
| 411 } | 403 } |
| 412 | 404 |
| 413 void TransformCachedNodeData::ToProtobuf( | 405 void TransformCachedNodeData::ToProtobuf( |
| 414 proto::TransformCachedNodeData* proto) const { | 406 proto::TransformCachedNodeData* proto) const { |
| 415 TransformToProto(from_target, proto->mutable_from_target()); | 407 TransformToProto(from_target, proto->mutable_from_target()); |
| 416 TransformToProto(to_target, proto->mutable_to_target()); | 408 TransformToProto(to_target, proto->mutable_to_target()); |
| 417 TransformToProto(from_screen, proto->mutable_from_screen()); | 409 TransformToProto(from_screen, proto->mutable_from_screen()); |
| 418 TransformToProto(to_screen, proto->mutable_to_screen()); | 410 TransformToProto(to_screen, proto->mutable_to_screen()); |
| 411 DCHECK(target_id >= 0) << target_id; | |
| 419 proto->set_target_id(target_id); | 412 proto->set_target_id(target_id); |
| 420 proto->set_content_target_id(content_target_id); | 413 proto->set_content_target_id(content_target_id); |
| 421 } | 414 } |
| 422 | 415 |
| 423 void TransformCachedNodeData::FromProtobuf( | 416 void TransformCachedNodeData::FromProtobuf( |
| 424 const proto::TransformCachedNodeData& proto) { | 417 const proto::TransformCachedNodeData& proto) { |
| 425 from_target = ProtoToTransform(proto.from_target()); | 418 from_target = ProtoToTransform(proto.from_target()); |
| 426 to_target = ProtoToTransform(proto.to_target()); | 419 to_target = ProtoToTransform(proto.to_target()); |
| 427 from_screen = ProtoToTransform(proto.from_screen()); | 420 from_screen = ProtoToTransform(proto.from_screen()); |
| 428 to_screen = ProtoToTransform(proto.to_screen()); | 421 to_screen = ProtoToTransform(proto.to_screen()); |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 720 offset_to_transform_parent, value); | 713 offset_to_transform_parent, value); |
| 721 value->SetBoolean("should_flatten", should_flatten); | 714 value->SetBoolean("should_flatten", should_flatten); |
| 722 value->SetBoolean("user_scrollable_horizontal", user_scrollable_horizontal); | 715 value->SetBoolean("user_scrollable_horizontal", user_scrollable_horizontal); |
| 723 value->SetBoolean("user_scrollable_vertical", user_scrollable_vertical); | 716 value->SetBoolean("user_scrollable_vertical", user_scrollable_vertical); |
| 724 value->SetInteger("element_id", element_id); | 717 value->SetInteger("element_id", element_id); |
| 725 value->SetInteger("transform_id", transform_id); | 718 value->SetInteger("transform_id", transform_id); |
| 726 } | 719 } |
| 727 | 720 |
| 728 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) { | 721 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) { |
| 729 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id); | 722 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id); |
| 730 DCHECK_EQ(node_id, static_cast<int>(cached_data_.size())); | 723 cached_data_.push_back(TransformCachedNodeData()); |
| 724 DCHECK_EQ(size(), cached_data_.size()); | |
| 731 | 725 |
| 732 cached_data_.push_back(TransformCachedNodeData()); | |
| 733 return node_id; | 726 return node_id; |
| 734 } | 727 } |
| 735 | 728 |
| 736 void TransformTree::clear() { | 729 void TransformTree::clear() { |
| 737 PropertyTree<TransformNode>::clear(); | 730 PropertyTree<TransformNode>::clear(); |
| 738 | 731 |
| 739 nodes_affected_by_inner_viewport_bounds_delta_.clear(); | 732 nodes_affected_by_inner_viewport_bounds_delta_.clear(); |
| 740 nodes_affected_by_outer_viewport_bounds_delta_.clear(); | 733 nodes_affected_by_outer_viewport_bounds_delta_.clear(); |
| 741 cached_data_.clear(); | 734 cached_data_.clear(); |
| 742 cached_data_.push_back(TransformCachedNodeData()); | 735 Insert(TransformNode(), TransformTree::kInvalidNodeId); |
| 743 } | 736 } |
| 744 | 737 |
| 745 bool TransformTree::ComputeTransform(int source_id, | 738 bool TransformTree::ComputeTransform(int source_id, |
| 746 int dest_id, | 739 int dest_id, |
| 747 gfx::Transform* transform) const { | 740 gfx::Transform* transform) const { |
| 748 transform->MakeIdentity(); | 741 transform->MakeIdentity(); |
| 749 | 742 |
| 750 if (source_id == dest_id) | 743 if (source_id == dest_id) |
| 751 return true; | 744 return true; |
| 752 | 745 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 796 return ComputeTransform(source_id, dest_id, &transform) && | 789 return ComputeTransform(source_id, dest_id, &transform) && |
| 797 transform.Preserves2dAxisAlignment(); | 790 transform.Preserves2dAxisAlignment(); |
| 798 } | 791 } |
| 799 | 792 |
| 800 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { | 793 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { |
| 801 return (source_to_parent_updates_allowed() && | 794 return (source_to_parent_updates_allowed() && |
| 802 node->parent_id != node->data.source_node_id); | 795 node->parent_id != node->data.source_node_id); |
| 803 } | 796 } |
| 804 | 797 |
| 805 void TransformTree::ResetChangeTracking() { | 798 void TransformTree::ResetChangeTracking() { |
| 806 for (int id = 1; id < static_cast<int>(size()); ++id) { | 799 for (int id = TransformTree::kDeviceNodeId; id < static_cast<int>(size()); |
| 800 ++id) { | |
| 807 TransformNode* node = Node(id); | 801 TransformNode* node = Node(id); |
| 808 node->data.transform_changed = false; | 802 node->data.transform_changed = false; |
| 809 } | 803 } |
| 810 } | 804 } |
| 811 | 805 |
| 812 void TransformTree::UpdateTransforms(int id) { | 806 void TransformTree::UpdateTransforms(int id) { |
| 813 TransformNode* node = Node(id); | 807 TransformNode* node = Node(id); |
| 814 TransformNode* parent_node = parent(node); | 808 TransformNode* parent_node = parent(node); |
| 815 TransformNode* target_node = Node(TargetId(id)); | 809 TransformNode* target_node = Node(TargetId(id)); |
| 816 TransformNode* source_node = Node(node->data.source_node_id); | 810 TransformNode* source_node = Node(node->data.source_node_id); |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1033 float layer_scale_factor = | 1027 float layer_scale_factor = |
| 1034 device_scale_factor_ * device_transform_scale_factor_; | 1028 device_scale_factor_ * device_transform_scale_factor_; |
| 1035 if (node->data.in_subtree_of_page_scale_layer) | 1029 if (node->data.in_subtree_of_page_scale_layer) |
| 1036 layer_scale_factor *= page_scale_factor_; | 1030 layer_scale_factor *= page_scale_factor_; |
| 1037 node->data.sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( | 1031 node->data.sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( |
| 1038 ToScreen(node->id), layer_scale_factor); | 1032 ToScreen(node->id), layer_scale_factor); |
| 1039 } | 1033 } |
| 1040 | 1034 |
| 1041 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, | 1035 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, |
| 1042 TransformNode* target_node) { | 1036 TransformNode* target_node) { |
| 1037 DCHECK(node); | |
| 1038 DCHECK(target_node); | |
| 1043 gfx::Transform target_space_transform; | 1039 gfx::Transform target_space_transform; |
| 1044 if (node->data.needs_sublayer_scale) { | 1040 if (node->data.needs_sublayer_scale) { |
| 1045 target_space_transform.MakeIdentity(); | 1041 target_space_transform.MakeIdentity(); |
| 1046 target_space_transform.Scale(node->data.sublayer_scale.x(), | 1042 target_space_transform.Scale(node->data.sublayer_scale.x(), |
| 1047 node->data.sublayer_scale.y()); | 1043 node->data.sublayer_scale.y()); |
| 1048 } else { | 1044 } else { |
| 1049 // In order to include the root transform for the root surface, we walk up | 1045 // In order to include the root transform for the root surface, we walk up |
| 1050 // to the root of the transform tree in ComputeTransform. | 1046 // to the root of the transform tree in ComputeTransform. |
| 1051 int target_id = target_node->id; | 1047 int target_id = target_node->id; |
| 1052 ComputeTransformWithDestinationSublayerScale(node->id, target_id, | 1048 ComputeTransformWithDestinationSublayerScale(node->id, target_id, |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1228 if (!node->data.ancestors_are_invertible && | 1224 if (!node->data.ancestors_are_invertible && |
| 1229 parent_node->data.ancestors_are_invertible) | 1225 parent_node->data.ancestors_are_invertible) |
| 1230 is_invertible = false; | 1226 is_invertible = false; |
| 1231 node->data.node_and_ancestors_are_animated_or_invertible = | 1227 node->data.node_and_ancestors_are_animated_or_invertible = |
| 1232 node->data.has_potential_animation || is_invertible; | 1228 node->data.has_potential_animation || is_invertible; |
| 1233 } | 1229 } |
| 1234 | 1230 |
| 1235 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, | 1231 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, |
| 1236 gfx::PointF root_position) { | 1232 gfx::PointF root_position) { |
| 1237 gfx::Transform root_post_local = transform; | 1233 gfx::Transform root_post_local = transform; |
| 1238 TransformNode* node = Node(1); | 1234 TransformNode* node = Node(TransformTree::kRootNodeId); |
| 1239 root_post_local.Scale(node->data.post_local_scale_factor, | 1235 root_post_local.Scale(node->data.post_local_scale_factor, |
| 1240 node->data.post_local_scale_factor); | 1236 node->data.post_local_scale_factor); |
| 1241 root_post_local.Translate(root_position.x(), root_position.y()); | 1237 root_post_local.Translate(root_position.x(), root_position.y()); |
| 1242 if (node->data.post_local == root_post_local) | 1238 if (node->data.post_local == root_post_local) |
| 1243 return; | 1239 return; |
| 1244 | 1240 |
| 1245 node->data.post_local = root_post_local; | 1241 node->data.post_local = root_post_local; |
| 1246 node->data.needs_local_transform_update = true; | 1242 node->data.needs_local_transform_update = true; |
| 1247 set_needs_update(true); | 1243 set_needs_update(true); |
| 1248 } | 1244 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 DCHECK(static_cast<int>(cached_data_.size()) > node_id); | 1329 DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| 1334 cached_data_[node_id].to_screen = transform; | 1330 cached_data_[node_id].to_screen = transform; |
| 1335 } | 1331 } |
| 1336 | 1332 |
| 1337 int TransformTree::TargetId(int node_id) const { | 1333 int TransformTree::TargetId(int node_id) const { |
| 1338 DCHECK(static_cast<int>(cached_data_.size()) > node_id); | 1334 DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| 1339 return cached_data_[node_id].target_id; | 1335 return cached_data_[node_id].target_id; |
| 1340 } | 1336 } |
| 1341 | 1337 |
| 1342 void TransformTree::SetTargetId(int node_id, int target_id) { | 1338 void TransformTree::SetTargetId(int node_id, int target_id) { |
| 1343 DCHECK(static_cast<int>(cached_data_.size()) > node_id); | 1339 DCHECK(static_cast<int>(cached_data_.size()) > node_id) << node_id; |
| 1340 DCHECK(static_cast<int>(size()) > target_id) << target_id << " v.s. " | |
|
ajuma
2016/06/22 13:29:51
These can be DCHECK_GE (and then we get a readable
| |
| 1341 << size(); | |
| 1342 DCHECK_GE(target_id, TransformTree::kDeviceNodeId) << target_id; | |
| 1343 DCHECK_LE(target_id, node_id) << target_id << " v.s. " << node_id; | |
|
ajuma
2016/06/22 13:29:50
No need to include the error message here since DC
| |
| 1344 cached_data_[node_id].target_id = target_id; | 1344 cached_data_[node_id].target_id = target_id; |
| 1345 } | 1345 } |
| 1346 | 1346 |
| 1347 int TransformTree::ContentTargetId(int node_id) const { | 1347 int TransformTree::ContentTargetId(int node_id) const { |
| 1348 DCHECK(static_cast<int>(cached_data_.size()) > node_id); | 1348 DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| 1349 return cached_data_[node_id].content_target_id; | 1349 return cached_data_[node_id].content_target_id; |
| 1350 } | 1350 } |
| 1351 | 1351 |
| 1352 void TransformTree::SetContentTargetId(int node_id, int content_target_id) { | 1352 void TransformTree::SetContentTargetId(int node_id, int content_target_id) { |
| 1353 DCHECK(static_cast<int>(cached_data_.size()) > node_id); | 1353 DCHECK(static_cast<int>(cached_data_.size()) > node_id); |
| 1354 cached_data_[node_id].content_target_id = content_target_id; | 1354 cached_data_[node_id].content_target_id = content_target_id; |
| 1355 } | 1355 } |
| 1356 | 1356 |
| 1357 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( | 1357 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( |
| 1358 int id) const { | 1358 int id) const { |
| 1359 DCHECK_GT(id, 0); | 1359 DCHECK_GE(id, TransformTree::kRootNodeId); |
| 1360 if (id == 1) { | 1360 if (id == TransformTree::kRootNodeId) { |
| 1361 return gfx::Transform(); | 1361 return gfx::Transform(); |
| 1362 } | 1362 } |
| 1363 const TransformNode* node = Node(id); | 1363 const TransformNode* node = Node(id); |
| 1364 gfx::Transform screen_space_transform = ToScreen(id); | 1364 gfx::Transform screen_space_transform = ToScreen(id); |
| 1365 if (node->data.sublayer_scale.x() != 0.0 && | 1365 if (node->data.sublayer_scale.x() != 0.0 && |
| 1366 node->data.sublayer_scale.y() != 0.0) | 1366 node->data.sublayer_scale.y() != 0.0) |
| 1367 screen_space_transform.Scale(1.0 / node->data.sublayer_scale.x(), | 1367 screen_space_transform.Scale(1.0 / node->data.sublayer_scale.x(), |
| 1368 1.0 / node->data.sublayer_scale.y()); | 1368 1.0 / node->data.sublayer_scale.y()); |
| 1369 return screen_space_transform; | 1369 return screen_space_transform; |
| 1370 } | 1370 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1404 | 1404 |
| 1405 for (int i = 0; i < static_cast<int>(cached_data_.size()); ++i) | 1405 for (int i = 0; i < static_cast<int>(cached_data_.size()); ++i) |
| 1406 cached_data_[i].ToProtobuf(data->add_cached_data()); | 1406 cached_data_[i].ToProtobuf(data->add_cached_data()); |
| 1407 } | 1407 } |
| 1408 | 1408 |
| 1409 void TransformTree::FromProtobuf( | 1409 void TransformTree::FromProtobuf( |
| 1410 const proto::PropertyTree& proto, | 1410 const proto::PropertyTree& proto, |
| 1411 std::unordered_map<int, int>* node_id_to_index_map) { | 1411 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1412 DCHECK(proto.has_property_type()); | 1412 DCHECK(proto.has_property_type()); |
| 1413 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); | 1413 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); |
| 1414 // Verify that the property tree is empty. | |
| 1415 DCHECK_EQ(static_cast<int>(size()), TransformTree::kRootNodeId); | |
| 1414 | 1416 |
| 1415 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1417 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1416 const proto::TransformTreeData& data = proto.transform_tree_data(); | 1418 const proto::TransformTreeData& data = proto.transform_tree_data(); |
| 1417 | 1419 |
| 1418 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); | 1420 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); |
| 1419 page_scale_factor_ = data.page_scale_factor(); | 1421 page_scale_factor_ = data.page_scale_factor(); |
| 1420 device_scale_factor_ = data.device_scale_factor(); | 1422 device_scale_factor_ = data.device_scale_factor(); |
| 1421 device_transform_scale_factor_ = data.device_transform_scale_factor(); | 1423 device_transform_scale_factor_ = data.device_transform_scale_factor(); |
| 1422 | 1424 |
| 1423 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty()); | 1425 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty()); |
| 1424 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size(); | 1426 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size(); |
| 1425 ++i) { | 1427 ++i) { |
| 1426 nodes_affected_by_inner_viewport_bounds_delta_.push_back( | 1428 nodes_affected_by_inner_viewport_bounds_delta_.push_back( |
| 1427 data.nodes_affected_by_inner_viewport_bounds_delta(i)); | 1429 data.nodes_affected_by_inner_viewport_bounds_delta(i)); |
| 1428 } | 1430 } |
| 1429 | 1431 |
| 1430 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); | 1432 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); |
| 1431 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); | 1433 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); |
| 1432 ++i) { | 1434 ++i) { |
| 1433 nodes_affected_by_outer_viewport_bounds_delta_.push_back( | 1435 nodes_affected_by_outer_viewport_bounds_delta_.push_back( |
| 1434 data.nodes_affected_by_outer_viewport_bounds_delta(i)); | 1436 data.nodes_affected_by_outer_viewport_bounds_delta(i)); |
| 1435 } | 1437 } |
| 1436 | |
| 1437 DCHECK_EQ(static_cast<int>(cached_data_.size()), 1); | 1438 DCHECK_EQ(static_cast<int>(cached_data_.size()), 1); |
| 1438 cached_data_.back().FromProtobuf(data.cached_data(0)); | 1439 cached_data_.clear(); |
| 1439 for (int i = 1; i < data.cached_data_size(); ++i) { | 1440 // cached_data_.back().FromProtobuf(data.cached_data(0)); |
|
ajuma
2016/06/22 13:29:51
<_<
| |
| 1441 for (int i = 0; i < data.cached_data_size(); ++i) { | |
| 1440 cached_data_.push_back(TransformCachedNodeData()); | 1442 cached_data_.push_back(TransformCachedNodeData()); |
| 1441 cached_data_.back().FromProtobuf(data.cached_data(i)); | 1443 cached_data_.back().FromProtobuf(data.cached_data(i)); |
| 1442 } | 1444 } |
| 1443 } | 1445 } |
| 1444 | 1446 |
| 1445 EffectTree::EffectTree() {} | 1447 EffectTree::EffectTree() {} |
| 1446 | 1448 |
| 1447 EffectTree::~EffectTree() {} | 1449 EffectTree::~EffectTree() {} |
| 1448 | 1450 |
| 1449 void EffectTree::clear() { | 1451 void EffectTree::clear() { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1584 copy_requests_.erase(range.first, range.second); | 1586 copy_requests_.erase(range.first, range.second); |
| 1585 | 1587 |
| 1586 for (auto& it : *requests) { | 1588 for (auto& it : *requests) { |
| 1587 if (!it->has_area()) | 1589 if (!it->has_area()) |
| 1588 continue; | 1590 continue; |
| 1589 | 1591 |
| 1590 // The area needs to be transformed from the space of content that draws to | 1592 // The area needs to be transformed from the space of content that draws to |
| 1591 // the surface to the space of the surface itself. | 1593 // the surface to the space of the surface itself. |
| 1592 int destination_id = effect_node->data.transform_id; | 1594 int destination_id = effect_node->data.transform_id; |
| 1593 int source_id; | 1595 int source_id; |
| 1594 if (effect_node->parent_id != -1) { | 1596 if (effect_node->parent_id != EffectTree::kInvalidNodeId) { |
| 1595 // For non-root surfaces, transform only by sub-layer scale. | 1597 // For non-root surfaces, transform only by sub-layer scale. |
| 1596 source_id = destination_id; | 1598 source_id = destination_id; |
| 1597 } else { | 1599 } else { |
| 1598 // The root surface doesn't have the notion of sub-layer scale, but | 1600 // The root surface doesn't have the notion of sub-layer scale, but |
| 1599 // instead has a similar notion of transforming from the space of the root | 1601 // instead has a similar notion of transforming from the space of the root |
| 1600 // layer to the space of the screen. | 1602 // layer to the space of the screen. |
| 1601 DCHECK_EQ(0, destination_id); | 1603 DCHECK_EQ(0, destination_id); |
|
ajuma
2016/06/22 17:06:57
TransformTree::kDeviceNodeId
| |
| 1602 source_id = 1; | 1604 source_id = 1; |
|
ajuma
2016/06/22 17:06:57
TransformTree::kRootNodeId
| |
| 1603 } | 1605 } |
| 1604 gfx::Transform transform; | 1606 gfx::Transform transform; |
| 1605 property_trees() | 1607 property_trees() |
| 1606 ->transform_tree.ComputeTransformWithDestinationSublayerScale( | 1608 ->transform_tree.ComputeTransformWithDestinationSublayerScale( |
| 1607 source_id, destination_id, &transform); | 1609 source_id, destination_id, &transform); |
| 1608 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area())); | 1610 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area())); |
| 1609 } | 1611 } |
| 1610 } | 1612 } |
| 1611 | 1613 |
| 1612 bool EffectTree::HasCopyRequests() const { | 1614 bool EffectTree::HasCopyRequests() const { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1632 bool EffectTree::ContributesToDrawnSurface(int id) { | 1634 bool EffectTree::ContributesToDrawnSurface(int id) { |
| 1633 // All drawn nodes contribute to drawn surface. | 1635 // All drawn nodes contribute to drawn surface. |
| 1634 // Exception : Nodes that are hidden and are drawn only for the sake of | 1636 // Exception : Nodes that are hidden and are drawn only for the sake of |
| 1635 // copy requests. | 1637 // copy requests. |
| 1636 EffectNode* node = Node(id); | 1638 EffectNode* node = Node(id); |
| 1637 EffectNode* parent_node = parent(node); | 1639 EffectNode* parent_node = parent(node); |
| 1638 return node->data.is_drawn && (!parent_node || parent_node->data.is_drawn); | 1640 return node->data.is_drawn && (!parent_node || parent_node->data.is_drawn); |
| 1639 } | 1641 } |
| 1640 | 1642 |
| 1641 void EffectTree::ResetChangeTracking() { | 1643 void EffectTree::ResetChangeTracking() { |
| 1642 for (int id = 1; id < static_cast<int>(size()); ++id) { | 1644 for (int id = EffectTree::kRootNodeId; id < static_cast<int>(size()); ++id) { |
| 1643 EffectNode* node = Node(id); | 1645 EffectNode* node = Node(id); |
| 1644 node->data.effect_changed = false; | 1646 node->data.effect_changed = false; |
| 1645 } | 1647 } |
| 1646 } | 1648 } |
| 1647 | 1649 |
| 1648 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( | 1650 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( |
| 1649 TransformNode* node, | 1651 TransformNode* node, |
| 1650 TransformNode* parent_node) { | 1652 TransformNode* parent_node) { |
| 1651 node->data.node_and_ancestors_have_only_integer_translation = | 1653 node->data.node_and_ancestors_have_only_integer_translation = |
| 1652 node->data.to_parent.IsIdentityOrIntegerTranslation(); | 1654 node->data.to_parent.IsIdentityOrIntegerTranslation(); |
| 1653 if (parent_node) | 1655 if (parent_node) |
| 1654 node->data.node_and_ancestors_have_only_integer_translation = | 1656 node->data.node_and_ancestors_have_only_integer_translation = |
| 1655 node->data.node_and_ancestors_have_only_integer_translation && | 1657 node->data.node_and_ancestors_have_only_integer_translation && |
| 1656 parent_node->data.node_and_ancestors_have_only_integer_translation; | 1658 parent_node->data.node_and_ancestors_have_only_integer_translation; |
| 1657 } | 1659 } |
| 1658 | 1660 |
| 1659 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { | 1661 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { |
| 1660 if (size() < 2) | 1662 if (size() < 2) |
|
ajuma
2016/06/22 17:06:57
I think this should be 1 now that the viewport has
| |
| 1661 return; | 1663 return; |
| 1662 ClipNode* node = Node(1); | 1664 ClipNode* node = Node(ClipTree::kViewportNodeId); |
| 1663 if (viewport_rect == node->data.clip) | 1665 if (viewport_rect == node->data.clip) |
| 1664 return; | 1666 return; |
| 1665 node->data.clip = viewport_rect; | 1667 node->data.clip = viewport_rect; |
| 1666 set_needs_update(true); | 1668 set_needs_update(true); |
| 1667 } | 1669 } |
| 1668 | 1670 |
| 1669 gfx::RectF ClipTree::ViewportClip() { | 1671 gfx::RectF ClipTree::ViewportClip() { |
| 1670 const unsigned long min_size = 1; | 1672 const unsigned long min_size = 1; |
| 1671 DCHECK_GT(size(), min_size); | 1673 DCHECK_GT(size(), min_size); |
|
ajuma
2016/06/22 17:06:57
And this should be a DCHECK_GE now.
| |
| 1672 return Node(1)->data.clip; | 1674 return Node(ClipTree::kViewportNodeId)->data.clip; |
| 1673 } | 1675 } |
| 1674 | 1676 |
| 1675 bool ClipTree::operator==(const ClipTree& other) const { | 1677 bool ClipTree::operator==(const ClipTree& other) const { |
| 1676 return PropertyTree::operator==(other); | 1678 return PropertyTree::operator==(other); |
| 1677 } | 1679 } |
| 1678 | 1680 |
| 1679 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { | 1681 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { |
| 1680 DCHECK(!proto->has_property_type()); | 1682 DCHECK(!proto->has_property_type()); |
| 1681 proto->set_property_type(proto::PropertyTree::Clip); | 1683 proto->set_property_type(proto::PropertyTree::Clip); |
| 1682 | 1684 |
| 1683 PropertyTree::ToProtobuf(proto); | 1685 PropertyTree::ToProtobuf(proto); |
| 1684 } | 1686 } |
| 1685 | 1687 |
| 1686 void ClipTree::FromProtobuf( | 1688 void ClipTree::FromProtobuf( |
| 1687 const proto::PropertyTree& proto, | 1689 const proto::PropertyTree& proto, |
| 1688 std::unordered_map<int, int>* node_id_to_index_map) { | 1690 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1689 DCHECK(proto.has_property_type()); | 1691 DCHECK(proto.has_property_type()); |
| 1690 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip); | 1692 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip); |
| 1693 // Verify that the property tree is empty. | |
| 1694 DCHECK_EQ(static_cast<int>(size()), ClipTree::kRootNodeId); | |
| 1691 | 1695 |
| 1692 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1696 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1693 } | 1697 } |
| 1694 | 1698 |
| 1695 EffectTree& EffectTree::operator=(const EffectTree& from) { | 1699 EffectTree& EffectTree::operator=(const EffectTree& from) { |
| 1696 PropertyTree::operator=(from); | 1700 PropertyTree::operator=(from); |
| 1697 mask_replica_layer_ids_ = from.mask_replica_layer_ids_; | 1701 mask_replica_layer_ids_ = from.mask_replica_layer_ids_; |
| 1698 // copy_requests_ are omitted here, since these need to be moved rather | 1702 // copy_requests_ are omitted here, since these need to be moved rather |
| 1699 // than copied or assigned. | 1703 // than copied or assigned. |
| 1700 return *this; | 1704 return *this; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1714 | 1718 |
| 1715 for (auto i : mask_replica_layer_ids_) | 1719 for (auto i : mask_replica_layer_ids_) |
| 1716 data->add_mask_replica_layer_ids(i); | 1720 data->add_mask_replica_layer_ids(i); |
| 1717 } | 1721 } |
| 1718 | 1722 |
| 1719 void EffectTree::FromProtobuf( | 1723 void EffectTree::FromProtobuf( |
| 1720 const proto::PropertyTree& proto, | 1724 const proto::PropertyTree& proto, |
| 1721 std::unordered_map<int, int>* node_id_to_index_map) { | 1725 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1722 DCHECK(proto.has_property_type()); | 1726 DCHECK(proto.has_property_type()); |
| 1723 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); | 1727 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); |
| 1728 // Verify that the property tree is empty. | |
| 1729 DCHECK_EQ(static_cast<int>(size()), EffectTree::kRootNodeId); | |
| 1724 | 1730 |
| 1725 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1731 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1726 const proto::EffectTreeData& data = proto.effect_tree_data(); | 1732 const proto::EffectTreeData& data = proto.effect_tree_data(); |
| 1727 | 1733 |
| 1728 DCHECK(mask_replica_layer_ids_.empty()); | 1734 DCHECK(mask_replica_layer_ids_.empty()); |
| 1729 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { | 1735 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { |
| 1730 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); | 1736 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); |
| 1731 } | 1737 } |
| 1732 } | 1738 } |
| 1733 | 1739 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1789 entry->set_layer_id(i.first); | 1795 entry->set_layer_id(i.first); |
| 1790 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); | 1796 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); |
| 1791 } | 1797 } |
| 1792 } | 1798 } |
| 1793 | 1799 |
| 1794 void ScrollTree::FromProtobuf( | 1800 void ScrollTree::FromProtobuf( |
| 1795 const proto::PropertyTree& proto, | 1801 const proto::PropertyTree& proto, |
| 1796 std::unordered_map<int, int>* node_id_to_index_map) { | 1802 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1797 DCHECK(proto.has_property_type()); | 1803 DCHECK(proto.has_property_type()); |
| 1798 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); | 1804 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); |
| 1805 // Verify that the property tree is empty. | |
| 1806 DCHECK_EQ(static_cast<int>(size()), ScrollTree::kRootNodeId); | |
| 1799 | 1807 |
| 1800 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1808 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1801 const proto::ScrollTreeData& data = proto.scroll_tree_data(); | 1809 const proto::ScrollTreeData& data = proto.scroll_tree_data(); |
| 1802 | 1810 |
| 1803 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); | 1811 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); |
| 1804 | 1812 |
| 1805 // TODO(khushalsagar): This should probably be removed if the copy constructor | 1813 // TODO(khushalsagar): This should probably be removed if the copy constructor |
| 1806 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. | 1814 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. |
| 1807 layer_id_to_scroll_offset_map_.clear(); | 1815 layer_id_to_scroll_offset_map_.clear(); |
| 1808 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { | 1816 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2142 non_root_surfaces_enabled(true), | 2150 non_root_surfaces_enabled(true), |
| 2143 changed(false), | 2151 changed(false), |
| 2144 full_tree_damaged(false), | 2152 full_tree_damaged(false), |
| 2145 sequence_number(0), | 2153 sequence_number(0), |
| 2146 is_main_thread(true), | 2154 is_main_thread(true), |
| 2147 is_active(false) { | 2155 is_active(false) { |
| 2148 transform_tree.SetPropertyTrees(this); | 2156 transform_tree.SetPropertyTrees(this); |
| 2149 effect_tree.SetPropertyTrees(this); | 2157 effect_tree.SetPropertyTrees(this); |
| 2150 clip_tree.SetPropertyTrees(this); | 2158 clip_tree.SetPropertyTrees(this); |
| 2151 scroll_tree.SetPropertyTrees(this); | 2159 scroll_tree.SetPropertyTrees(this); |
| 2160 transform_id_to_index_map[Layer::INVALID_ID] = TransformTree::kDeviceNodeId; | |
| 2152 } | 2161 } |
| 2153 | 2162 |
| 2154 PropertyTrees::~PropertyTrees() {} | 2163 PropertyTrees::~PropertyTrees() {} |
| 2155 | 2164 |
| 2156 bool PropertyTrees::operator==(const PropertyTrees& other) const { | 2165 bool PropertyTrees::operator==(const PropertyTrees& other) const { |
| 2157 return transform_tree == other.transform_tree && | 2166 return transform_tree == other.transform_tree && |
| 2158 effect_tree == other.effect_tree && clip_tree == other.clip_tree && | 2167 effect_tree == other.effect_tree && clip_tree == other.clip_tree && |
| 2159 scroll_tree == other.scroll_tree && | 2168 scroll_tree == other.scroll_tree && |
| 2160 transform_id_to_index_map == other.transform_id_to_index_map && | 2169 transform_id_to_index_map == other.transform_id_to_index_map && |
| 2161 effect_id_to_index_map == other.effect_id_to_index_map && | 2170 effect_id_to_index_map == other.effect_id_to_index_map && |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2308 id_to_index_map = &clip_id_to_index_map; | 2317 id_to_index_map = &clip_id_to_index_map; |
| 2309 break; | 2318 break; |
| 2310 case SCROLL: | 2319 case SCROLL: |
| 2311 id_to_index_map = &scroll_id_to_index_map; | 2320 id_to_index_map = &scroll_id_to_index_map; |
| 2312 break; | 2321 break; |
| 2313 } | 2322 } |
| 2314 return id_to_index_map->find(id) != id_to_index_map->end(); | 2323 return id_to_index_map->find(id) != id_to_index_map->end(); |
| 2315 } | 2324 } |
| 2316 | 2325 |
| 2317 void PropertyTrees::UpdateChangeTracking() { | 2326 void PropertyTrees::UpdateChangeTracking() { |
| 2318 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 2327 for (int id = EffectTree::kRootNodeId; |
| 2328 id < static_cast<int>(effect_tree.size()); ++id) { | |
| 2319 EffectNode* node = effect_tree.Node(id); | 2329 EffectNode* node = effect_tree.Node(id); |
| 2320 EffectNode* parent_node = effect_tree.parent(node); | 2330 EffectNode* parent_node = effect_tree.parent(node); |
| 2321 effect_tree.UpdateEffectChanged(node, parent_node); | 2331 effect_tree.UpdateEffectChanged(node, parent_node); |
| 2322 } | 2332 } |
| 2323 for (int i = 1; i < static_cast<int>(transform_tree.size()); ++i) { | 2333 for (int i = TransformTree::kRootNodeId; |
| 2334 i < static_cast<int>(transform_tree.size()); ++i) { | |
| 2324 TransformNode* node = transform_tree.Node(i); | 2335 TransformNode* node = transform_tree.Node(i); |
| 2325 TransformNode* parent_node = transform_tree.parent(node); | 2336 TransformNode* parent_node = transform_tree.parent(node); |
| 2326 TransformNode* source_node = transform_tree.Node(node->data.source_node_id); | 2337 TransformNode* source_node = transform_tree.Node(node->data.source_node_id); |
| 2327 transform_tree.UpdateTransformChanged(node, parent_node, source_node); | 2338 transform_tree.UpdateTransformChanged(node, parent_node, source_node); |
| 2328 } | 2339 } |
| 2329 } | 2340 } |
| 2330 | 2341 |
| 2331 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { | 2342 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { |
| 2332 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 2343 for (int id = EffectTree::kRootNodeId; |
| 2344 id < static_cast<int>(effect_tree.size()); ++id) { | |
| 2333 EffectNode* node = effect_tree.Node(id); | 2345 EffectNode* node = effect_tree.Node(id); |
| 2334 if (node->data.effect_changed) { | 2346 if (node->data.effect_changed) { |
| 2335 EffectNode* target_node = tree->effect_tree.Node(node->id); | 2347 EffectNode* target_node = tree->effect_tree.Node(node->id); |
| 2336 target_node->data.effect_changed = true; | 2348 target_node->data.effect_changed = true; |
| 2337 } | 2349 } |
| 2338 } | 2350 } |
| 2339 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { | 2351 for (int id = TransformTree::kRootNodeId; |
| 2352 id < static_cast<int>(transform_tree.size()); ++id) { | |
| 2340 TransformNode* node = transform_tree.Node(id); | 2353 TransformNode* node = transform_tree.Node(id); |
| 2341 if (node->data.transform_changed) { | 2354 if (node->data.transform_changed) { |
| 2342 TransformNode* target_node = tree->transform_tree.Node(node->id); | 2355 TransformNode* target_node = tree->transform_tree.Node(node->id); |
| 2343 target_node->data.transform_changed = true; | 2356 target_node->data.transform_changed = true; |
| 2344 } | 2357 } |
| 2345 } | 2358 } |
| 2346 // Ensure that change tracking is updated even if property trees don't have | 2359 // Ensure that change tracking is updated even if property trees don't have |
| 2347 // other reasons to get updated. | 2360 // other reasons to get updated. |
| 2348 tree->UpdateChangeTracking(); | 2361 tree->UpdateChangeTracking(); |
| 2349 tree->full_tree_damaged = full_tree_damaged; | 2362 tree->full_tree_damaged = full_tree_damaged; |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2375 value->EndDictionary(); | 2388 value->EndDictionary(); |
| 2376 | 2389 |
| 2377 value->BeginDictionary("scroll_tree"); | 2390 value->BeginDictionary("scroll_tree"); |
| 2378 scroll_tree.AsValueInto(value.get()); | 2391 scroll_tree.AsValueInto(value.get()); |
| 2379 value->EndDictionary(); | 2392 value->EndDictionary(); |
| 2380 | 2393 |
| 2381 return value; | 2394 return value; |
| 2382 } | 2395 } |
| 2383 | 2396 |
| 2384 } // namespace cc | 2397 } // namespace cc |
| OLD | NEW |