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

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: Fix trybot failure, remove unnecessary code 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 envelope_page_scale_layer_with_clip_layer(false),
481 is_inner_viewport_scroll_layer(false),
482 is_outer_viewport_scroll_layer(false),
483 is_inner_viewport_container_layer(false),
484 is_outer_viewport_container_layer(false) {}
480 485
481 bool ScrollNodeData::operator==(const ScrollNodeData& other) const { 486 bool ScrollNodeData::operator==(const ScrollNodeData& other) const {
482 return scrollable == other.scrollable && 487 return scrollable == other.scrollable &&
483 main_thread_scrolling_reasons == other.main_thread_scrolling_reasons && 488 main_thread_scrolling_reasons == other.main_thread_scrolling_reasons &&
484 contains_non_fast_scrollable_region == 489 contains_non_fast_scrollable_region ==
485 other.contains_non_fast_scrollable_region && 490 other.contains_non_fast_scrollable_region &&
486 transform_id == other.transform_id; 491 scroll_clip_layer_bounds == other.scroll_clip_layer_bounds &&
492 bounds == other.bounds &&
493 envelope_page_scale_layer_with_clip_layer ==
494 other.envelope_page_scale_layer_with_clip_layer &&
495 is_inner_viewport_scroll_layer ==
496 other.is_inner_viewport_scroll_layer &&
497 is_outer_viewport_scroll_layer ==
498 other.is_outer_viewport_scroll_layer &&
499 is_inner_viewport_container_layer ==
500 other.is_inner_viewport_container_layer &&
501 is_outer_viewport_container_layer ==
502 other.is_outer_viewport_container_layer;
487 } 503 }
488 504
489 void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const { 505 void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const {
490 DCHECK(!proto->has_scroll_node_data()); 506 DCHECK(!proto->has_scroll_node_data());
491 proto::ScrollNodeData* data = proto->mutable_scroll_node_data(); 507 proto::ScrollNodeData* data = proto->mutable_scroll_node_data();
492 data->set_scrollable(scrollable); 508 data->set_scrollable(scrollable);
493 data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons); 509 data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons);
494 data->set_contains_non_fast_scrollable_region( 510 data->set_contains_non_fast_scrollable_region(
495 contains_non_fast_scrollable_region); 511 contains_non_fast_scrollable_region);
496 data->set_transform_id(transform_id); 512 SizeToProto(scroll_clip_layer_bounds,
513 data->mutable_scroll_clip_layer_bounds());
514 SizeToProto(bounds, data->mutable_bounds());
515 data->set_envelope_page_scale_layer_with_clip_layer(
516 envelope_page_scale_layer_with_clip_layer);
517 data->set_is_inner_viewport_scroll_layer(is_inner_viewport_scroll_layer);
518 data->set_is_outer_viewport_scroll_layer(is_outer_viewport_scroll_layer);
519 data->set_is_inner_viewport_container_layer(
520 is_inner_viewport_container_layer);
521 data->set_is_outer_viewport_container_layer(
522 is_outer_viewport_container_layer);
497 } 523 }
498 524
499 void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) { 525 void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) {
500 DCHECK(proto.has_scroll_node_data()); 526 DCHECK(proto.has_scroll_node_data());
501 const proto::ScrollNodeData& data = proto.scroll_node_data(); 527 const proto::ScrollNodeData& data = proto.scroll_node_data();
502 528
503 scrollable = data.scrollable(); 529 scrollable = data.scrollable();
504 main_thread_scrolling_reasons = data.main_thread_scrolling_reasons(); 530 main_thread_scrolling_reasons = data.main_thread_scrolling_reasons();
505 contains_non_fast_scrollable_region = 531 contains_non_fast_scrollable_region =
506 data.contains_non_fast_scrollable_region(); 532 data.contains_non_fast_scrollable_region();
507 transform_id = data.transform_id(); 533 scroll_clip_layer_bounds = ProtoToSize(data.scroll_clip_layer_bounds());
534 bounds = ProtoToSize(data.bounds());
535 envelope_page_scale_layer_with_clip_layer =
536 data.envelope_page_scale_layer_with_clip_layer();
537 is_inner_viewport_scroll_layer = data.is_inner_viewport_scroll_layer();
538 is_outer_viewport_scroll_layer = data.is_outer_viewport_scroll_layer();
539 is_inner_viewport_container_layer = data.is_inner_viewport_container_layer();
540 is_outer_viewport_container_layer = data.is_outer_viewport_container_layer();
508 } 541 }
509 542
510 void TransformTree::clear() { 543 void TransformTree::clear() {
511 PropertyTree<TransformNode>::clear(); 544 PropertyTree<TransformNode>::clear();
512 545
513 nodes_affected_by_inner_viewport_bounds_delta_.clear(); 546 nodes_affected_by_inner_viewport_bounds_delta_.clear();
514 nodes_affected_by_outer_viewport_bounds_delta_.clear(); 547 nodes_affected_by_outer_viewport_bounds_delta_.clear();
515 } 548 }
516 549
517 bool TransformTree::ComputeTransform(int source_id, 550 bool TransformTree::ComputeTransform(int source_id,
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 759
727 void TransformTree::UpdateLocalTransform(TransformNode* node) { 760 void TransformTree::UpdateLocalTransform(TransformNode* node) {
728 gfx::Transform transform = node->data.post_local; 761 gfx::Transform transform = node->data.post_local;
729 if (NeedsSourceToParentUpdate(node)) { 762 if (NeedsSourceToParentUpdate(node)) {
730 gfx::Transform to_parent; 763 gfx::Transform to_parent;
731 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent); 764 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent);
732 node->data.source_to_parent = to_parent.To2dTranslation(); 765 node->data.source_to_parent = to_parent.To2dTranslation();
733 } 766 }
734 767
735 gfx::Vector2dF fixed_position_adjustment; 768 gfx::Vector2dF fixed_position_adjustment;
769 gfx::Vector2dF inner_viewport_bounds_delta =
770 property_trees()->inner_viewport_container_bounds_delta();
771 gfx::Vector2dF outer_viewport_bounds_delta =
772 property_trees()->outer_viewport_container_bounds_delta();
736 if (node->data.affected_by_inner_viewport_bounds_delta_x) 773 if (node->data.affected_by_inner_viewport_bounds_delta_x)
737 fixed_position_adjustment.set_x(inner_viewport_bounds_delta_.x()); 774 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x());
738 else if (node->data.affected_by_outer_viewport_bounds_delta_x) 775 else if (node->data.affected_by_outer_viewport_bounds_delta_x)
739 fixed_position_adjustment.set_x(outer_viewport_bounds_delta_.x()); 776 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x());
740 777
741 if (node->data.affected_by_inner_viewport_bounds_delta_y) 778 if (node->data.affected_by_inner_viewport_bounds_delta_y)
742 fixed_position_adjustment.set_y(inner_viewport_bounds_delta_.y()); 779 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y());
743 else if (node->data.affected_by_outer_viewport_bounds_delta_y) 780 else if (node->data.affected_by_outer_viewport_bounds_delta_y)
744 fixed_position_adjustment.set_y(outer_viewport_bounds_delta_.y()); 781 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y());
745 782
746 transform.Translate( 783 transform.Translate(
747 node->data.source_to_parent.x() - node->data.scroll_offset.x() + 784 node->data.source_to_parent.x() - node->data.scroll_offset.x() +
748 fixed_position_adjustment.x(), 785 fixed_position_adjustment.x(),
749 node->data.source_to_parent.y() - node->data.scroll_offset.y() + 786 node->data.source_to_parent.y() - node->data.scroll_offset.y() +
750 fixed_position_adjustment.y()); 787 fixed_position_adjustment.y());
751 transform.PreconcatTransform(node->data.local); 788 transform.PreconcatTransform(node->data.local);
752 transform.PreconcatTransform(node->data.pre_local); 789 transform.PreconcatTransform(node->data.pre_local);
753 node->data.set_to_parent(transform); 790 node->data.set_to_parent(transform);
754 node->data.needs_local_transform_update = false; 791 node->data.needs_local_transform_update = false;
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 const gfx::Transform& transform) { 1000 const gfx::Transform& transform) {
964 gfx::Vector2dF device_transform_scale_components = 1001 gfx::Vector2dF device_transform_scale_components =
965 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); 1002 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f);
966 1003
967 // Not handling the rare case of different x and y device scale. 1004 // Not handling the rare case of different x and y device scale.
968 device_transform_scale_factor_ = 1005 device_transform_scale_factor_ =
969 std::max(device_transform_scale_components.x(), 1006 std::max(device_transform_scale_components.x(),
970 device_transform_scale_components.y()); 1007 device_transform_scale_components.y());
971 } 1008 }
972 1009
973 void TransformTree::SetInnerViewportBoundsDelta(gfx::Vector2dF bounds_delta) { 1010 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()) 1011 if (nodes_affected_by_inner_viewport_bounds_delta_.empty())
980 return; 1012 return;
981 1013
982 set_needs_update(true); 1014 set_needs_update(true);
983 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) 1015 for (int i : nodes_affected_by_inner_viewport_bounds_delta_)
984 Node(i)->data.needs_local_transform_update = true; 1016 Node(i)->data.needs_local_transform_update = true;
985 } 1017 }
986 1018
987 void TransformTree::SetOuterViewportBoundsDelta(gfx::Vector2dF bounds_delta) { 1019 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()) 1020 if (nodes_affected_by_outer_viewport_bounds_delta_.empty())
994 return; 1021 return;
995 1022
996 set_needs_update(true); 1023 set_needs_update(true);
997 for (int i : nodes_affected_by_outer_viewport_bounds_delta_) 1024 for (int i : nodes_affected_by_outer_viewport_bounds_delta_)
998 Node(i)->data.needs_local_transform_update = true; 1025 Node(i)->data.needs_local_transform_update = true;
999 } 1026 }
1000 1027
1001 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) { 1028 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) {
1002 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id); 1029 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id);
(...skipping 12 matching lines...) Expand all
1015 } 1042 }
1016 1043
1017 bool TransformTree::operator==(const TransformTree& other) const { 1044 bool TransformTree::operator==(const TransformTree& other) const {
1018 return PropertyTree::operator==(other) && 1045 return PropertyTree::operator==(other) &&
1019 source_to_parent_updates_allowed_ == 1046 source_to_parent_updates_allowed_ ==
1020 other.source_to_parent_updates_allowed() && 1047 other.source_to_parent_updates_allowed() &&
1021 page_scale_factor_ == other.page_scale_factor() && 1048 page_scale_factor_ == other.page_scale_factor() &&
1022 device_scale_factor_ == other.device_scale_factor() && 1049 device_scale_factor_ == other.device_scale_factor() &&
1023 device_transform_scale_factor_ == 1050 device_transform_scale_factor_ ==
1024 other.device_transform_scale_factor() && 1051 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_ == 1052 nodes_affected_by_inner_viewport_bounds_delta_ ==
1028 other.nodes_affected_by_inner_viewport_bounds_delta() && 1053 other.nodes_affected_by_inner_viewport_bounds_delta() &&
1029 nodes_affected_by_outer_viewport_bounds_delta_ == 1054 nodes_affected_by_outer_viewport_bounds_delta_ ==
1030 other.nodes_affected_by_outer_viewport_bounds_delta(); 1055 other.nodes_affected_by_outer_viewport_bounds_delta();
1031 } 1056 }
1032 1057
1033 void TransformTree::ToProtobuf(proto::PropertyTree* proto) const { 1058 void TransformTree::ToProtobuf(proto::PropertyTree* proto) const {
1034 DCHECK(!proto->has_property_type()); 1059 DCHECK(!proto->has_property_type());
1035 proto->set_property_type(proto::PropertyTree::Transform); 1060 proto->set_property_type(proto::PropertyTree::Transform);
1036 1061
1037 PropertyTree::ToProtobuf(proto); 1062 PropertyTree::ToProtobuf(proto);
1038 proto::TransformTreeData* data = proto->mutable_transform_tree_data(); 1063 proto::TransformTreeData* data = proto->mutable_transform_tree_data();
1039 1064
1040 data->set_source_to_parent_updates_allowed(source_to_parent_updates_allowed_); 1065 data->set_source_to_parent_updates_allowed(source_to_parent_updates_allowed_);
1041 data->set_page_scale_factor(page_scale_factor_); 1066 data->set_page_scale_factor(page_scale_factor_);
1042 data->set_device_scale_factor(device_scale_factor_); 1067 data->set_device_scale_factor(device_scale_factor_);
1043 data->set_device_transform_scale_factor(device_transform_scale_factor_); 1068 data->set_device_transform_scale_factor(device_transform_scale_factor_);
1044 1069
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_) 1070 for (auto i : nodes_affected_by_inner_viewport_bounds_delta_)
1051 data->add_nodes_affected_by_inner_viewport_bounds_delta(i); 1071 data->add_nodes_affected_by_inner_viewport_bounds_delta(i);
1052 1072
1053 for (auto i : nodes_affected_by_outer_viewport_bounds_delta_) 1073 for (auto i : nodes_affected_by_outer_viewport_bounds_delta_)
1054 data->add_nodes_affected_by_outer_viewport_bounds_delta(i); 1074 data->add_nodes_affected_by_outer_viewport_bounds_delta(i);
1055 } 1075 }
1056 1076
1057 void TransformTree::FromProtobuf(const proto::PropertyTree& proto) { 1077 void TransformTree::FromProtobuf(const proto::PropertyTree& proto) {
1058 DCHECK(proto.has_property_type()); 1078 DCHECK(proto.has_property_type());
1059 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); 1079 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform);
1060 1080
1061 PropertyTree::FromProtobuf(proto); 1081 PropertyTree::FromProtobuf(proto);
1062 const proto::TransformTreeData& data = proto.transform_tree_data(); 1082 const proto::TransformTreeData& data = proto.transform_tree_data();
1063 1083
1064 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); 1084 source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed();
1065 page_scale_factor_ = data.page_scale_factor(); 1085 page_scale_factor_ = data.page_scale_factor();
1066 device_scale_factor_ = data.device_scale_factor(); 1086 device_scale_factor_ = data.device_scale_factor();
1067 device_transform_scale_factor_ = data.device_transform_scale_factor(); 1087 device_transform_scale_factor_ = data.device_transform_scale_factor();
1068 1088
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()); 1089 DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty());
1075 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size(); 1090 for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size();
1076 ++i) { 1091 ++i) {
1077 nodes_affected_by_inner_viewport_bounds_delta_.push_back( 1092 nodes_affected_by_inner_viewport_bounds_delta_.push_back(
1078 data.nodes_affected_by_inner_viewport_bounds_delta(i)); 1093 data.nodes_affected_by_inner_viewport_bounds_delta(i));
1079 } 1094 }
1080 1095
1081 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); 1096 DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty());
1082 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); 1097 for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size();
1083 ++i) { 1098 ++i) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 PropertyTree::ToProtobuf(proto); 1213 PropertyTree::ToProtobuf(proto);
1199 } 1214 }
1200 1215
1201 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) { 1216 void EffectTree::FromProtobuf(const proto::PropertyTree& proto) {
1202 DCHECK(proto.has_property_type()); 1217 DCHECK(proto.has_property_type());
1203 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); 1218 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect);
1204 1219
1205 PropertyTree::FromProtobuf(proto); 1220 PropertyTree::FromProtobuf(proto);
1206 } 1221 }
1207 1222
1223 ScrollTree::ScrollTree() {}
1224
1225 ScrollTree::~ScrollTree() {}
1226
1208 bool ScrollTree::operator==(const ScrollTree& other) const { 1227 bool ScrollTree::operator==(const ScrollTree& other) const {
1209 return PropertyTree::operator==(other); 1228 return PropertyTree::operator==(other);
1210 } 1229 }
1211 1230
1212 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { 1231 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const {
1213 DCHECK(!proto->has_property_type()); 1232 DCHECK(!proto->has_property_type());
1214 proto->set_property_type(proto::PropertyTree::Scroll); 1233 proto->set_property_type(proto::PropertyTree::Scroll);
1215 1234
1216 PropertyTree::ToProtobuf(proto); 1235 PropertyTree::ToProtobuf(proto);
1217 } 1236 }
1218 1237
1219 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) { 1238 void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) {
1220 DCHECK(proto.has_property_type()); 1239 DCHECK(proto.has_property_type());
1221 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1240 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1222 1241
1223 PropertyTree::FromProtobuf(proto); 1242 PropertyTree::FromProtobuf(proto);
1224 } 1243 }
1225 1244
1245 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
1246 const ScrollNode* scroll_node = Node(scroll_node_id);
1247 if (!scroll_node->data.scrollable || scroll_node->data.bounds.IsEmpty())
1248 return gfx::ScrollOffset();
1249
1250 TransformTree& transform_tree = property_trees()->transform_tree;
1251 float scale_factor = 1.f;
1252 if (scroll_node->data.envelope_page_scale_layer_with_clip_layer)
1253 scale_factor = transform_tree.page_scale_factor();
1254
1255 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(),
1256 scroll_node->data.bounds.height());
1257
1258 if (scroll_node->data.is_inner_viewport_scroll_layer) {
1259 scroll_bounds.Enlarge(
1260 property_trees()->inner_viewport_scroll_bounds_delta().x(),
1261 property_trees()->inner_viewport_scroll_bounds_delta().y());
1262 } else if (scroll_node->data.is_inner_viewport_container_layer) {
1263 scroll_bounds.Enlarge(
1264 property_trees()->inner_viewport_container_bounds_delta().x(),
1265 property_trees()->inner_viewport_container_bounds_delta().y());
1266 } else if (scroll_node->data.is_outer_viewport_container_layer) {
1267 scroll_bounds.Enlarge(
1268 property_trees()->outer_viewport_container_bounds_delta().x(),
1269 property_trees()->outer_viewport_container_bounds_delta().y());
ajuma 2016/02/09 16:27:13 Are the inner/outer viewport container layers ever
1270 }
1271
1272 gfx::SizeF scaled_scroll_bounds = gfx::ScaleSize(scroll_bounds, scale_factor);
1273 scaled_scroll_bounds.SetSize(std::floor(scaled_scroll_bounds.width()),
1274 std::floor(scaled_scroll_bounds.height()));
1275
1276 gfx::Size scroll_clip_layer_bounds =
1277 scroll_node->data.scroll_clip_layer_bounds;
1278
1279 gfx::Vector2dF scroll_clip_layer_bounds_delta;
1280 if (scroll_node->data.is_inner_viewport_scroll_layer) {
1281 scroll_clip_layer_bounds_delta.Add(
1282 property_trees()->inner_viewport_container_bounds_delta());
1283 } else if (scroll_node->data.is_outer_viewport_scroll_layer) {
1284 scroll_clip_layer_bounds_delta.Add(
1285 property_trees()->outer_viewport_container_bounds_delta());
1286 }
1287
1288 gfx::Vector2d delta = gfx::ToCeiledVector2d(scroll_clip_layer_bounds_delta);
1289 scroll_clip_layer_bounds.SetSize(
1290 scroll_clip_layer_bounds.width() + delta.x(),
1291 scroll_clip_layer_bounds.height() + delta.y());
1292
1293 gfx::ScrollOffset max_offset(
1294 scaled_scroll_bounds.width() - scroll_clip_layer_bounds.width(),
1295 scaled_scroll_bounds.height() - scroll_clip_layer_bounds.height());
1296
1297 max_offset.Scale(1 / scale_factor);
1298 max_offset.SetToMax(gfx::ScrollOffset());
1299 return max_offset;
1300 }
1301
1226 PropertyTrees::PropertyTrees() 1302 PropertyTrees::PropertyTrees()
1227 : needs_rebuild(true), 1303 : needs_rebuild(true), non_root_surfaces_enabled(true), sequence_number(0) {
1228 non_root_surfaces_enabled(true), 1304 transform_tree.SetPropertyTrees(this);
1229 sequence_number(0) {} 1305 effect_tree.SetPropertyTrees(this);
1306 clip_tree.SetPropertyTrees(this);
1307 scroll_tree.SetPropertyTrees(this);
1308 }
1230 1309
1231 PropertyTrees::~PropertyTrees() {} 1310 PropertyTrees::~PropertyTrees() {}
1232 1311
1233 bool PropertyTrees::operator==(const PropertyTrees& other) const { 1312 bool PropertyTrees::operator==(const PropertyTrees& other) const {
1234 return transform_tree == other.transform_tree && 1313 return transform_tree == other.transform_tree &&
1235 effect_tree == other.effect_tree && clip_tree == other.clip_tree && 1314 effect_tree == other.effect_tree && clip_tree == other.clip_tree &&
1236 scroll_tree == other.scroll_tree && 1315 scroll_tree == other.scroll_tree &&
1237 needs_rebuild == other.needs_rebuild && 1316 needs_rebuild == other.needs_rebuild &&
1238 non_root_surfaces_enabled == other.non_root_surfaces_enabled && 1317 non_root_surfaces_enabled == other.non_root_surfaces_enabled &&
1239 sequence_number == other.sequence_number; 1318 sequence_number == other.sequence_number;
(...skipping 17 matching lines...) Expand all
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