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

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

Issue 1675963002: Move MaxScrollOffset to property_trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Apply comments. Created 4 years, 10 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"
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/input/main_thread_scrolling_reason.h" 12 #include "cc/input/main_thread_scrolling_reason.h"
13 #include "cc/proto/gfx_conversions.h" 13 #include "cc/proto/gfx_conversions.h"
14 #include "cc/proto/property_tree.pb.h" 14 #include "cc/proto/property_tree.pb.h"
15 #include "cc/proto/scroll_offset.pb.h" 15 #include "cc/proto/scroll_offset.pb.h"
16 #include "cc/proto/transform.pb.h" 16 #include "cc/proto/transform.pb.h"
17 #include "cc/proto/vector2df.pb.h" 17 #include "cc/proto/vector2df.pb.h"
18 #include "cc/trees/property_tree.h" 18 #include "cc/trees/property_tree.h"
19 #include "ui/gfx/geometry/vector2d_conversions.h"
19 20
20 namespace cc { 21 namespace cc {
21 22
22 template <typename T> 23 template <typename T>
23 bool TreeNode<T>::operator==(const TreeNode<T>& other) const { 24 bool TreeNode<T>::operator==(const TreeNode<T>& other) const {
24 return id == other.id && parent_id == other.parent_id && 25 return id == other.id && parent_id == other.parent_id &&
25 owner_id == other.owner_id && data == other.data; 26 owner_id == other.owner_id && data == other.data;
26 } 27 }
27 28
28 template <typename T> 29 template <typename T>
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); 470 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree();
470 transform_id = data.transform_id(); 471 transform_id = data.transform_id();
471 clip_id = data.clip_id(); 472 clip_id = data.clip_id();
472 } 473 }
473 474
474 ScrollNodeData::ScrollNodeData() 475 ScrollNodeData::ScrollNodeData()
475 : scrollable(false), 476 : scrollable(false),
476 main_thread_scrolling_reasons( 477 main_thread_scrolling_reasons(
477 MainThreadScrollingReason::kNotScrollingOnMain), 478 MainThreadScrollingReason::kNotScrollingOnMain),
478 contains_non_fast_scrollable_region(false), 479 contains_non_fast_scrollable_region(false),
479 transform_id(0) {} 480 max_scroll_offset_affected_by_page_scale(false),
481 is_inner_viewport_scroll_layer(false),
482 is_outer_viewport_scroll_layer(false) {}
480 483
481 bool ScrollNodeData::operator==(const ScrollNodeData& other) const { 484 bool ScrollNodeData::operator==(const ScrollNodeData& other) const {
482 return scrollable == other.scrollable && 485 return scrollable == other.scrollable &&
483 main_thread_scrolling_reasons == other.main_thread_scrolling_reasons && 486 main_thread_scrolling_reasons == other.main_thread_scrolling_reasons &&
484 contains_non_fast_scrollable_region == 487 contains_non_fast_scrollable_region ==
485 other.contains_non_fast_scrollable_region && 488 other.contains_non_fast_scrollable_region &&
486 transform_id == other.transform_id; 489 scroll_clip_layer_bounds == other.scroll_clip_layer_bounds &&
490 bounds == other.bounds &&
491 max_scroll_offset_affected_by_page_scale ==
492 other.max_scroll_offset_affected_by_page_scale &&
493 is_inner_viewport_scroll_layer ==
494 other.is_inner_viewport_scroll_layer &&
495 is_outer_viewport_scroll_layer == other.is_outer_viewport_scroll_layer;
487 } 496 }
488 497
489 void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const { 498 void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const {
490 DCHECK(!proto->has_scroll_node_data()); 499 DCHECK(!proto->has_scroll_node_data());
491 proto::ScrollNodeData* data = proto->mutable_scroll_node_data(); 500 proto::ScrollNodeData* data = proto->mutable_scroll_node_data();
492 data->set_scrollable(scrollable); 501 data->set_scrollable(scrollable);
493 data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons); 502 data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons);
494 data->set_contains_non_fast_scrollable_region( 503 data->set_contains_non_fast_scrollable_region(
495 contains_non_fast_scrollable_region); 504 contains_non_fast_scrollable_region);
496 data->set_transform_id(transform_id); 505 SizeToProto(scroll_clip_layer_bounds,
506 data->mutable_scroll_clip_layer_bounds());
507 SizeToProto(bounds, data->mutable_bounds());
508 data->set_max_scroll_offset_affected_by_page_scale(
509 max_scroll_offset_affected_by_page_scale);
510 data->set_is_inner_viewport_scroll_layer(is_inner_viewport_scroll_layer);
511 data->set_is_outer_viewport_scroll_layer(is_outer_viewport_scroll_layer);
497 } 512 }
498 513
499 void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) { 514 void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) {
500 DCHECK(proto.has_scroll_node_data()); 515 DCHECK(proto.has_scroll_node_data());
501 const proto::ScrollNodeData& data = proto.scroll_node_data(); 516 const proto::ScrollNodeData& data = proto.scroll_node_data();
502 517
503 scrollable = data.scrollable(); 518 scrollable = data.scrollable();
504 main_thread_scrolling_reasons = data.main_thread_scrolling_reasons(); 519 main_thread_scrolling_reasons = data.main_thread_scrolling_reasons();
505 contains_non_fast_scrollable_region = 520 contains_non_fast_scrollable_region =
506 data.contains_non_fast_scrollable_region(); 521 data.contains_non_fast_scrollable_region();
507 transform_id = data.transform_id(); 522 scroll_clip_layer_bounds = ProtoToSize(data.scroll_clip_layer_bounds());
523 bounds = ProtoToSize(data.bounds());
524 max_scroll_offset_affected_by_page_scale =
525 data.max_scroll_offset_affected_by_page_scale();
526 is_inner_viewport_scroll_layer = data.is_inner_viewport_scroll_layer();
527 is_outer_viewport_scroll_layer = data.is_outer_viewport_scroll_layer();
508 } 528 }
509 529
510 void TransformTree::clear() { 530 void TransformTree::clear() {
511 PropertyTree<TransformNode>::clear(); 531 PropertyTree<TransformNode>::clear();
512 532
513 nodes_affected_by_inner_viewport_bounds_delta_.clear(); 533 nodes_affected_by_inner_viewport_bounds_delta_.clear();
514 nodes_affected_by_outer_viewport_bounds_delta_.clear(); 534 nodes_affected_by_outer_viewport_bounds_delta_.clear();
515 } 535 }
516 536
517 bool TransformTree::ComputeTransform(int source_id, 537 bool TransformTree::ComputeTransform(int source_id,
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 746
727 void TransformTree::UpdateLocalTransform(TransformNode* node) { 747 void TransformTree::UpdateLocalTransform(TransformNode* node) {
728 gfx::Transform transform = node->data.post_local; 748 gfx::Transform transform = node->data.post_local;
729 if (NeedsSourceToParentUpdate(node)) { 749 if (NeedsSourceToParentUpdate(node)) {
730 gfx::Transform to_parent; 750 gfx::Transform to_parent;
731 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent); 751 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent);
732 node->data.source_to_parent = to_parent.To2dTranslation(); 752 node->data.source_to_parent = to_parent.To2dTranslation();
733 } 753 }
734 754
735 gfx::Vector2dF fixed_position_adjustment; 755 gfx::Vector2dF fixed_position_adjustment;
756 gfx::Vector2dF inner_viewport_bounds_delta =
757 property_trees()->inner_viewport_container_bounds_delta();
758 gfx::Vector2dF outer_viewport_bounds_delta =
759 property_trees()->outer_viewport_container_bounds_delta();
736 if (node->data.affected_by_inner_viewport_bounds_delta_x) 760 if (node->data.affected_by_inner_viewport_bounds_delta_x)
737 fixed_position_adjustment.set_x(inner_viewport_bounds_delta_.x()); 761 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x());
738 else if (node->data.affected_by_outer_viewport_bounds_delta_x) 762 else if (node->data.affected_by_outer_viewport_bounds_delta_x)
739 fixed_position_adjustment.set_x(outer_viewport_bounds_delta_.x()); 763 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x());
740 764
741 if (node->data.affected_by_inner_viewport_bounds_delta_y) 765 if (node->data.affected_by_inner_viewport_bounds_delta_y)
742 fixed_position_adjustment.set_y(inner_viewport_bounds_delta_.y()); 766 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y());
743 else if (node->data.affected_by_outer_viewport_bounds_delta_y) 767 else if (node->data.affected_by_outer_viewport_bounds_delta_y)
744 fixed_position_adjustment.set_y(outer_viewport_bounds_delta_.y()); 768 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y());
745 769
746 transform.Translate( 770 transform.Translate(
747 node->data.source_to_parent.x() - node->data.scroll_offset.x() + 771 node->data.source_to_parent.x() - node->data.scroll_offset.x() +
748 fixed_position_adjustment.x(), 772 fixed_position_adjustment.x(),
749 node->data.source_to_parent.y() - node->data.scroll_offset.y() + 773 node->data.source_to_parent.y() - node->data.scroll_offset.y() +
750 fixed_position_adjustment.y()); 774 fixed_position_adjustment.y());
751 transform.PreconcatTransform(node->data.local); 775 transform.PreconcatTransform(node->data.local);
752 transform.PreconcatTransform(node->data.pre_local); 776 transform.PreconcatTransform(node->data.pre_local);
753 node->data.set_to_parent(transform); 777 node->data.set_to_parent(transform);
754 node->data.needs_local_transform_update = false; 778 node->data.needs_local_transform_update = false;
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 const gfx::Transform& transform) { 987 const gfx::Transform& transform) {
964 gfx::Vector2dF device_transform_scale_components = 988 gfx::Vector2dF device_transform_scale_components =
965 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); 989 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f);
966 990
967 // Not handling the rare case of different x and y device scale. 991 // Not handling the rare case of different x and y device scale.
968 device_transform_scale_factor_ = 992 device_transform_scale_factor_ =
969 std::max(device_transform_scale_components.x(), 993 std::max(device_transform_scale_components.x(),
970 device_transform_scale_components.y()); 994 device_transform_scale_components.y());
971 } 995 }
972 996
973 void TransformTree::SetInnerViewportBoundsDelta(gfx::Vector2dF bounds_delta) { 997 void TransformTree::UpdateInnerViewportContainerBoundsDelta() {
974 if (inner_viewport_bounds_delta_ == bounds_delta)
975 return;
976
977 inner_viewport_bounds_delta_ = bounds_delta;
978
979 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) 998 if (nodes_affected_by_inner_viewport_bounds_delta_.empty())
980 return; 999 return;
981 1000
982 set_needs_update(true); 1001 set_needs_update(true);
983 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) 1002 for (int i : nodes_affected_by_inner_viewport_bounds_delta_)
984 Node(i)->data.needs_local_transform_update = true; 1003 Node(i)->data.needs_local_transform_update = true;
985 } 1004 }
986 1005
987 void TransformTree::SetOuterViewportBoundsDelta(gfx::Vector2dF bounds_delta) { 1006 void TransformTree::UpdateOuterViewportContainerBoundsDelta() {
988 if (outer_viewport_bounds_delta_ == bounds_delta)
989 return;
990
991 outer_viewport_bounds_delta_ = bounds_delta;
992
993 if (nodes_affected_by_outer_viewport_bounds_delta_.empty()) 1007 if (nodes_affected_by_outer_viewport_bounds_delta_.empty())
994 return; 1008 return;
995 1009
996 set_needs_update(true); 1010 set_needs_update(true);
997 for (int i : nodes_affected_by_outer_viewport_bounds_delta_) 1011 for (int i : nodes_affected_by_outer_viewport_bounds_delta_)
998 Node(i)->data.needs_local_transform_update = true; 1012 Node(i)->data.needs_local_transform_update = true;
999 } 1013 }
1000 1014
1001 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) { 1015 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) {
1002 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id); 1016 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id);
(...skipping 12 matching lines...) Expand all
1015 } 1029 }
1016 1030
1017 bool TransformTree::operator==(const TransformTree& other) const { 1031 bool TransformTree::operator==(const TransformTree& other) const {
1018 return PropertyTree::operator==(other) && 1032 return PropertyTree::operator==(other) &&
1019 source_to_parent_updates_allowed_ == 1033 source_to_parent_updates_allowed_ ==
1020 other.source_to_parent_updates_allowed() && 1034 other.source_to_parent_updates_allowed() &&
1021 page_scale_factor_ == other.page_scale_factor() && 1035 page_scale_factor_ == other.page_scale_factor() &&
1022 device_scale_factor_ == other.device_scale_factor() && 1036 device_scale_factor_ == other.device_scale_factor() &&
1023 device_transform_scale_factor_ == 1037 device_transform_scale_factor_ ==
1024 other.device_transform_scale_factor() && 1038 other.device_transform_scale_factor() &&
1025 inner_viewport_bounds_delta_ == other.inner_viewport_bounds_delta() &&
1026 outer_viewport_bounds_delta_ == other.outer_viewport_bounds_delta() &&
1027 nodes_affected_by_inner_viewport_bounds_delta_ == 1039 nodes_affected_by_inner_viewport_bounds_delta_ ==
1028 other.nodes_affected_by_inner_viewport_bounds_delta() && 1040 other.nodes_affected_by_inner_viewport_bounds_delta() &&
1029 nodes_affected_by_outer_viewport_bounds_delta_ == 1041 nodes_affected_by_outer_viewport_bounds_delta_ ==
1030 other.nodes_affected_by_outer_viewport_bounds_delta(); 1042 other.nodes_affected_by_outer_viewport_bounds_delta();
1031 } 1043 }
1032 1044
1033 void TransformTree::ToProtobuf(proto::PropertyTree* proto) const { 1045 void TransformTree::ToProtobuf(proto::PropertyTree* proto) const {
1034 DCHECK(!proto->has_property_type()); 1046 DCHECK(!proto->has_property_type());
1035 proto->set_property_type(proto::PropertyTree::Transform); 1047 proto->set_property_type(proto::PropertyTree::Transform);
1036 1048
1037 PropertyTree::ToProtobuf(proto); 1049 PropertyTree::ToProtobuf(proto);
1038 proto::TransformTreeData* data = proto->mutable_transform_tree_data(); 1050 proto::TransformTreeData* data = proto->mutable_transform_tree_data();
1039 1051
1040 data->set_source_to_parent_updates_allowed(source_to_parent_updates_allowed_); 1052 data->set_source_to_parent_updates_allowed(source_to_parent_updates_allowed_);
1041 data->set_page_scale_factor(page_scale_factor_); 1053 data->set_page_scale_factor(page_scale_factor_);
1042 data->set_device_scale_factor(device_scale_factor_); 1054 data->set_device_scale_factor(device_scale_factor_);
1043 data->set_device_transform_scale_factor(device_transform_scale_factor_); 1055 data->set_device_transform_scale_factor(device_transform_scale_factor_);
1044 1056
1045 Vector2dFToProto(inner_viewport_bounds_delta_,
1046 data->mutable_inner_viewport_bounds_delta());
1047 Vector2dFToProto(outer_viewport_bounds_delta_,
1048 data->mutable_outer_viewport_bounds_delta());
1049
1050 for (auto i : nodes_affected_by_inner_viewport_bounds_delta_) 1057 for (auto i : nodes_affected_by_inner_viewport_bounds_delta_)
1051 data->add_nodes_affected_by_inner_viewport_bounds_delta(i); 1058 data->add_nodes_affected_by_inner_viewport_bounds_delta(i);
1052 1059
1053 for (auto i : nodes_affected_by_outer_viewport_bounds_delta_) 1060 for (auto i : nodes_affected_by_outer_viewport_bounds_delta_)
1054 data->add_nodes_affected_by_outer_viewport_bounds_delta(i); 1061 data->add_nodes_affected_by_outer_viewport_bounds_delta(i);
1055 } 1062 }
1056 1063
1057 void TransformTree::FromProtobuf(const proto::PropertyTree& proto) { 1064 void TransformTree::FromProtobuf(const proto::PropertyTree& proto) {
1058 DCHECK(proto.has_property_type()); 1065 DCHECK(proto.has_property_type());
1059 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); 1066 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform);
1060 1067
1061 PropertyTree::FromProtobuf(proto); 1068 PropertyTree::FromProtobuf(proto);
1062 const proto::TransformTreeData& data = proto.transform_tree_data(); 1069 const proto::TransformTreeData& data = proto.transform_tree_data();
1063 1070
1064 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); 1071 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed();
1065 page_scale_factor_ = data.page_scale_factor(); 1072 page_scale_factor_ = data.page_scale_factor();
1066 device_scale_factor_ = data.device_scale_factor(); 1073 device_scale_factor_ = data.device_scale_factor();
1067 device_transform_scale_factor_ = data.device_transform_scale_factor(); 1074 device_transform_scale_factor_ = data.device_transform_scale_factor();
1068 1075
1069 inner_viewport_bounds_delta_ =
1070 ProtoToVector2dF(data.inner_viewport_bounds_delta());
1071 outer_viewport_bounds_delta_ =
1072 ProtoToVector2dF(data.outer_viewport_bounds_delta());
1073
1074 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty()); 1076 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty());
1075 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size(); 1077 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size();
1076 ++i) { 1078 ++i) {
1077 nodes_affected_by_inner_viewport_bounds_delta_.push_back( 1079 nodes_affected_by_inner_viewport_bounds_delta_.push_back(
1078 data.nodes_affected_by_inner_viewport_bounds_delta(i)); 1080 data.nodes_affected_by_inner_viewport_bounds_delta(i));
1079 } 1081 }
1080 1082
1081 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); 1083 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty());
1082 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); 1084 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size();
1083 ++i) { 1085 ++i) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 PropertyTree::ToProtobuf(proto); 1200 PropertyTree::ToProtobuf(proto);
1199 } 1201 }
1200 1202
1201 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) { 1203 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) {
1202 DCHECK(proto.has_property_type()); 1204 DCHECK(proto.has_property_type());
1203 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); 1205 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect);
1204 1206
1205 PropertyTree::FromProtobuf(proto); 1207 PropertyTree::FromProtobuf(proto);
1206 } 1208 }
1207 1209
1210 ScrollTree::ScrollTree() {}
1211
1212 ScrollTree::~ScrollTree() {}
1213
1208 bool ScrollTree::operator==(const ScrollTree& other) const { 1214 bool ScrollTree::operator==(const ScrollTree& other) const {
1209 return PropertyTree::operator==(other); 1215 return PropertyTree::operator==(other);
1210 } 1216 }
1211 1217
1212 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { 1218 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const {
1213 DCHECK(!proto->has_property_type()); 1219 DCHECK(!proto->has_property_type());
1214 proto->set_property_type(proto::PropertyTree::Scroll); 1220 proto->set_property_type(proto::PropertyTree::Scroll);
1215 1221
1216 PropertyTree::ToProtobuf(proto); 1222 PropertyTree::ToProtobuf(proto);
1217 } 1223 }
1218 1224
1219 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) { 1225 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) {
1220 DCHECK(proto.has_property_type()); 1226 DCHECK(proto.has_property_type());
1221 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1227 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1222 1228
1223 PropertyTree::FromProtobuf(proto); 1229 PropertyTree::FromProtobuf(proto);
1224 } 1230 }
1225 1231
1232 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
1233 const ScrollNode* scroll_node = Node(scroll_node_id);
1234 if (!scroll_node->data.scrollable || scroll_node->data.bounds.IsEmpty())
ajuma 2016/02/09 22:35:05 Do we need to take bounds_delta into account befor
1235 return gfx::ScrollOffset();
1236
1237 TransformTree& transform_tree = property_trees()->transform_tree;
1238 float scale_factor = 1.f;
1239 if (scroll_node->data.max_scroll_offset_affected_by_page_scale)
1240 scale_factor = transform_tree.page_scale_factor();
1241
1242 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(),
1243 scroll_node->data.bounds.height());
1244
1245 if (scroll_node->data.is_inner_viewport_scroll_layer) {
1246 scroll_bounds.Enlarge(
1247 property_trees()->inner_viewport_scroll_bounds_delta().x(),
1248 property_trees()->inner_viewport_scroll_bounds_delta().y());
1249 }
1250
1251 gfx::SizeF scaled_scroll_bounds = gfx::ScaleSize(scroll_bounds, scale_factor);
1252 scaled_scroll_bounds.SetSize(std::floor(scaled_scroll_bounds.width()),
1253 std::floor(scaled_scroll_bounds.height()));
1254
1255 gfx::Size scroll_clip_layer_bounds =
1256 scroll_node->data.scroll_clip_layer_bounds;
1257
1258 gfx::Vector2dF scroll_clip_layer_bounds_delta;
1259 if (scroll_node->data.is_inner_viewport_scroll_layer) {
1260 scroll_clip_layer_bounds_delta.Add(
1261 property_trees()->inner_viewport_container_bounds_delta());
1262 } else if (scroll_node->data.is_outer_viewport_scroll_layer) {
1263 scroll_clip_layer_bounds_delta.Add(
1264 property_trees()->outer_viewport_container_bounds_delta());
1265 }
1266
1267 gfx::Vector2d delta = gfx::ToCeiledVector2d(scroll_clip_layer_bounds_delta);
1268 scroll_clip_layer_bounds.SetSize(
1269 scroll_clip_layer_bounds.width() + delta.x(),
1270 scroll_clip_layer_bounds.height() + delta.y());
1271
1272 gfx::ScrollOffset max_offset(
1273 scaled_scroll_bounds.width() - scroll_clip_layer_bounds.width(),
1274 scaled_scroll_bounds.height() - scroll_clip_layer_bounds.height());
1275
1276 max_offset.Scale(1 / scale_factor);
1277 max_offset.SetToMax(gfx::ScrollOffset());
1278 return max_offset;
1279 }
1280
1226 PropertyTrees::PropertyTrees() 1281 PropertyTrees::PropertyTrees()
1227 : needs_rebuild(true), 1282 : needs_rebuild(true), non_root_surfaces_enabled(true), sequence_number(0) {
1228 non_root_surfaces_enabled(true), 1283 transform_tree.SetPropertyTrees(this);
1229 sequence_number(0) {} 1284 effect_tree.SetPropertyTrees(this);
1285 clip_tree.SetPropertyTrees(this);
1286 scroll_tree.SetPropertyTrees(this);
1287 }
1230 1288
1231 PropertyTrees::~PropertyTrees() {} 1289 PropertyTrees::~PropertyTrees() {}
1232 1290
1233 bool PropertyTrees::operator==(const PropertyTrees& other) const { 1291 bool PropertyTrees::operator==(const PropertyTrees& other) const {
1234 return transform_tree == other.transform_tree && 1292 return transform_tree == other.transform_tree &&
1235 effect_tree == other.effect_tree && clip_tree == other.clip_tree && 1293 effect_tree == other.effect_tree && clip_tree == other.clip_tree &&
1236 scroll_tree == other.scroll_tree && 1294 scroll_tree == other.scroll_tree &&
1237 needs_rebuild == other.needs_rebuild && 1295 needs_rebuild == other.needs_rebuild &&
1238 non_root_surfaces_enabled == other.non_root_surfaces_enabled && 1296 non_root_surfaces_enabled == other.non_root_surfaces_enabled &&
1239 sequence_number == other.sequence_number; 1297 sequence_number == other.sequence_number;
1240 } 1298 }
1241 1299
1300 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) {
1301 transform_tree = from.transform_tree;
1302 effect_tree = from.effect_tree;
1303 clip_tree = from.clip_tree;
1304 scroll_tree = from.scroll_tree;
1305 needs_rebuild = from.needs_rebuild;
1306 non_root_surfaces_enabled = from.non_root_surfaces_enabled;
1307 sequence_number = from.sequence_number;
1308 inner_viewport_container_bounds_delta_ =
1309 from.inner_viewport_container_bounds_delta();
1310 outer_viewport_container_bounds_delta_ =
1311 from.outer_viewport_container_bounds_delta();
1312 inner_viewport_scroll_bounds_delta_ =
1313 from.inner_viewport_scroll_bounds_delta();
1314 transform_tree.SetPropertyTrees(this);
1315 effect_tree.SetPropertyTrees(this);
1316 clip_tree.SetPropertyTrees(this);
1317 scroll_tree.SetPropertyTrees(this);
1318 return *this;
1319 }
1320
1242 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { 1321 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const {
1243 // TODO(khushalsagar): Add support for sending diffs when serializaing 1322 // TODO(khushalsagar): Add support for sending diffs when serializaing
1244 // property trees. See crbug/555370. 1323 // property trees. See crbug/555370.
1245 transform_tree.ToProtobuf(proto->mutable_transform_tree()); 1324 transform_tree.ToProtobuf(proto->mutable_transform_tree());
1246 effect_tree.ToProtobuf(proto->mutable_effect_tree()); 1325 effect_tree.ToProtobuf(proto->mutable_effect_tree());
1247 clip_tree.ToProtobuf(proto->mutable_clip_tree()); 1326 clip_tree.ToProtobuf(proto->mutable_clip_tree());
1248 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); 1327 scroll_tree.ToProtobuf(proto->mutable_scroll_tree());
1249 proto->set_needs_rebuild(needs_rebuild); 1328 proto->set_needs_rebuild(needs_rebuild);
1250 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); 1329 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled);
1251 1330
1252 // TODO(khushalsagar): Consider using the sequence number to decide if 1331 // TODO(khushalsagar): Consider using the sequence number to decide if
1253 // property trees need to be serialized again for a commit. See crbug/555370. 1332 // property trees need to be serialized again for a commit. See crbug/555370.
1254 proto->set_sequence_number(sequence_number); 1333 proto->set_sequence_number(sequence_number);
1255 } 1334 }
1256 1335
1257 // static 1336 // static
1258 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { 1337 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) {
1259 transform_tree.FromProtobuf(proto.transform_tree()); 1338 transform_tree.FromProtobuf(proto.transform_tree());
1260 effect_tree.FromProtobuf(proto.effect_tree()); 1339 effect_tree.FromProtobuf(proto.effect_tree());
1261 clip_tree.FromProtobuf(proto.clip_tree()); 1340 clip_tree.FromProtobuf(proto.clip_tree());
1262 scroll_tree.FromProtobuf(proto.scroll_tree()); 1341 scroll_tree.FromProtobuf(proto.scroll_tree());
1263 1342
1264 needs_rebuild = proto.needs_rebuild(); 1343 needs_rebuild = proto.needs_rebuild();
1265 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); 1344 non_root_surfaces_enabled = proto.non_root_surfaces_enabled();
1266 sequence_number = proto.sequence_number(); 1345 sequence_number = proto.sequence_number();
1346
1347 transform_tree.SetPropertyTrees(this);
1348 effect_tree.SetPropertyTrees(this);
1349 clip_tree.SetPropertyTrees(this);
1350 scroll_tree.SetPropertyTrees(this);
1351 }
1352
1353 void PropertyTrees::SetInnerViewportContainerBoundsDelta(
1354 gfx::Vector2dF bounds_delta) {
1355 if (inner_viewport_container_bounds_delta_ == bounds_delta)
1356 return;
1357
1358 inner_viewport_container_bounds_delta_ = bounds_delta;
1359 transform_tree.UpdateInnerViewportContainerBoundsDelta();
1360 }
1361
1362 void PropertyTrees::SetOuterViewportContainerBoundsDelta(
1363 gfx::Vector2dF bounds_delta) {
1364 if (outer_viewport_container_bounds_delta_ == bounds_delta)
1365 return;
1366
1367 outer_viewport_container_bounds_delta_ = bounds_delta;
1368 transform_tree.UpdateOuterViewportContainerBoundsDelta();
1369 }
1370
1371 void PropertyTrees::SetInnerViewportScrollBoundsDelta(
1372 gfx::Vector2dF bounds_delta) {
1373 inner_viewport_scroll_bounds_delta_ = bounds_delta;
1267 } 1374 }
1268 1375
1269 } // namespace cc 1376 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698