| 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 "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
| 13 #include "cc/animation/animation_host.h" | 13 #include "cc/animation/animation_host.h" |
| 14 #include "cc/layers/layer_impl.h" | 14 #include "cc/layers/layer_impl.h" |
| 15 #include "cc/output/copy_output_request.h" | 15 #include "cc/output/copy_output_request.h" |
| 16 #include "cc/proto/gfx_conversions.h" |
| 16 #include "cc/proto/property_tree.pb.h" | 17 #include "cc/proto/property_tree.pb.h" |
| 17 #include "cc/proto/synced_property_conversions.h" | 18 #include "cc/proto/synced_property_conversions.h" |
| 18 #include "cc/trees/clip_node.h" | 19 #include "cc/trees/clip_node.h" |
| 19 #include "cc/trees/effect_node.h" | 20 #include "cc/trees/effect_node.h" |
| 20 #include "cc/trees/layer_tree_host_common.h" | 21 #include "cc/trees/layer_tree_host_common.h" |
| 21 #include "cc/trees/layer_tree_impl.h" | 22 #include "cc/trees/layer_tree_impl.h" |
| 22 #include "cc/trees/property_tree.h" | 23 #include "cc/trees/property_tree.h" |
| 23 #include "cc/trees/scroll_node.h" | 24 #include "cc/trees/scroll_node.h" |
| 24 #include "cc/trees/transform_node.h" | 25 #include "cc/trees/transform_node.h" |
| 25 #include "ui/gfx/geometry/vector2d_conversions.h" | 26 #include "ui/gfx/geometry/vector2d_conversions.h" |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 if (node->affected_by_inner_viewport_bounds_delta_x) | 340 if (node->affected_by_inner_viewport_bounds_delta_x) |
| 340 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); | 341 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); |
| 341 else if (node->affected_by_outer_viewport_bounds_delta_x) | 342 else if (node->affected_by_outer_viewport_bounds_delta_x) |
| 342 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); | 343 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); |
| 343 | 344 |
| 344 if (node->affected_by_inner_viewport_bounds_delta_y) | 345 if (node->affected_by_inner_viewport_bounds_delta_y) |
| 345 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); | 346 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); |
| 346 else if (node->affected_by_outer_viewport_bounds_delta_y) | 347 else if (node->affected_by_outer_viewport_bounds_delta_y) |
| 347 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); | 348 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); |
| 348 | 349 |
| 349 transform.Translate(node->source_to_parent.x() - node->scroll_offset.x() + | 350 transform.Translate( |
| 350 fixed_position_adjustment.x(), | 351 node->source_to_parent.x() - node->scroll_offset_with_overscroll.x() + |
| 351 node->source_to_parent.y() - node->scroll_offset.y() + | 352 fixed_position_adjustment.x(), |
| 352 fixed_position_adjustment.y()); | 353 node->source_to_parent.y() - node->scroll_offset_with_overscroll.y() + |
| 354 fixed_position_adjustment.y()); |
| 353 transform.PreconcatTransform(node->local); | 355 transform.PreconcatTransform(node->local); |
| 354 transform.PreconcatTransform(node->pre_local); | 356 transform.PreconcatTransform(node->pre_local); |
| 355 node->set_to_parent(transform); | 357 node->set_to_parent(transform); |
| 356 node->needs_local_transform_update = false; | 358 node->needs_local_transform_update = false; |
| 357 } | 359 } |
| 358 | 360 |
| 359 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, | 361 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, |
| 360 TransformNode* parent_node, | 362 TransformNode* parent_node, |
| 361 TransformNode* target_node) { | 363 TransformNode* target_node) { |
| 362 if (!parent_node) { | 364 if (!parent_node) { |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 | 1023 |
| 1022 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1024 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1023 const proto::EffectTreeData& data = proto.effect_tree_data(); | 1025 const proto::EffectTreeData& data = proto.effect_tree_data(); |
| 1024 | 1026 |
| 1025 DCHECK(mask_replica_layer_ids_.empty()); | 1027 DCHECK(mask_replica_layer_ids_.empty()); |
| 1026 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { | 1028 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { |
| 1027 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); | 1029 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); |
| 1028 } | 1030 } |
| 1029 } | 1031 } |
| 1030 | 1032 |
| 1033 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll() {} |
| 1034 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll( |
| 1035 ScrollWithOverscroll&& rhs) = default; |
| 1036 ScrollTree::ScrollWithOverscroll::~ScrollWithOverscroll() {} |
| 1037 |
| 1031 ScrollTree::ScrollTree() | 1038 ScrollTree::ScrollTree() |
| 1032 : currently_scrolling_node_id_(-1), | 1039 : currently_scrolling_node_id_(-1), |
| 1033 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} | 1040 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} |
| 1034 | 1041 |
| 1035 ScrollTree::~ScrollTree() {} | 1042 ScrollTree::~ScrollTree() {} |
| 1036 | 1043 |
| 1037 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { | 1044 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { |
| 1038 PropertyTree::operator=(from); | 1045 PropertyTree::operator=(from); |
| 1039 currently_scrolling_node_id_ = -1; | 1046 |
| 1047 // Keep |currently_scrolling_node_id_| as-is. If it's cleared, the scrolling |
| 1048 // node in the ScrollTree will get out of sync with what's done in |
| 1049 // LayerTreeImpl::SetCurrentlyScrollingLayer() whenever triggering a |
| 1050 // FinishCommitOnImplThread(), which would require every scroll event to |
| 1051 // perform another hit-test. |
| 1052 |
| 1040 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, | 1053 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, |
| 1041 // because we do not want to simply copy the map when property tree is | 1054 // because we do not want to simply copy the map when property tree is |
| 1042 // propagating from pending to active. | 1055 // propagating from pending to active. |
| 1043 // In the main to pending case, we do want to copy it, but this can be done by | 1056 // In the main to pending case, we do want to copy it, but this can be done by |
| 1044 // calling UpdateScrollOffsetMap after the assignment; | 1057 // calling UpdateScrollOffsetMap after the assignment; |
| 1045 // In the other case, we want pending and active property trees to share the | 1058 // In the other case, we want pending and active property trees to share the |
| 1046 // same map. | 1059 // same map. |
| 1047 return *this; | 1060 return *this; |
| 1048 } | 1061 } |
| 1049 | 1062 |
| 1050 bool ScrollTree::operator==(const ScrollTree& other) const { | 1063 bool ScrollTree::operator==(const ScrollTree& other) const { |
| 1051 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map = | 1064 const ScrollOffsetMap& other_scroll_offset_map = |
| 1052 other.scroll_offset_map(); | 1065 other.layer_id_to_scroll_offset_map_; |
| 1053 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) | 1066 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) |
| 1054 return false; | 1067 return false; |
| 1055 | 1068 |
| 1056 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1069 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1057 int key = map_entry.first; | 1070 int key = map_entry.first; |
| 1058 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() || | 1071 auto other_entry_it = other_scroll_offset_map.find(key); |
| 1059 map_entry.second != layer_id_to_scroll_offset_map_.at(key)) | 1072 if (other_entry_it == other_scroll_offset_map.end() || |
| 1073 map_entry.second != other_entry_it->second) |
| 1060 return false; | 1074 return false; |
| 1061 } | 1075 } |
| 1062 | 1076 |
| 1063 bool is_currently_scrolling_node_equal = | 1077 bool is_currently_scrolling_node_equal = |
| 1064 (currently_scrolling_node_id_ == -1) | 1078 (currently_scrolling_node_id_ == -1) |
| 1065 ? (!other.CurrentlyScrollingNode()) | 1079 ? (!other.CurrentlyScrollingNode()) |
| 1066 : (other.CurrentlyScrollingNode() && | 1080 : (other.CurrentlyScrollingNode() && |
| 1067 currently_scrolling_node_id_ == | 1081 currently_scrolling_node_id_ == |
| 1068 other.CurrentlyScrollingNode()->id); | 1082 other.CurrentlyScrollingNode()->id); |
| 1069 | 1083 |
| 1070 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; | 1084 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; |
| 1071 } | 1085 } |
| 1072 | 1086 |
| 1073 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { | 1087 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { |
| 1074 DCHECK(!proto->has_property_type()); | 1088 DCHECK(!proto->has_property_type()); |
| 1075 proto->set_property_type(proto::PropertyTree::Scroll); | 1089 proto->set_property_type(proto::PropertyTree::Scroll); |
| 1076 | 1090 |
| 1077 PropertyTree::ToProtobuf(proto); | 1091 PropertyTree::ToProtobuf(proto); |
| 1078 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); | 1092 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); |
| 1079 | 1093 |
| 1080 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); | 1094 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); |
| 1081 for (auto i : layer_id_to_scroll_offset_map_) { | 1095 for (const auto& i : layer_id_to_scroll_offset_map_) { |
| 1082 data->add_layer_id_to_scroll_offset_map(); | 1096 data->add_layer_id_to_scroll_offset_map(); |
| 1083 proto::ScrollOffsetMapEntry* entry = | 1097 proto::ScrollOffsetMapEntry* entry = |
| 1084 data->mutable_layer_id_to_scroll_offset_map( | 1098 data->mutable_layer_id_to_scroll_offset_map( |
| 1085 data->layer_id_to_scroll_offset_map_size() - 1); | 1099 data->layer_id_to_scroll_offset_map_size() - 1); |
| 1086 entry->set_layer_id(i.first); | 1100 entry->set_layer_id(i.first); |
| 1087 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); | 1101 SyncedScrollOffsetToProto(*i.second.synced_offset.get(), |
| 1102 entry->mutable_scroll_offset()); |
| 1103 ScrollOffsetToProto(i.second.overscroll, entry->mutable_overscroll()); |
| 1088 } | 1104 } |
| 1089 } | 1105 } |
| 1090 | 1106 |
| 1091 void ScrollTree::FromProtobuf( | 1107 void ScrollTree::FromProtobuf( |
| 1092 const proto::PropertyTree& proto, | 1108 const proto::PropertyTree& proto, |
| 1093 std::unordered_map<int, int>* node_id_to_index_map) { | 1109 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1094 DCHECK(proto.has_property_type()); | 1110 DCHECK(proto.has_property_type()); |
| 1095 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); | 1111 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); |
| 1096 | 1112 |
| 1097 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1113 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1098 const proto::ScrollTreeData& data = proto.scroll_tree_data(); | 1114 const proto::ScrollTreeData& data = proto.scroll_tree_data(); |
| 1099 | 1115 |
| 1100 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); | 1116 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); |
| 1101 | 1117 |
| 1102 // TODO(khushalsagar): This should probably be removed if the copy constructor | 1118 // TODO(khushalsagar): This should probably be removed if the copy constructor |
| 1103 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. | 1119 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. |
| 1104 layer_id_to_scroll_offset_map_.clear(); | 1120 layer_id_to_scroll_offset_map_.clear(); |
| 1105 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { | 1121 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { |
| 1106 const proto::ScrollOffsetMapEntry entry = | 1122 const proto::ScrollOffsetMapEntry entry = |
| 1107 data.layer_id_to_scroll_offset_map(i); | 1123 data.layer_id_to_scroll_offset_map(i); |
| 1108 layer_id_to_scroll_offset_map_[entry.layer_id()] = new SyncedScrollOffset(); | 1124 ScrollWithOverscroll* scroll = GetOrCreate(entry.layer_id()); |
| 1109 ProtoToSyncedScrollOffset( | 1125 scroll->synced_offset = new SyncedScrollOffset(); |
| 1110 entry.scroll_offset(), | 1126 ProtoToSyncedScrollOffset(entry.scroll_offset(), |
| 1111 layer_id_to_scroll_offset_map_[entry.layer_id()].get()); | 1127 scroll->synced_offset.get()); |
| 1128 scroll->overscroll = ProtoToScrollOffset(entry.overscroll()); |
| 1112 } | 1129 } |
| 1113 } | 1130 } |
| 1114 | 1131 |
| 1115 void ScrollTree::clear() { | 1132 void ScrollTree::clear() { |
| 1116 PropertyTree<ScrollNode>::clear(); | 1133 PropertyTree<ScrollNode>::clear(); |
| 1117 | 1134 |
| 1118 if (property_trees()->is_main_thread) { | 1135 if (property_trees()->is_main_thread) { |
| 1119 currently_scrolling_node_id_ = -1; | 1136 currently_scrolling_node_id_ = -1; |
| 1120 layer_id_to_scroll_offset_map_.clear(); | 1137 layer_id_to_scroll_offset_map_.clear(); |
| 1121 } | 1138 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 gfx::Transform screen_space_transform( | 1215 gfx::Transform screen_space_transform( |
| 1199 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), | 1216 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), |
| 1200 scroll_node->offset_to_transform_parent.y()); | 1217 scroll_node->offset_to_transform_parent.y()); |
| 1201 screen_space_transform.ConcatTransform( | 1218 screen_space_transform.ConcatTransform( |
| 1202 transform_tree.ToScreen(transform_node->id)); | 1219 transform_tree.ToScreen(transform_node->id)); |
| 1203 if (scroll_node->should_flatten) | 1220 if (scroll_node->should_flatten) |
| 1204 screen_space_transform.FlattenTo2d(); | 1221 screen_space_transform.FlattenTo2d(); |
| 1205 return screen_space_transform; | 1222 return screen_space_transform; |
| 1206 } | 1223 } |
| 1207 | 1224 |
| 1225 ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrCreate(int layer_id) { |
| 1226 auto it = layer_id_to_scroll_offset_map_.find(layer_id); |
| 1227 if (it == layer_id_to_scroll_offset_map_.end()) { |
| 1228 it = |
| 1229 layer_id_to_scroll_offset_map_.emplace(layer_id, ScrollWithOverscroll()) |
| 1230 .first; |
| 1231 it->second.synced_offset = new SyncedScrollOffset; |
| 1232 } |
| 1233 return &it->second; |
| 1234 } |
| 1235 |
| 1236 const ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrNull( |
| 1237 int layer_id) const { |
| 1238 auto it = layer_id_to_scroll_offset_map_.find(layer_id); |
| 1239 if (it == layer_id_to_scroll_offset_map_.end()) |
| 1240 return nullptr; |
| 1241 return &it->second; |
| 1242 } |
| 1243 |
| 1208 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { | 1244 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { |
| 1209 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1245 return GetOrCreate(layer_id)->synced_offset.get(); |
| 1210 layer_id_to_scroll_offset_map_.end()) { | |
| 1211 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset; | |
| 1212 } | |
| 1213 return layer_id_to_scroll_offset_map_[layer_id].get(); | |
| 1214 } | 1246 } |
| 1215 | 1247 |
| 1216 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { | 1248 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { |
| 1217 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1249 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1218 layer_id_to_scroll_offset_map_.end()) { | 1250 return scroll ? scroll->synced_offset.get() : nullptr; |
| 1219 return nullptr; | |
| 1220 } | |
| 1221 return layer_id_to_scroll_offset_map_.at(layer_id).get(); | |
| 1222 } | 1251 } |
| 1223 | 1252 |
| 1224 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { | 1253 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { |
| 1225 return synced_scroll_offset(layer_id) | 1254 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1226 ? synced_scroll_offset(layer_id)->Current( | 1255 return scroll ? scroll->synced_offset->Current(property_trees()->is_active) |
| 1227 property_trees()->is_active) | 1256 : gfx::ScrollOffset(); |
| 1228 : gfx::ScrollOffset(); | 1257 } |
| 1258 |
| 1259 const gfx::ScrollOffset ScrollTree::current_overscroll(int layer_id) const { |
| 1260 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1261 return scroll ? scroll->overscroll : gfx::ScrollOffset(); |
| 1229 } | 1262 } |
| 1230 | 1263 |
| 1231 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( | 1264 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( |
| 1232 SyncedScrollOffset* scroll_offset) { | 1265 SyncedScrollOffset* scroll_offset) { |
| 1233 // TODO(miletus): Remove all this temporary flooring machinery when | 1266 // TODO(miletus): Remove all this temporary flooring machinery when |
| 1234 // Blink fully supports fractional scrolls. | 1267 // Blink fully supports fractional scrolls. |
| 1235 gfx::ScrollOffset current_offset = | 1268 gfx::ScrollOffset current_offset = |
| 1236 scroll_offset->Current(property_trees()->is_active); | 1269 scroll_offset->Current(property_trees()->is_active); |
| 1237 gfx::ScrollOffset current_delta = property_trees()->is_active | 1270 gfx::ScrollOffset current_delta = property_trees()->is_active |
| 1238 ? scroll_offset->Delta() | 1271 ? scroll_offset->Delta() |
| 1239 : scroll_offset->PendingDelta().get(); | 1272 : scroll_offset->PendingDelta().get(); |
| 1240 gfx::ScrollOffset floored_delta(floor(current_delta.x()), | 1273 gfx::ScrollOffset floored_delta(floor(current_delta.x()), |
| 1241 floor(current_delta.y())); | 1274 floor(current_delta.y())); |
| 1242 gfx::ScrollOffset diff_delta = floored_delta - current_delta; | 1275 gfx::ScrollOffset diff_delta = floored_delta - current_delta; |
| 1243 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; | 1276 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; |
| 1244 scroll_offset->SetCurrent(tmp_offset); | 1277 scroll_offset->SetCurrent(tmp_offset); |
| 1245 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); | 1278 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); |
| 1246 scroll_offset->SetCurrent(current_offset); | 1279 scroll_offset->SetCurrent(current_offset); |
| 1247 return delta; | 1280 return delta; |
| 1248 } | 1281 } |
| 1249 | 1282 |
| 1250 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 1283 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
| 1251 int inner_viewport_layer_id) { | 1284 int inner_viewport_layer_id) { |
| 1252 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1285 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1253 gfx::ScrollOffset scroll_delta = | 1286 gfx::ScrollOffset scroll_delta = |
| 1254 PullDeltaForMainThread(map_entry.second.get()); | 1287 PullDeltaForMainThread(map_entry.second.synced_offset.get()); |
| 1255 | 1288 gfx::ScrollOffset overscroll = map_entry.second.overscroll; |
| 1256 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); | 1289 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); |
| 1257 int layer_id = map_entry.first; | 1290 int layer_id = map_entry.first; |
| 1258 | 1291 |
| 1259 if (!scroll_delta.IsZero()) { | 1292 if (!scroll_delta.IsZero() || !overscroll.IsZero()) { |
| 1260 if (layer_id == inner_viewport_layer_id) { | 1293 if (layer_id == inner_viewport_layer_id) { |
| 1261 // Inner (visual) viewport is stored separately. | 1294 // Inner (visual) viewport is stored separately. |
| 1262 scroll_info->inner_viewport_scroll.layer_id = layer_id; | 1295 scroll_info->inner_viewport_scroll.layer_id = layer_id; |
| 1263 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; | 1296 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; |
| 1297 scroll_info->inner_viewport_scroll.overscroll = overscroll; |
| 1264 } else { | 1298 } else { |
| 1265 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 1299 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 1266 scroll.layer_id = layer_id; | 1300 scroll.layer_id = layer_id; |
| 1267 scroll.scroll_delta = scroll_delta_vector; | 1301 scroll.scroll_delta = scroll_delta_vector; |
| 1268 scroll_info->scrolls.push_back(scroll); | 1302 scroll.overscroll = overscroll; |
| 1303 scroll_info->scrolls.push_back(std::move(scroll)); |
| 1269 } | 1304 } |
| 1270 } | 1305 } |
| 1271 } | 1306 } |
| 1272 } | 1307 } |
| 1273 | 1308 |
| 1274 void ScrollTree::CollectScrollDeltasForTesting() { | 1309 void ScrollTree::CollectScrollDeltasForTesting() { |
| 1275 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1310 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1276 PullDeltaForMainThread(map_entry.second.get()); | 1311 PullDeltaForMainThread(map_entry.second.synced_offset.get()); |
| 1277 } | 1312 } |
| 1278 } | 1313 } |
| 1279 | 1314 |
| 1280 void ScrollTree::UpdateScrollOffsetMapEntry( | 1315 void ScrollTree::UpdateScrollOffsetMapEntry( |
| 1281 int key, | 1316 int key, |
| 1282 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1317 ScrollOffsetMap* new_scroll_offset_map, |
| 1283 LayerTreeImpl* layer_tree_impl) { | 1318 LayerTreeImpl* layer_tree_impl) { |
| 1284 bool changed = false; | 1319 bool changed = false; |
| 1285 // If we are pushing scroll offset from main to pending tree, we create a new | 1320 // If we are pushing scroll offset from main to pending tree, we create a new |
| 1286 // instance of synced scroll offset; if we are pushing from pending to active, | 1321 // instance of synced scroll offset; if we are pushing from pending to active, |
| 1287 // we reuse the pending tree's value in the map. | 1322 // we reuse the pending tree's value in the map. |
| 1323 ScrollWithOverscroll& other_scroll = new_scroll_offset_map->at(key); |
| 1288 if (!property_trees()->is_active) { | 1324 if (!property_trees()->is_active) { |
| 1289 changed = synced_scroll_offset(key)->PushFromMainThread( | 1325 ScrollWithOverscroll& this_scroll = *GetOrCreate(key); |
| 1290 new_scroll_offset_map->at(key)->PendingBase()); | 1326 changed = this_scroll.synced_offset->PushFromMainThread( |
| 1327 other_scroll.synced_offset->PendingBase()); |
| 1291 | 1328 |
| 1292 if (new_scroll_offset_map->at(key)->clobber_active_value()) { | 1329 if (other_scroll.synced_offset->clobber_active_value()) { |
| 1293 synced_scroll_offset(key)->set_clobber_active_value(); | 1330 this_scroll.synced_offset->set_clobber_active_value(); |
| 1294 } | 1331 } |
| 1332 changed |= this_scroll.overscroll != other_scroll.overscroll; |
| 1333 this_scroll.overscroll = other_scroll.overscroll; |
| 1295 if (changed) { | 1334 if (changed) { |
| 1296 layer_tree_impl->DidUpdateScrollOffset(key, -1); | 1335 layer_tree_impl->DidUpdateScrollOffset(key, -1); |
| 1297 } | 1336 } |
| 1298 } else { | 1337 } else { |
| 1299 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key); | 1338 ScrollWithOverscroll& this_scroll = layer_id_to_scroll_offset_map_[key]; |
| 1300 changed |= synced_scroll_offset(key)->PushPendingToActive(); | 1339 this_scroll.synced_offset = other_scroll.synced_offset; |
| 1301 if (changed) { | 1340 // Nothing to do for overscroll. |
| 1341 changed |= this_scroll.synced_offset->PushPendingToActive(); |
| 1342 if (changed) |
| 1302 layer_tree_impl->DidUpdateScrollOffset(key, -1); | 1343 layer_tree_impl->DidUpdateScrollOffset(key, -1); |
| 1303 } | |
| 1304 } | 1344 } |
| 1305 } | 1345 } |
| 1306 | 1346 |
| 1307 void ScrollTree::UpdateScrollOffsetMap( | 1347 void ScrollTree::UpdateScrollOffsetMap(ScrollTree* scroll_tree, |
| 1308 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1348 LayerTreeImpl* layer_tree_impl) { |
| 1309 LayerTreeImpl* layer_tree_impl) { | 1349 ScrollOffsetMap* new_scroll_offset_map = |
| 1350 &scroll_tree->layer_id_to_scroll_offset_map_; |
| 1310 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { | 1351 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { |
| 1311 DCHECK(!property_trees()->is_main_thread); | 1352 DCHECK(!property_trees()->is_main_thread); |
| 1312 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); | 1353 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); |
| 1313 map_entry != layer_id_to_scroll_offset_map_.end();) { | 1354 map_entry != layer_id_to_scroll_offset_map_.end();) { |
| 1314 int key = map_entry->first; | 1355 int key = map_entry->first; |
| 1315 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { | 1356 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { |
| 1316 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | 1357 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); |
| 1317 ++map_entry; | 1358 ++map_entry; |
| 1318 } else { | 1359 } else { |
| 1319 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); | 1360 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); |
| 1320 } | 1361 } |
| 1321 } | 1362 } |
| 1322 | 1363 |
| 1323 for (auto& map_entry : *new_scroll_offset_map) { | 1364 for (auto& map_entry : *new_scroll_offset_map) { |
| 1324 int key = map_entry.first; | 1365 int key = map_entry.first; |
| 1325 if (layer_id_to_scroll_offset_map_.find(key) == | 1366 if (layer_id_to_scroll_offset_map_.find(key) == |
| 1326 layer_id_to_scroll_offset_map_.end()) | 1367 layer_id_to_scroll_offset_map_.end()) |
| 1327 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | 1368 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); |
| 1328 } | 1369 } |
| 1329 } | 1370 } |
| 1330 } | 1371 } |
| 1331 | 1372 |
| 1332 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() { | 1373 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map_for_test() |
| 1333 return layer_id_to_scroll_offset_map_; | 1374 const { |
| 1334 } | |
| 1335 | |
| 1336 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const { | |
| 1337 return layer_id_to_scroll_offset_map_; | 1375 return layer_id_to_scroll_offset_map_; |
| 1338 } | 1376 } |
| 1339 | 1377 |
| 1340 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { | 1378 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { |
| 1341 DCHECK(property_trees()->is_active); | 1379 DCHECK(property_trees()->is_active); |
| 1342 for (auto& map_entry : layer_id_to_scroll_offset_map_) | 1380 for (auto& map_entry : layer_id_to_scroll_offset_map_) |
| 1343 map_entry.second->AbortCommit(); | 1381 map_entry.second.synced_offset->AbortCommit(); |
| 1344 } | 1382 } |
| 1345 | 1383 |
| 1346 bool ScrollTree::SetBaseScrollOffset(int layer_id, | 1384 void ScrollTree::SetBaseScrollOffset(int layer_id, |
| 1347 const gfx::ScrollOffset& scroll_offset) { | 1385 const gfx::ScrollOffset& scroll_offset, |
| 1348 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1386 const gfx::ScrollOffset& overscroll) { |
| 1387 ScrollWithOverscroll* scroll = GetOrCreate(layer_id); |
| 1388 scroll->overscroll = overscroll; |
| 1389 scroll->synced_offset->PushFromMainThread(scroll_offset); |
| 1349 } | 1390 } |
| 1350 | 1391 |
| 1351 bool ScrollTree::SetScrollOffset(int layer_id, | 1392 bool ScrollTree::SetScrollOffset(int layer_id, |
| 1352 const gfx::ScrollOffset& scroll_offset) { | 1393 const gfx::ScrollOffset& scroll_offset, |
| 1394 const gfx::ScrollOffset& overscroll) { |
| 1395 ScrollWithOverscroll* scroll = GetOrCreate(layer_id); |
| 1396 bool change = scroll->overscroll != overscroll; |
| 1397 scroll->overscroll = overscroll; |
| 1398 |
| 1353 if (property_trees()->is_main_thread) | 1399 if (property_trees()->is_main_thread) |
| 1354 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1400 change |= synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); |
| 1355 else if (property_trees()->is_active) | 1401 else if (property_trees()->is_active) |
| 1356 return synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); | 1402 change |= synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); |
| 1357 return false; | 1403 return change; |
| 1404 } |
| 1405 |
| 1406 void ScrollTree::SetScrollOffsetClobberActiveValue(int layer_id) { |
| 1407 GetOrCreate(layer_id)->synced_offset->set_clobber_active_value(); |
| 1358 } | 1408 } |
| 1359 | 1409 |
| 1360 bool ScrollTree::UpdateScrollOffsetBaseForTesting( | 1410 bool ScrollTree::UpdateScrollOffsetBaseForTesting( |
| 1361 int layer_id, | 1411 int layer_id, |
| 1362 const gfx::ScrollOffset& offset) { | 1412 const gfx::ScrollOffset& offset) { |
| 1363 DCHECK(!property_trees()->is_main_thread); | 1413 DCHECK(!property_trees()->is_main_thread); |
| 1364 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); | 1414 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); |
| 1365 if (property_trees()->is_active) | 1415 if (property_trees()->is_active) |
| 1366 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); | 1416 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); |
| 1367 return changed; | 1417 return changed; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1419 LayerTreeImpl* layer_tree_impl) { | 1469 LayerTreeImpl* layer_tree_impl) { |
| 1420 gfx::ScrollOffset adjusted_scroll(scroll); | 1470 gfx::ScrollOffset adjusted_scroll(scroll); |
| 1421 if (!scroll_node->user_scrollable_horizontal) | 1471 if (!scroll_node->user_scrollable_horizontal) |
| 1422 adjusted_scroll.set_x(0); | 1472 adjusted_scroll.set_x(0); |
| 1423 if (!scroll_node->user_scrollable_vertical) | 1473 if (!scroll_node->user_scrollable_vertical) |
| 1424 adjusted_scroll.set_y(0); | 1474 adjusted_scroll.set_y(0); |
| 1425 DCHECK(scroll_node->scrollable); | 1475 DCHECK(scroll_node->scrollable); |
| 1426 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); | 1476 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); |
| 1427 gfx::ScrollOffset new_offset = | 1477 gfx::ScrollOffset new_offset = |
| 1428 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); | 1478 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); |
| 1429 if (SetScrollOffset(scroll_node->owner_id, new_offset)) | 1479 gfx::ScrollOffset overscroll = current_overscroll(scroll_node->owner_id); |
| 1480 if (SetScrollOffset(scroll_node->owner_id, new_offset, overscroll)) { |
| 1430 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, | 1481 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, |
| 1431 scroll_node->transform_id); | 1482 scroll_node->transform_id); |
| 1483 } |
| 1432 | 1484 |
| 1433 gfx::ScrollOffset unscrolled = | 1485 gfx::ScrollOffset unscrolled = |
| 1434 old_offset + gfx::ScrollOffset(scroll) - new_offset; | 1486 old_offset + gfx::ScrollOffset(scroll) - new_offset; |
| 1435 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); | 1487 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); |
| 1436 } | 1488 } |
| 1437 | 1489 |
| 1438 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( | 1490 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( |
| 1439 gfx::ScrollOffset offset, | 1491 gfx::ScrollOffset offset, |
| 1440 ScrollNode* scroll_node) const { | 1492 ScrollNode* scroll_node) const { |
| 1441 offset.SetToMin(MaxScrollOffset(scroll_node->id)); | 1493 offset.SetToMin(MaxScrollOffset(scroll_node->id)); |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 if (transform_id > destination_transform_id) { | 1950 if (transform_id > destination_transform_id) { |
| 1899 return transform_tree.CombineTransformsBetween( | 1951 return transform_tree.CombineTransformsBetween( |
| 1900 transform_id, destination_transform_id, transform); | 1952 transform_id, destination_transform_id, transform); |
| 1901 } | 1953 } |
| 1902 | 1954 |
| 1903 return transform_tree.CombineInversesBetween( | 1955 return transform_tree.CombineInversesBetween( |
| 1904 transform_id, destination_transform_id, transform); | 1956 transform_id, destination_transform_id, transform); |
| 1905 } | 1957 } |
| 1906 | 1958 |
| 1907 } // namespace cc | 1959 } // namespace cc |
| OLD | NEW |