| 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 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 | 1041 |
| 1040 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1042 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1041 const proto::EffectTreeData& data = proto.effect_tree_data(); | 1043 const proto::EffectTreeData& data = proto.effect_tree_data(); |
| 1042 | 1044 |
| 1043 DCHECK(mask_replica_layer_ids_.empty()); | 1045 DCHECK(mask_replica_layer_ids_.empty()); |
| 1044 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { | 1046 for (int i = 0; i < data.mask_replica_layer_ids_size(); ++i) { |
| 1045 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); | 1047 mask_replica_layer_ids_.push_back(data.mask_replica_layer_ids(i)); |
| 1046 } | 1048 } |
| 1047 } | 1049 } |
| 1048 | 1050 |
| 1051 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll() {} |
| 1052 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll( |
| 1053 ScrollWithOverscroll&& rhs) = default; |
| 1054 ScrollTree::ScrollWithOverscroll::~ScrollWithOverscroll() {} |
| 1055 |
| 1049 ScrollTree::ScrollTree() | 1056 ScrollTree::ScrollTree() |
| 1050 : currently_scrolling_node_id_(kInvalidNodeId), | 1057 : currently_scrolling_node_id_(kInvalidNodeId), |
| 1051 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} | 1058 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} |
| 1052 | 1059 |
| 1053 ScrollTree::~ScrollTree() {} | 1060 ScrollTree::~ScrollTree() {} |
| 1054 | 1061 |
| 1055 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { | 1062 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { |
| 1056 PropertyTree::operator=(from); | 1063 PropertyTree::operator=(from); |
| 1057 currently_scrolling_node_id_ = kInvalidNodeId; | 1064 |
| 1065 // Keep |currently_scrolling_node_id_| as-is. If it's cleared, the scrolling |
| 1066 // node in the ScrollTree will get out of sync with what's done in |
| 1067 // LayerTreeImpl::SetCurrentlyScrollingLayer() whenever triggering a |
| 1068 // FinishCommitOnImplThread(), which would require every scroll event to |
| 1069 // perform another hit-test. |
| 1070 |
| 1058 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, | 1071 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, |
| 1059 // because we do not want to simply copy the map when property tree is | 1072 // because we do not want to simply copy the map when property tree is |
| 1060 // propagating from pending to active. | 1073 // propagating from pending to active. |
| 1061 // In the main to pending case, we do want to copy it, but this can be done by | 1074 // In the main to pending case, we do want to copy it, but this can be done by |
| 1062 // calling UpdateScrollOffsetMap after the assignment; | 1075 // calling UpdateScrollOffsetMap after the assignment; |
| 1063 // In the other case, we want pending and active property trees to share the | 1076 // In the other case, we want pending and active property trees to share the |
| 1064 // same map. | 1077 // same map. |
| 1065 return *this; | 1078 return *this; |
| 1066 } | 1079 } |
| 1067 | 1080 |
| 1068 bool ScrollTree::operator==(const ScrollTree& other) const { | 1081 bool ScrollTree::operator==(const ScrollTree& other) const { |
| 1069 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map = | 1082 const ScrollOffsetMap& other_scroll_offset_map = |
| 1070 other.scroll_offset_map(); | 1083 other.layer_id_to_scroll_offset_map_; |
| 1071 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) | 1084 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) |
| 1072 return false; | 1085 return false; |
| 1073 | 1086 |
| 1074 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1087 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1075 int key = map_entry.first; | 1088 int key = map_entry.first; |
| 1076 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() || | 1089 auto other_entry_it = other_scroll_offset_map.find(key); |
| 1077 map_entry.second != layer_id_to_scroll_offset_map_.at(key)) | 1090 if (other_entry_it == other_scroll_offset_map.end() || |
| 1091 map_entry.second != other_entry_it->second) |
| 1078 return false; | 1092 return false; |
| 1079 } | 1093 } |
| 1080 | 1094 |
| 1081 bool is_currently_scrolling_node_equal = | 1095 bool is_currently_scrolling_node_equal = |
| 1082 (currently_scrolling_node_id_ == kInvalidNodeId) | 1096 (currently_scrolling_node_id_ == kInvalidNodeId) |
| 1083 ? (!other.CurrentlyScrollingNode()) | 1097 ? (!other.CurrentlyScrollingNode()) |
| 1084 : (other.CurrentlyScrollingNode() && | 1098 : (other.CurrentlyScrollingNode() && |
| 1085 currently_scrolling_node_id_ == | 1099 currently_scrolling_node_id_ == |
| 1086 other.CurrentlyScrollingNode()->id); | 1100 other.CurrentlyScrollingNode()->id); |
| 1087 | 1101 |
| 1088 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; | 1102 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; |
| 1089 } | 1103 } |
| 1090 | 1104 |
| 1091 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { | 1105 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { |
| 1092 DCHECK(!proto->has_property_type()); | 1106 DCHECK(!proto->has_property_type()); |
| 1093 proto->set_property_type(proto::PropertyTree::Scroll); | 1107 proto->set_property_type(proto::PropertyTree::Scroll); |
| 1094 | 1108 |
| 1095 PropertyTree::ToProtobuf(proto); | 1109 PropertyTree::ToProtobuf(proto); |
| 1096 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); | 1110 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); |
| 1097 | 1111 |
| 1098 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); | 1112 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); |
| 1099 for (auto i : layer_id_to_scroll_offset_map_) { | 1113 for (const auto& i : layer_id_to_scroll_offset_map_) { |
| 1100 data->add_layer_id_to_scroll_offset_map(); | 1114 data->add_layer_id_to_scroll_offset_map(); |
| 1101 proto::ScrollOffsetMapEntry* entry = | 1115 proto::ScrollOffsetMapEntry* entry = |
| 1102 data->mutable_layer_id_to_scroll_offset_map( | 1116 data->mutable_layer_id_to_scroll_offset_map( |
| 1103 data->layer_id_to_scroll_offset_map_size() - 1); | 1117 data->layer_id_to_scroll_offset_map_size() - 1); |
| 1104 entry->set_layer_id(i.first); | 1118 entry->set_layer_id(i.first); |
| 1105 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); | 1119 SyncedScrollOffsetToProto(*i.second.synced_offset.get(), |
| 1120 entry->mutable_scroll_offset()); |
| 1121 ScrollOffsetToProto(i.second.overscroll, entry->mutable_overscroll()); |
| 1106 } | 1122 } |
| 1107 } | 1123 } |
| 1108 | 1124 |
| 1109 void ScrollTree::FromProtobuf( | 1125 void ScrollTree::FromProtobuf( |
| 1110 const proto::PropertyTree& proto, | 1126 const proto::PropertyTree& proto, |
| 1111 std::unordered_map<int, int>* node_id_to_index_map) { | 1127 std::unordered_map<int, int>* node_id_to_index_map) { |
| 1112 DCHECK(proto.has_property_type()); | 1128 DCHECK(proto.has_property_type()); |
| 1113 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); | 1129 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); |
| 1114 | 1130 |
| 1115 PropertyTree::FromProtobuf(proto, node_id_to_index_map); | 1131 PropertyTree::FromProtobuf(proto, node_id_to_index_map); |
| 1116 const proto::ScrollTreeData& data = proto.scroll_tree_data(); | 1132 const proto::ScrollTreeData& data = proto.scroll_tree_data(); |
| 1117 | 1133 |
| 1118 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); | 1134 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); |
| 1119 | 1135 |
| 1120 // TODO(khushalsagar): This should probably be removed if the copy constructor | 1136 // TODO(khushalsagar): This should probably be removed if the copy constructor |
| 1121 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. | 1137 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. |
| 1122 layer_id_to_scroll_offset_map_.clear(); | 1138 layer_id_to_scroll_offset_map_.clear(); |
| 1123 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { | 1139 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { |
| 1124 const proto::ScrollOffsetMapEntry entry = | 1140 const proto::ScrollOffsetMapEntry entry = |
| 1125 data.layer_id_to_scroll_offset_map(i); | 1141 data.layer_id_to_scroll_offset_map(i); |
| 1126 layer_id_to_scroll_offset_map_[entry.layer_id()] = new SyncedScrollOffset(); | 1142 ScrollWithOverscroll* scroll = GetOrCreate(entry.layer_id()); |
| 1127 ProtoToSyncedScrollOffset( | 1143 scroll->synced_offset = new SyncedScrollOffset(); |
| 1128 entry.scroll_offset(), | 1144 ProtoToSyncedScrollOffset(entry.scroll_offset(), |
| 1129 layer_id_to_scroll_offset_map_[entry.layer_id()].get()); | 1145 scroll->synced_offset.get()); |
| 1146 scroll->overscroll = ProtoToScrollOffset(entry.overscroll()); |
| 1130 } | 1147 } |
| 1131 } | 1148 } |
| 1132 | 1149 |
| 1133 void ScrollTree::clear() { | 1150 void ScrollTree::clear() { |
| 1134 PropertyTree<ScrollNode>::clear(); | 1151 PropertyTree<ScrollNode>::clear(); |
| 1135 | 1152 |
| 1136 if (property_trees()->is_main_thread) { | 1153 if (property_trees()->is_main_thread) { |
| 1137 currently_scrolling_node_id_ = kInvalidNodeId; | 1154 currently_scrolling_node_id_ = kInvalidNodeId; |
| 1138 layer_id_to_scroll_offset_map_.clear(); | 1155 layer_id_to_scroll_offset_map_.clear(); |
| 1139 } | 1156 } |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 gfx::Transform screen_space_transform( | 1233 gfx::Transform screen_space_transform( |
| 1217 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), | 1234 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), |
| 1218 scroll_node->offset_to_transform_parent.y()); | 1235 scroll_node->offset_to_transform_parent.y()); |
| 1219 screen_space_transform.ConcatTransform( | 1236 screen_space_transform.ConcatTransform( |
| 1220 transform_tree.ToScreen(transform_node->id)); | 1237 transform_tree.ToScreen(transform_node->id)); |
| 1221 if (scroll_node->should_flatten) | 1238 if (scroll_node->should_flatten) |
| 1222 screen_space_transform.FlattenTo2d(); | 1239 screen_space_transform.FlattenTo2d(); |
| 1223 return screen_space_transform; | 1240 return screen_space_transform; |
| 1224 } | 1241 } |
| 1225 | 1242 |
| 1243 ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrCreate(int layer_id) { |
| 1244 auto it = layer_id_to_scroll_offset_map_.find(layer_id); |
| 1245 if (it == layer_id_to_scroll_offset_map_.end()) { |
| 1246 it = |
| 1247 layer_id_to_scroll_offset_map_.emplace(layer_id, ScrollWithOverscroll()) |
| 1248 .first; |
| 1249 it->second.synced_offset = new SyncedScrollOffset; |
| 1250 } |
| 1251 return &it->second; |
| 1252 } |
| 1253 |
| 1254 const ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrNull( |
| 1255 int layer_id) const { |
| 1256 auto it = layer_id_to_scroll_offset_map_.find(layer_id); |
| 1257 if (it == layer_id_to_scroll_offset_map_.end()) |
| 1258 return nullptr; |
| 1259 return &it->second; |
| 1260 } |
| 1261 |
| 1226 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { | 1262 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { |
| 1227 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1263 return GetOrCreate(layer_id)->synced_offset.get(); |
| 1228 layer_id_to_scroll_offset_map_.end()) { | |
| 1229 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset; | |
| 1230 } | |
| 1231 return layer_id_to_scroll_offset_map_[layer_id].get(); | |
| 1232 } | 1264 } |
| 1233 | 1265 |
| 1234 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { | 1266 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { |
| 1235 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1267 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1236 layer_id_to_scroll_offset_map_.end()) { | 1268 return scroll ? scroll->synced_offset.get() : nullptr; |
| 1237 return nullptr; | |
| 1238 } | |
| 1239 return layer_id_to_scroll_offset_map_.at(layer_id).get(); | |
| 1240 } | 1269 } |
| 1241 | 1270 |
| 1242 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { | 1271 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { |
| 1243 return synced_scroll_offset(layer_id) | 1272 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1244 ? synced_scroll_offset(layer_id)->Current( | 1273 return scroll ? scroll->synced_offset->Current(property_trees()->is_active) |
| 1245 property_trees()->is_active) | 1274 : gfx::ScrollOffset(); |
| 1246 : gfx::ScrollOffset(); | 1275 } |
| 1276 |
| 1277 const gfx::ScrollOffset ScrollTree::current_overscroll(int layer_id) const { |
| 1278 const ScrollWithOverscroll* scroll = GetOrNull(layer_id); |
| 1279 return scroll ? scroll->overscroll : gfx::ScrollOffset(); |
| 1247 } | 1280 } |
| 1248 | 1281 |
| 1249 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( | 1282 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( |
| 1250 SyncedScrollOffset* scroll_offset) { | 1283 SyncedScrollOffset* scroll_offset) { |
| 1251 // TODO(miletus): Remove all this temporary flooring machinery when | 1284 // TODO(miletus): Remove all this temporary flooring machinery when |
| 1252 // Blink fully supports fractional scrolls. | 1285 // Blink fully supports fractional scrolls. |
| 1253 gfx::ScrollOffset current_offset = | 1286 gfx::ScrollOffset current_offset = |
| 1254 scroll_offset->Current(property_trees()->is_active); | 1287 scroll_offset->Current(property_trees()->is_active); |
| 1255 gfx::ScrollOffset current_delta = property_trees()->is_active | 1288 gfx::ScrollOffset current_delta = property_trees()->is_active |
| 1256 ? scroll_offset->Delta() | 1289 ? scroll_offset->Delta() |
| 1257 : scroll_offset->PendingDelta().get(); | 1290 : scroll_offset->PendingDelta().get(); |
| 1258 gfx::ScrollOffset floored_delta(floor(current_delta.x()), | 1291 gfx::ScrollOffset floored_delta(floor(current_delta.x()), |
| 1259 floor(current_delta.y())); | 1292 floor(current_delta.y())); |
| 1260 gfx::ScrollOffset diff_delta = floored_delta - current_delta; | 1293 gfx::ScrollOffset diff_delta = floored_delta - current_delta; |
| 1261 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; | 1294 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; |
| 1262 scroll_offset->SetCurrent(tmp_offset); | 1295 scroll_offset->SetCurrent(tmp_offset); |
| 1263 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); | 1296 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); |
| 1264 scroll_offset->SetCurrent(current_offset); | 1297 scroll_offset->SetCurrent(current_offset); |
| 1265 return delta; | 1298 return delta; |
| 1266 } | 1299 } |
| 1267 | 1300 |
| 1268 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 1301 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
| 1269 int inner_viewport_layer_id) { | 1302 int inner_viewport_layer_id) { |
| 1270 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1303 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1271 gfx::ScrollOffset scroll_delta = | 1304 gfx::ScrollOffset scroll_delta = |
| 1272 PullDeltaForMainThread(map_entry.second.get()); | 1305 PullDeltaForMainThread(map_entry.second.synced_offset.get()); |
| 1273 | 1306 gfx::ScrollOffset overscroll = map_entry.second.overscroll; |
| 1274 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); | 1307 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); |
| 1275 int layer_id = map_entry.first; | 1308 int layer_id = map_entry.first; |
| 1276 | 1309 |
| 1277 if (!scroll_delta.IsZero()) { | 1310 if (!scroll_delta.IsZero() || !overscroll.IsZero()) { |
| 1278 if (layer_id == inner_viewport_layer_id) { | 1311 if (layer_id == inner_viewport_layer_id) { |
| 1279 // Inner (visual) viewport is stored separately. | 1312 // Inner (visual) viewport is stored separately. |
| 1280 scroll_info->inner_viewport_scroll.layer_id = layer_id; | 1313 scroll_info->inner_viewport_scroll.layer_id = layer_id; |
| 1281 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; | 1314 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; |
| 1315 scroll_info->inner_viewport_scroll.overscroll = overscroll; |
| 1282 } else { | 1316 } else { |
| 1283 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 1317 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
| 1284 scroll.layer_id = layer_id; | 1318 scroll.layer_id = layer_id; |
| 1285 scroll.scroll_delta = scroll_delta_vector; | 1319 scroll.scroll_delta = scroll_delta_vector; |
| 1286 scroll_info->scrolls.push_back(scroll); | 1320 scroll.overscroll = overscroll; |
| 1321 scroll_info->scrolls.push_back(std::move(scroll)); |
| 1287 } | 1322 } |
| 1288 } | 1323 } |
| 1289 } | 1324 } |
| 1290 } | 1325 } |
| 1291 | 1326 |
| 1292 void ScrollTree::CollectScrollDeltasForTesting() { | 1327 void ScrollTree::CollectScrollDeltasForTesting() { |
| 1293 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1328 for (const auto& map_entry : layer_id_to_scroll_offset_map_) { |
| 1294 PullDeltaForMainThread(map_entry.second.get()); | 1329 PullDeltaForMainThread(map_entry.second.synced_offset.get()); |
| 1295 } | 1330 } |
| 1296 } | 1331 } |
| 1297 | 1332 |
| 1298 void ScrollTree::UpdateScrollOffsetMapEntry( | 1333 void ScrollTree::UpdateScrollOffsetMapEntry( |
| 1299 int key, | 1334 int key, |
| 1300 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1335 ScrollOffsetMap* new_scroll_offset_map, |
| 1301 LayerTreeImpl* layer_tree_impl) { | 1336 LayerTreeImpl* layer_tree_impl) { |
| 1302 bool changed = false; | 1337 bool changed = false; |
| 1303 // If we are pushing scroll offset from main to pending tree, we create a new | 1338 // If we are pushing scroll offset from main to pending tree, we create a new |
| 1304 // instance of synced scroll offset; if we are pushing from pending to active, | 1339 // instance of synced scroll offset; if we are pushing from pending to active, |
| 1305 // we reuse the pending tree's value in the map. | 1340 // we reuse the pending tree's value in the map. |
| 1341 ScrollWithOverscroll& other_scroll = new_scroll_offset_map->at(key); |
| 1306 if (!property_trees()->is_active) { | 1342 if (!property_trees()->is_active) { |
| 1307 changed = synced_scroll_offset(key)->PushFromMainThread( | 1343 ScrollWithOverscroll& this_scroll = *GetOrCreate(key); |
| 1308 new_scroll_offset_map->at(key)->PendingBase()); | 1344 changed = this_scroll.synced_offset->PushFromMainThread( |
| 1345 other_scroll.synced_offset->PendingBase()); |
| 1309 | 1346 |
| 1310 if (new_scroll_offset_map->at(key)->clobber_active_value()) { | 1347 if (other_scroll.synced_offset->clobber_active_value()) { |
| 1311 synced_scroll_offset(key)->set_clobber_active_value(); | 1348 this_scroll.synced_offset->set_clobber_active_value(); |
| 1312 } | 1349 } |
| 1350 changed |= this_scroll.overscroll != other_scroll.overscroll; |
| 1351 this_scroll.overscroll = other_scroll.overscroll; |
| 1313 if (changed) { | 1352 if (changed) { |
| 1314 layer_tree_impl->DidUpdateScrollOffset(key, kInvalidNodeId); | 1353 layer_tree_impl->DidUpdateScrollOffset(key, kInvalidNodeId); |
| 1315 } | 1354 } |
| 1316 } else { | 1355 } else { |
| 1317 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key); | 1356 ScrollWithOverscroll& this_scroll = layer_id_to_scroll_offset_map_[key]; |
| 1318 changed |= synced_scroll_offset(key)->PushPendingToActive(); | 1357 this_scroll.synced_offset = other_scroll.synced_offset; |
| 1319 if (changed) { | 1358 // Nothing to do for overscroll. |
| 1359 changed |= this_scroll.synced_offset->PushPendingToActive(); |
| 1360 if (changed) |
| 1320 layer_tree_impl->DidUpdateScrollOffset(key, kInvalidNodeId); | 1361 layer_tree_impl->DidUpdateScrollOffset(key, kInvalidNodeId); |
| 1321 } | |
| 1322 } | 1362 } |
| 1323 } | 1363 } |
| 1324 | 1364 |
| 1325 void ScrollTree::UpdateScrollOffsetMap( | 1365 void ScrollTree::UpdateScrollOffsetMap(ScrollTree* scroll_tree, |
| 1326 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1366 LayerTreeImpl* layer_tree_impl) { |
| 1327 LayerTreeImpl* layer_tree_impl) { | 1367 ScrollOffsetMap* new_scroll_offset_map = |
| 1368 &scroll_tree->layer_id_to_scroll_offset_map_; |
| 1328 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { | 1369 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { |
| 1329 DCHECK(!property_trees()->is_main_thread); | 1370 DCHECK(!property_trees()->is_main_thread); |
| 1330 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); | 1371 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); |
| 1331 map_entry != layer_id_to_scroll_offset_map_.end();) { | 1372 map_entry != layer_id_to_scroll_offset_map_.end();) { |
| 1332 int key = map_entry->first; | 1373 int key = map_entry->first; |
| 1333 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { | 1374 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { |
| 1334 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | 1375 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); |
| 1335 ++map_entry; | 1376 ++map_entry; |
| 1336 } else { | 1377 } else { |
| 1337 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); | 1378 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); |
| 1338 } | 1379 } |
| 1339 } | 1380 } |
| 1340 | 1381 |
| 1341 for (auto& map_entry : *new_scroll_offset_map) { | 1382 for (auto& map_entry : *new_scroll_offset_map) { |
| 1342 int key = map_entry.first; | 1383 int key = map_entry.first; |
| 1343 if (layer_id_to_scroll_offset_map_.find(key) == | 1384 if (layer_id_to_scroll_offset_map_.find(key) == |
| 1344 layer_id_to_scroll_offset_map_.end()) | 1385 layer_id_to_scroll_offset_map_.end()) |
| 1345 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | 1386 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); |
| 1346 } | 1387 } |
| 1347 } | 1388 } |
| 1348 } | 1389 } |
| 1349 | 1390 |
| 1350 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() { | 1391 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map_for_test() |
| 1351 return layer_id_to_scroll_offset_map_; | 1392 const { |
| 1352 } | |
| 1353 | |
| 1354 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const { | |
| 1355 return layer_id_to_scroll_offset_map_; | 1393 return layer_id_to_scroll_offset_map_; |
| 1356 } | 1394 } |
| 1357 | 1395 |
| 1358 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { | 1396 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { |
| 1359 DCHECK(property_trees()->is_active); | 1397 DCHECK(property_trees()->is_active); |
| 1360 for (auto& map_entry : layer_id_to_scroll_offset_map_) | 1398 for (auto& map_entry : layer_id_to_scroll_offset_map_) |
| 1361 map_entry.second->AbortCommit(); | 1399 map_entry.second.synced_offset->AbortCommit(); |
| 1362 } | 1400 } |
| 1363 | 1401 |
| 1364 bool ScrollTree::SetBaseScrollOffset(int layer_id, | 1402 void ScrollTree::SetBaseScrollOffset(int layer_id, |
| 1365 const gfx::ScrollOffset& scroll_offset) { | 1403 const gfx::ScrollOffset& scroll_offset, |
| 1366 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1404 const gfx::ScrollOffset& overscroll) { |
| 1405 ScrollWithOverscroll* scroll = GetOrCreate(layer_id); |
| 1406 scroll->overscroll = overscroll; |
| 1407 scroll->synced_offset->PushFromMainThread(scroll_offset); |
| 1367 } | 1408 } |
| 1368 | 1409 |
| 1369 bool ScrollTree::SetScrollOffset(int layer_id, | 1410 bool ScrollTree::SetScrollOffset(int layer_id, |
| 1370 const gfx::ScrollOffset& scroll_offset) { | 1411 const gfx::ScrollOffset& scroll_offset, |
| 1412 const gfx::ScrollOffset& overscroll) { |
| 1413 ScrollWithOverscroll* scroll = GetOrCreate(layer_id); |
| 1414 bool change = scroll->overscroll != overscroll; |
| 1415 scroll->overscroll = overscroll; |
| 1416 |
| 1371 if (property_trees()->is_main_thread) | 1417 if (property_trees()->is_main_thread) |
| 1372 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1418 change |= synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); |
| 1373 else if (property_trees()->is_active) | 1419 else if (property_trees()->is_active) |
| 1374 return synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); | 1420 change |= synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); |
| 1375 return false; | 1421 return change; |
| 1422 } |
| 1423 |
| 1424 void ScrollTree::SetScrollOffsetClobberActiveValue(int layer_id) { |
| 1425 GetOrCreate(layer_id)->synced_offset->set_clobber_active_value(); |
| 1376 } | 1426 } |
| 1377 | 1427 |
| 1378 bool ScrollTree::UpdateScrollOffsetBaseForTesting( | 1428 bool ScrollTree::UpdateScrollOffsetBaseForTesting( |
| 1379 int layer_id, | 1429 int layer_id, |
| 1380 const gfx::ScrollOffset& offset) { | 1430 const gfx::ScrollOffset& offset) { |
| 1381 DCHECK(!property_trees()->is_main_thread); | 1431 DCHECK(!property_trees()->is_main_thread); |
| 1382 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); | 1432 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); |
| 1383 if (property_trees()->is_active) | 1433 if (property_trees()->is_active) |
| 1384 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); | 1434 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); |
| 1385 return changed; | 1435 return changed; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 LayerTreeImpl* layer_tree_impl) { | 1487 LayerTreeImpl* layer_tree_impl) { |
| 1438 gfx::ScrollOffset adjusted_scroll(scroll); | 1488 gfx::ScrollOffset adjusted_scroll(scroll); |
| 1439 if (!scroll_node->user_scrollable_horizontal) | 1489 if (!scroll_node->user_scrollable_horizontal) |
| 1440 adjusted_scroll.set_x(0); | 1490 adjusted_scroll.set_x(0); |
| 1441 if (!scroll_node->user_scrollable_vertical) | 1491 if (!scroll_node->user_scrollable_vertical) |
| 1442 adjusted_scroll.set_y(0); | 1492 adjusted_scroll.set_y(0); |
| 1443 DCHECK(scroll_node->scrollable); | 1493 DCHECK(scroll_node->scrollable); |
| 1444 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); | 1494 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); |
| 1445 gfx::ScrollOffset new_offset = | 1495 gfx::ScrollOffset new_offset = |
| 1446 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); | 1496 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); |
| 1447 if (SetScrollOffset(scroll_node->owner_id, new_offset)) | 1497 gfx::ScrollOffset overscroll = current_overscroll(scroll_node->owner_id); |
| 1498 if (SetScrollOffset(scroll_node->owner_id, new_offset, overscroll)) { |
| 1448 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, | 1499 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, |
| 1449 scroll_node->transform_id); | 1500 scroll_node->transform_id); |
| 1501 } |
| 1450 | 1502 |
| 1451 gfx::ScrollOffset unscrolled = | 1503 gfx::ScrollOffset unscrolled = |
| 1452 old_offset + gfx::ScrollOffset(scroll) - new_offset; | 1504 old_offset + gfx::ScrollOffset(scroll) - new_offset; |
| 1453 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); | 1505 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); |
| 1454 } | 1506 } |
| 1455 | 1507 |
| 1456 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( | 1508 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( |
| 1457 gfx::ScrollOffset offset, | 1509 gfx::ScrollOffset offset, |
| 1458 ScrollNode* scroll_node) const { | 1510 ScrollNode* scroll_node) const { |
| 1459 offset.SetToMin(MaxScrollOffset(scroll_node->id)); | 1511 offset.SetToMin(MaxScrollOffset(scroll_node->id)); |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1980 if (transform_id > destination_transform_id) { | 2032 if (transform_id > destination_transform_id) { |
| 1981 return transform_tree.CombineTransformsBetween( | 2033 return transform_tree.CombineTransformsBetween( |
| 1982 transform_id, destination_transform_id, transform); | 2034 transform_id, destination_transform_id, transform); |
| 1983 } | 2035 } |
| 1984 | 2036 |
| 1985 return transform_tree.CombineInversesBetween( | 2037 return transform_tree.CombineInversesBetween( |
| 1986 transform_id, destination_transform_id, transform); | 2038 transform_id, destination_transform_id, transform); |
| 1987 } | 2039 } |
| 1988 | 2040 |
| 1989 } // namespace cc | 2041 } // namespace cc |
| OLD | NEW |