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 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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |