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

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

Issue 1680613002: Adding momentum/overscroll to views:: ScrollViews Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix Tableview layout. aaaand I think we are done 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
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 658 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698