OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(), |
| 1235 scroll_node->data.bounds.height()); |
| 1236 |
| 1237 if (scroll_node->data.is_inner_viewport_scroll_layer) { |
| 1238 scroll_bounds.Enlarge( |
| 1239 property_trees()->inner_viewport_scroll_bounds_delta().x(), |
| 1240 property_trees()->inner_viewport_scroll_bounds_delta().y()); |
| 1241 } |
| 1242 |
| 1243 if (!scroll_node->data.scrollable || scroll_bounds.IsEmpty()) |
| 1244 return gfx::ScrollOffset(); |
| 1245 |
| 1246 TransformTree& transform_tree = property_trees()->transform_tree; |
| 1247 float scale_factor = 1.f; |
| 1248 if (scroll_node->data.max_scroll_offset_affected_by_page_scale) |
| 1249 scale_factor = transform_tree.page_scale_factor(); |
| 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 |
OLD | NEW |