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 |