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

Side by Side Diff: cc/trees/property_tree.cc

Issue 2189583004: [not for review - epic CL] Adding Elastic+Momentum+Layered scrolling to views::ScrollView Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Combined rebase Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698