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

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

Issue 2087963003: cc: Stop creating unused 0 property tree nodes other than transform Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698