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

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

Issue 2194833002: Overscroll and Elasticity for views::ScrollView Base URL: https://chromium.googlesource.com/chromium/src.git@20160728-MacViews-RouteThroughInputHandler
Patch Set: Restore functionality and fix bugs \o/ Created 4 years, 1 month 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"
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 if (node->affected_by_inner_viewport_bounds_delta_x) 538 if (node->affected_by_inner_viewport_bounds_delta_x)
539 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); 539 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x());
540 else if (node->affected_by_outer_viewport_bounds_delta_x) 540 else if (node->affected_by_outer_viewport_bounds_delta_x)
541 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); 541 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x());
542 542
543 if (node->affected_by_inner_viewport_bounds_delta_y) 543 if (node->affected_by_inner_viewport_bounds_delta_y)
544 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); 544 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y());
545 else if (node->affected_by_outer_viewport_bounds_delta_y) 545 else if (node->affected_by_outer_viewport_bounds_delta_y)
546 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); 546 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y());
547 547
548 transform.Translate(node->source_to_parent.x() - node->scroll_offset.x() + 548 transform.Translate(
549 fixed_position_adjustment.x(), 549 node->source_to_parent.x() - node->scroll_offset_with_overscroll.x() +
550 node->source_to_parent.y() - node->scroll_offset.y() + 550 fixed_position_adjustment.x(),
551 fixed_position_adjustment.y()); 551 node->source_to_parent.y() - node->scroll_offset_with_overscroll.y() +
552 fixed_position_adjustment.y());
552 transform.Translate(StickyPositionOffset(this, node)); 553 transform.Translate(StickyPositionOffset(this, node));
553 transform.PreconcatTransform(node->local); 554 transform.PreconcatTransform(node->local);
554 transform.PreconcatTransform(node->pre_local); 555 transform.PreconcatTransform(node->pre_local);
555 556
556 node->set_to_parent(transform); 557 node->set_to_parent(transform);
557 node->needs_local_transform_update = false; 558 node->needs_local_transform_update = false;
558 } 559 }
559 560
560 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, 561 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node,
561 TransformNode* parent_node, 562 TransformNode* parent_node,
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1241 1242
1242 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1243 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1243 const proto::EffectTreeData& data = proto.effect_tree_data(); 1244 const proto::EffectTreeData& data = proto.effect_tree_data();
1244 1245
1245 DCHECK(mask_layer_ids_.empty()); 1246 DCHECK(mask_layer_ids_.empty());
1246 for (int i = 0; i < data.mask_layer_ids_size(); ++i) { 1247 for (int i = 0; i < data.mask_layer_ids_size(); ++i) {
1247 mask_layer_ids_.push_back(data.mask_layer_ids(i)); 1248 mask_layer_ids_.push_back(data.mask_layer_ids(i));
1248 } 1249 }
1249 } 1250 }
1250 1251
1252 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll() {}
1253 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll(
1254 ScrollWithOverscroll&& rhs) = default;
1255 ScrollTree::ScrollWithOverscroll::~ScrollWithOverscroll() {}
1256
1251 ScrollTree::ScrollTree() 1257 ScrollTree::ScrollTree()
1252 : currently_scrolling_node_id_(kInvalidNodeId), 1258 : currently_scrolling_node_id_(kInvalidNodeId),
1253 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} 1259 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {}
1254 1260
1255 ScrollTree::~ScrollTree() {} 1261 ScrollTree::~ScrollTree() {}
1256 1262
1257 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { 1263 ScrollTree& ScrollTree::operator=(const ScrollTree& from) {
1258 PropertyTree::operator=(from); 1264 PropertyTree::operator=(from);
1259 currently_scrolling_node_id_ = kInvalidNodeId; 1265 currently_scrolling_node_id_ = kInvalidNodeId;
1260 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, 1266 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=,
1261 // because we do not want to simply copy the map when property tree is 1267 // because we do not want to simply copy the map when property tree is
1262 // propagating from pending to active. 1268 // propagating from pending to active.
1263 // In the main to pending case, we do want to copy it, but this can be done by 1269 // In the main to pending case, we do want to copy it, but this can be done by
1264 // calling UpdateScrollOffsetMap after the assignment; 1270 // calling UpdateScrollOffsetMap after the assignment;
1265 // In the other case, we want pending and active property trees to share the 1271 // In the other case, we want pending and active property trees to share the
1266 // same map. 1272 // same map.
1267 return *this; 1273 return *this;
1268 } 1274 }
1269 1275
1270 bool ScrollTree::operator==(const ScrollTree& other) const { 1276 bool ScrollTree::operator==(const ScrollTree& other) const {
1271 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map = 1277 const ScrollOffsetMap& other_scroll_offset_map =
1272 other.scroll_offset_map(); 1278 other.layer_id_to_scroll_offset_map_;
1273 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) 1279 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size())
1274 return false; 1280 return false;
1275 1281
1276 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1282 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1277 int key = map_entry.first; 1283 int key = map_entry.first;
1278 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() || 1284 auto other_entry_it = other_scroll_offset_map.find(key);
1279 map_entry.second != layer_id_to_scroll_offset_map_.at(key)) 1285 if (other_entry_it == other_scroll_offset_map.end() ||
1286 map_entry.second != other_entry_it->second)
1280 return false; 1287 return false;
1281 } 1288 }
1282 1289
1283 bool is_currently_scrolling_node_equal = 1290 bool is_currently_scrolling_node_equal =
1284 currently_scrolling_node_id_ == other.currently_scrolling_node_id_; 1291 currently_scrolling_node_id_ == other.currently_scrolling_node_id_;
1285 1292
1286 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; 1293 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal;
1287 } 1294 }
1288 1295
1289 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { 1296 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const {
1290 DCHECK(!proto->has_property_type()); 1297 DCHECK(!proto->has_property_type());
1291 proto->set_property_type(proto::PropertyTree::Scroll); 1298 proto->set_property_type(proto::PropertyTree::Scroll);
1292 1299
1293 PropertyTree::ToProtobuf(proto); 1300 PropertyTree::ToProtobuf(proto);
1294 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); 1301 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data();
1295 1302
1296 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); 1303 data->set_currently_scrolling_node_id(currently_scrolling_node_id_);
1297 for (auto i : layer_id_to_scroll_offset_map_) { 1304 for (const auto& i : layer_id_to_scroll_offset_map_) {
1298 data->add_layer_id_to_scroll_offset_map(); 1305 data->add_layer_id_to_scroll_offset_map();
1299 proto::ScrollOffsetMapEntry* entry = 1306 proto::ScrollOffsetMapEntry* entry =
1300 data->mutable_layer_id_to_scroll_offset_map( 1307 data->mutable_layer_id_to_scroll_offset_map(
1301 data->layer_id_to_scroll_offset_map_size() - 1); 1308 data->layer_id_to_scroll_offset_map_size() - 1);
1302 entry->set_layer_id(i.first); 1309 entry->set_layer_id(i.first);
1303 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); 1310 SyncedScrollOffsetToProto(*i.second.synced_offset.get(),
1311 entry->mutable_scroll_offset());
1312 ScrollOffsetToProto(i.second.overscroll, entry->mutable_overscroll());
1304 } 1313 }
1305 } 1314 }
1306 1315
1307 void ScrollTree::FromProtobuf( 1316 void ScrollTree::FromProtobuf(
1308 const proto::PropertyTree& proto, 1317 const proto::PropertyTree& proto,
1309 std::unordered_map<int, int>* node_id_to_index_map) { 1318 std::unordered_map<int, int>* node_id_to_index_map) {
1310 DCHECK(proto.has_property_type()); 1319 DCHECK(proto.has_property_type());
1311 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1320 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1312 1321
1313 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1322 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1314 const proto::ScrollTreeData& data = proto.scroll_tree_data(); 1323 const proto::ScrollTreeData& data = proto.scroll_tree_data();
1315 1324
1316 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); 1325 currently_scrolling_node_id_ = data.currently_scrolling_node_id();
1317 1326
1318 // TODO(khushalsagar): This should probably be removed if the copy constructor 1327 // TODO(khushalsagar): This should probably be removed if the copy constructor
1319 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. 1328 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well.
1320 layer_id_to_scroll_offset_map_.clear(); 1329 layer_id_to_scroll_offset_map_.clear();
1321 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { 1330 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) {
1322 const proto::ScrollOffsetMapEntry entry = 1331 const proto::ScrollOffsetMapEntry entry =
1323 data.layer_id_to_scroll_offset_map(i); 1332 data.layer_id_to_scroll_offset_map(i);
1324 layer_id_to_scroll_offset_map_[entry.layer_id()] = new SyncedScrollOffset(); 1333 ScrollWithOverscroll* scroll = GetOrCreate(entry.layer_id());
1325 ProtoToSyncedScrollOffset( 1334 scroll->synced_offset = new SyncedScrollOffset();
1326 entry.scroll_offset(), 1335 ProtoToSyncedScrollOffset(entry.scroll_offset(),
1327 layer_id_to_scroll_offset_map_[entry.layer_id()].get()); 1336 scroll->synced_offset.get());
1337 scroll->overscroll = ProtoToScrollOffset(entry.overscroll());
1328 } 1338 }
1329 } 1339 }
1330 1340
1331 void ScrollTree::clear() { 1341 void ScrollTree::clear() {
1332 PropertyTree<ScrollNode>::clear(); 1342 PropertyTree<ScrollNode>::clear();
1333 1343
1334 if (property_trees()->is_main_thread) { 1344 if (property_trees()->is_main_thread) {
1335 currently_scrolling_node_id_ = kInvalidNodeId; 1345 currently_scrolling_node_id_ = kInvalidNodeId;
1336 layer_id_to_scroll_offset_map_.clear(); 1346 layer_id_to_scroll_offset_map_.clear();
1337 } 1347 }
1338 1348
1339 #if DCHECK_IS_ON() 1349 #if DCHECK_IS_ON()
1340 ScrollTree tree; 1350 ScrollTree tree;
1341 if (!property_trees()->is_main_thread) { 1351 if (!property_trees()->is_main_thread) {
1342 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_; 1352 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_;
1343 tree.layer_id_to_scroll_offset_map_ = layer_id_to_scroll_offset_map_; 1353 // tree.layer_id_to_scroll_offset_map_ = layer_id_to_scroll_offset_map_;
1344 } 1354 }
1345 DCHECK(tree == *this); 1355 DCHECK(tree == *this);
1346 #endif 1356 #endif
1347 } 1357 }
1348 1358
1349 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { 1359 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
1350 const ScrollNode* scroll_node = Node(scroll_node_id); 1360 const ScrollNode* scroll_node = Node(scroll_node_id);
1351 gfx::SizeF scroll_bounds = 1361 gfx::SizeF scroll_bounds =
1352 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height()); 1362 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height());
1353 1363
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 gfx::Transform screen_space_transform( 1456 gfx::Transform screen_space_transform(
1447 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), 1457 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(),
1448 scroll_node->offset_to_transform_parent.y()); 1458 scroll_node->offset_to_transform_parent.y());
1449 screen_space_transform.ConcatTransform( 1459 screen_space_transform.ConcatTransform(
1450 transform_tree.ToScreen(transform_node->id)); 1460 transform_tree.ToScreen(transform_node->id));
1451 if (scroll_node->should_flatten) 1461 if (scroll_node->should_flatten)
1452 screen_space_transform.FlattenTo2d(); 1462 screen_space_transform.FlattenTo2d();
1453 return screen_space_transform; 1463 return screen_space_transform;
1454 } 1464 }
1455 1465
1466 ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrCreate(int layer_id) {
1467 auto it = layer_id_to_scroll_offset_map_.find(layer_id);
1468 if (it == layer_id_to_scroll_offset_map_.end()) {
1469 it =
1470 layer_id_to_scroll_offset_map_.emplace(layer_id, ScrollWithOverscroll())
1471 .first;
1472 it->second.synced_offset = new SyncedScrollOffset;
1473 }
1474 return &it->second;
1475 }
1476
1477 const ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrNull(
1478 int layer_id) const {
1479 auto it = layer_id_to_scroll_offset_map_.find(layer_id);
1480 if (it == layer_id_to_scroll_offset_map_.end())
1481 return nullptr;
1482 return &it->second;
1483 }
1484
1456 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { 1485 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) {
1457 if (layer_id_to_scroll_offset_map_.find(layer_id) == 1486 return GetOrCreate(layer_id)->synced_offset.get();
1458 layer_id_to_scroll_offset_map_.end()) {
1459 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset;
1460 }
1461 return layer_id_to_scroll_offset_map_[layer_id].get();
1462 } 1487 }
1463 1488
1464 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { 1489 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const {
1465 if (layer_id_to_scroll_offset_map_.find(layer_id) == 1490 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1466 layer_id_to_scroll_offset_map_.end()) { 1491 return scroll ? scroll->synced_offset.get() : nullptr;
1467 return nullptr;
1468 }
1469 return layer_id_to_scroll_offset_map_.at(layer_id).get();
1470 } 1492 }
1471 1493
1472 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { 1494 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const {
1473 return synced_scroll_offset(layer_id) 1495 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1474 ? synced_scroll_offset(layer_id)->Current( 1496 return scroll ? scroll->synced_offset->Current(property_trees()->is_active)
1475 property_trees()->is_active) 1497 : gfx::ScrollOffset();
1476 : gfx::ScrollOffset(); 1498 }
1499
1500 const gfx::ScrollOffset ScrollTree::current_overscroll(int layer_id) const {
1501 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1502 return scroll ? scroll->overscroll : gfx::ScrollOffset();
1477 } 1503 }
1478 1504
1479 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( 1505 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread(
1480 SyncedScrollOffset* scroll_offset) { 1506 SyncedScrollOffset* scroll_offset) {
1481 // TODO(miletus): Remove all this temporary flooring machinery when 1507 // TODO(miletus): Remove all this temporary flooring machinery when
1482 // Blink fully supports fractional scrolls. 1508 // Blink fully supports fractional scrolls.
1483 gfx::ScrollOffset current_offset = 1509 gfx::ScrollOffset current_offset =
1484 scroll_offset->Current(property_trees()->is_active); 1510 scroll_offset->Current(property_trees()->is_active);
1485 gfx::ScrollOffset current_delta = property_trees()->is_active 1511 gfx::ScrollOffset current_delta = property_trees()->is_active
1486 ? scroll_offset->Delta() 1512 ? scroll_offset->Delta()
1487 : scroll_offset->PendingDelta().get(); 1513 : scroll_offset->PendingDelta().get();
1488 gfx::ScrollOffset floored_delta(floor(current_delta.x()), 1514 gfx::ScrollOffset floored_delta(floor(current_delta.x()),
1489 floor(current_delta.y())); 1515 floor(current_delta.y()));
1490 gfx::ScrollOffset diff_delta = floored_delta - current_delta; 1516 gfx::ScrollOffset diff_delta = floored_delta - current_delta;
1491 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; 1517 gfx::ScrollOffset tmp_offset = current_offset + diff_delta;
1492 scroll_offset->SetCurrent(tmp_offset); 1518 scroll_offset->SetCurrent(tmp_offset);
1493 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); 1519 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread();
1494 scroll_offset->SetCurrent(current_offset); 1520 scroll_offset->SetCurrent(current_offset);
1495 return delta; 1521 return delta;
1496 } 1522 }
1497 1523
1498 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 1524 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
1499 int inner_viewport_layer_id) { 1525 int inner_viewport_layer_id) {
1500 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1526 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1501 gfx::ScrollOffset scroll_delta = 1527 gfx::ScrollOffset scroll_delta =
1502 PullDeltaForMainThread(map_entry.second.get()); 1528 PullDeltaForMainThread(map_entry.second.synced_offset.get());
1503 1529 gfx::ScrollOffset overscroll = map_entry.second.overscroll;
1504 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); 1530 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y());
1505 int layer_id = map_entry.first; 1531 int layer_id = map_entry.first;
1506 1532
1507 if (!scroll_delta.IsZero()) { 1533 if (!scroll_delta.IsZero() || !overscroll.IsZero()) {
1508 if (layer_id == inner_viewport_layer_id) { 1534 if (layer_id == inner_viewport_layer_id) {
1509 // Inner (visual) viewport is stored separately. 1535 // Inner (visual) viewport is stored separately.
1510 scroll_info->inner_viewport_scroll.layer_id = layer_id; 1536 scroll_info->inner_viewport_scroll.layer_id = layer_id;
1511 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; 1537 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector;
1538 scroll_info->inner_viewport_scroll.overscroll = overscroll;
1512 } else { 1539 } else {
1513 LayerTreeHostCommon::ScrollUpdateInfo scroll; 1540 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1514 scroll.layer_id = layer_id; 1541 scroll.layer_id = layer_id;
1515 scroll.scroll_delta = scroll_delta_vector; 1542 scroll.scroll_delta = scroll_delta_vector;
1516 scroll_info->scrolls.push_back(scroll); 1543 scroll.overscroll = overscroll;
1544 scroll_info->scrolls.push_back(std::move(scroll));
1517 } 1545 }
1518 } 1546 }
1519 } 1547 }
1520 } 1548 }
1521 1549
1522 void ScrollTree::CollectScrollDeltasForTesting() { 1550 void ScrollTree::CollectScrollDeltasForTesting() {
1523 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1551 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1524 PullDeltaForMainThread(map_entry.second.get()); 1552 PullDeltaForMainThread(map_entry.second.synced_offset.get());
1525 } 1553 }
1526 } 1554 }
1527 1555
1528 void ScrollTree::UpdateScrollOffsetMapEntry( 1556 void ScrollTree::UpdateScrollOffsetMapEntry(
1529 int key, 1557 int key,
1530 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, 1558 ScrollOffsetMap* new_scroll_offset_map,
1531 LayerTreeImpl* layer_tree_impl) { 1559 LayerTreeImpl* layer_tree_impl) {
1532 bool changed = false; 1560 bool changed = false;
1533 // If we are pushing scroll offset from main to pending tree, we create a new 1561 // If we are pushing scroll offset from main to pending tree, we create a new
1534 // instance of synced scroll offset; if we are pushing from pending to active, 1562 // instance of synced scroll offset; if we are pushing from pending to active,
1535 // we reuse the pending tree's value in the map. 1563 // we reuse the pending tree's value in the map.
1564 ScrollWithOverscroll& other_scroll = new_scroll_offset_map->at(key);
1536 if (!property_trees()->is_active) { 1565 if (!property_trees()->is_active) {
1537 changed = synced_scroll_offset(key)->PushFromMainThread( 1566 ScrollWithOverscroll& this_scroll = *GetOrCreate(key);
1538 new_scroll_offset_map->at(key)->PendingBase()); 1567 changed = this_scroll.synced_offset->PushFromMainThread(
1568 other_scroll.synced_offset->PendingBase());
1539 1569
1540 if (new_scroll_offset_map->at(key)->clobber_active_value()) { 1570 if (other_scroll.synced_offset->clobber_active_value()) {
1541 synced_scroll_offset(key)->set_clobber_active_value(); 1571 this_scroll.synced_offset->set_clobber_active_value();
1542 } 1572 }
1573 changed |= this_scroll.overscroll != other_scroll.overscroll;
1574 this_scroll.overscroll = other_scroll.overscroll;
1543 if (changed) { 1575 if (changed) {
1544 layer_tree_impl->DidUpdateScrollOffset(key); 1576 layer_tree_impl->DidUpdateScrollOffset(key);
1545 } 1577 }
1546 } else { 1578 } else {
1547 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key); 1579 ScrollWithOverscroll& this_scroll = layer_id_to_scroll_offset_map_[key];
1548 changed |= synced_scroll_offset(key)->PushPendingToActive(); 1580 this_scroll.synced_offset = other_scroll.synced_offset;
1581 // Nothing to do for overscroll.
1582 changed |= this_scroll.synced_offset->PushPendingToActive();
1549 if (changed) { 1583 if (changed) {
1550 layer_tree_impl->DidUpdateScrollOffset(key); 1584 layer_tree_impl->DidUpdateScrollOffset(key);
1551 } 1585 }
1552 } 1586 }
1553 } 1587 }
1554 1588
1555 void ScrollTree::UpdateScrollOffsetMap( 1589 void ScrollTree::UpdateScrollOffsetMap(ScrollTree* scroll_tree,
1556 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, 1590 LayerTreeImpl* layer_tree_impl) {
1557 LayerTreeImpl* layer_tree_impl) { 1591 ScrollOffsetMap* new_scroll_offset_map =
1592 &scroll_tree->layer_id_to_scroll_offset_map_;
1558 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { 1593 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) {
1559 DCHECK(!property_trees()->is_main_thread); 1594 DCHECK(!property_trees()->is_main_thread);
1560 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); 1595 for (auto map_entry = layer_id_to_scroll_offset_map_.begin();
1561 map_entry != layer_id_to_scroll_offset_map_.end();) { 1596 map_entry != layer_id_to_scroll_offset_map_.end();) {
1562 int key = map_entry->first; 1597 int key = map_entry->first;
1563 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { 1598 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) {
1564 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); 1599 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1565 ++map_entry; 1600 ++map_entry;
1566 } else { 1601 } else {
1567 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); 1602 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry);
1568 } 1603 }
1569 } 1604 }
1570 1605
1571 for (auto& map_entry : *new_scroll_offset_map) { 1606 for (auto& map_entry : *new_scroll_offset_map) {
1572 int key = map_entry.first; 1607 int key = map_entry.first;
1573 if (layer_id_to_scroll_offset_map_.find(key) == 1608 if (layer_id_to_scroll_offset_map_.find(key) ==
1574 layer_id_to_scroll_offset_map_.end()) 1609 layer_id_to_scroll_offset_map_.end())
1575 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); 1610 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1576 } 1611 }
1577 } 1612 }
1578 } 1613 }
1579 1614
1580 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() { 1615 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map_for_test()
1581 return layer_id_to_scroll_offset_map_; 1616 const {
1582 }
1583
1584 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const {
1585 return layer_id_to_scroll_offset_map_; 1617 return layer_id_to_scroll_offset_map_;
1586 } 1618 }
1587 1619
1588 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { 1620 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() {
1589 DCHECK(property_trees()->is_active); 1621 DCHECK(property_trees()->is_active);
1590 for (auto& map_entry : layer_id_to_scroll_offset_map_) 1622 for (auto& map_entry : layer_id_to_scroll_offset_map_)
1591 map_entry.second->AbortCommit(); 1623 map_entry.second.synced_offset->AbortCommit();
1592 } 1624 }
1593 1625
1594 bool ScrollTree::SetBaseScrollOffset(int layer_id, 1626 void ScrollTree::SetBaseScrollOffset(int layer_id,
1595 const gfx::ScrollOffset& scroll_offset) { 1627 const gfx::ScrollOffset& scroll_offset,
1596 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); 1628 const gfx::ScrollOffset& overscroll) {
1629 ScrollWithOverscroll* scroll = GetOrCreate(layer_id);
1630 scroll->overscroll = overscroll;
1631 scroll->synced_offset->PushFromMainThread(scroll_offset);
1597 } 1632 }
1598 1633
1599 bool ScrollTree::SetScrollOffset(int layer_id, 1634 bool ScrollTree::SetScrollOffset(int layer_id,
1600 const gfx::ScrollOffset& scroll_offset) { 1635 const gfx::ScrollOffset& scroll_offset,
1636 const gfx::ScrollOffset& overscroll) {
1637 ScrollWithOverscroll* scroll = GetOrCreate(layer_id);
1638 bool change = scroll->overscroll != overscroll;
1639 scroll->overscroll = overscroll;
1640
1601 if (property_trees()->is_main_thread) 1641 if (property_trees()->is_main_thread)
1602 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); 1642 change |= synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset);
1603 else if (property_trees()->is_active) 1643 else if (property_trees()->is_active)
1604 return synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); 1644 change |= synced_scroll_offset(layer_id)->SetCurrent(scroll_offset);
1605 return false; 1645 return change;
1646 }
1647
1648 void ScrollTree::SetScrollOffsetClobberActiveValue(int layer_id) {
1649 GetOrCreate(layer_id)->synced_offset->set_clobber_active_value();
1606 } 1650 }
1607 1651
1608 bool ScrollTree::UpdateScrollOffsetBaseForTesting( 1652 bool ScrollTree::UpdateScrollOffsetBaseForTesting(
1609 int layer_id, 1653 int layer_id,
1610 const gfx::ScrollOffset& offset) { 1654 const gfx::ScrollOffset& offset) {
1611 DCHECK(!property_trees()->is_main_thread); 1655 DCHECK(!property_trees()->is_main_thread);
1612 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); 1656 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset);
1613 if (property_trees()->is_active) 1657 if (property_trees()->is_active)
1614 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); 1658 changed |= synced_scroll_offset(layer_id)->PushPendingToActive();
1615 return changed; 1659 return changed;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1667 LayerTreeImpl* layer_tree_impl) { 1711 LayerTreeImpl* layer_tree_impl) {
1668 gfx::ScrollOffset adjusted_scroll(scroll); 1712 gfx::ScrollOffset adjusted_scroll(scroll);
1669 if (!scroll_node->user_scrollable_horizontal) 1713 if (!scroll_node->user_scrollable_horizontal)
1670 adjusted_scroll.set_x(0); 1714 adjusted_scroll.set_x(0);
1671 if (!scroll_node->user_scrollable_vertical) 1715 if (!scroll_node->user_scrollable_vertical)
1672 adjusted_scroll.set_y(0); 1716 adjusted_scroll.set_y(0);
1673 DCHECK(scroll_node->scrollable); 1717 DCHECK(scroll_node->scrollable);
1674 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); 1718 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id);
1675 gfx::ScrollOffset new_offset = 1719 gfx::ScrollOffset new_offset =
1676 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); 1720 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node);
1677 if (SetScrollOffset(scroll_node->owner_id, new_offset)) 1721 gfx::ScrollOffset overscroll = current_overscroll(scroll_node->owner_id);
1722 if (SetScrollOffset(scroll_node->owner_id, new_offset, overscroll))
1678 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id); 1723 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id);
1679 1724
1680 gfx::ScrollOffset unscrolled = 1725 gfx::ScrollOffset unscrolled =
1681 old_offset + gfx::ScrollOffset(scroll) - new_offset; 1726 old_offset + gfx::ScrollOffset(scroll) - new_offset;
1682 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); 1727 return gfx::Vector2dF(unscrolled.x(), unscrolled.y());
1683 } 1728 }
1684 1729
1685 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( 1730 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits(
1686 gfx::ScrollOffset offset, 1731 gfx::ScrollOffset offset,
1687 ScrollNode* scroll_node) const { 1732 ScrollNode* scroll_node) const {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1826 non_root_surfaces_enabled = true; 1871 non_root_surfaces_enabled = true;
1827 1872
1828 #if DCHECK_IS_ON() 1873 #if DCHECK_IS_ON()
1829 PropertyTrees tree; 1874 PropertyTrees tree;
1830 tree.transform_tree = transform_tree; 1875 tree.transform_tree = transform_tree;
1831 tree.effect_tree = effect_tree; 1876 tree.effect_tree = effect_tree;
1832 tree.clip_tree = clip_tree; 1877 tree.clip_tree = clip_tree;
1833 tree.scroll_tree = scroll_tree; 1878 tree.scroll_tree = scroll_tree;
1834 // Scroll offset map and currently scrolling node id may not be copied 1879 // Scroll offset map and currently scrolling node id may not be copied
1835 // during operator=. 1880 // during operator=.
1836 ScrollTree::ScrollOffsetMap& map = tree.scroll_tree.scroll_offset_map(); 1881 // ScrollTree::ScrollOffsetMap& map =
1837 map = scroll_tree.scroll_offset_map(); 1882 // tree.scroll_tree.scroll_offset_map_for_test();
1883 // map = scroll_tree.scroll_offset_map();
1838 tree.scroll_tree.set_currently_scrolling_node( 1884 tree.scroll_tree.set_currently_scrolling_node(
1839 scroll_tree.CurrentlyScrollingNodeId()); 1885 scroll_tree.CurrentlyScrollingNodeId());
1840 1886
1841 tree.sequence_number = sequence_number; 1887 tree.sequence_number = sequence_number;
1842 tree.is_main_thread = is_main_thread; 1888 tree.is_main_thread = is_main_thread;
1843 tree.is_active = is_active; 1889 tree.is_active = is_active;
1844 DCHECK(tree == *this); 1890 DCHECK(tree == *this);
1845 #endif 1891 #endif
1846 } 1892 }
1847 1893
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2282 2328
2283 const EffectNode* effect_node = effect_tree.Node(effect_id); 2329 const EffectNode* effect_node = effect_tree.Node(effect_id);
2284 2330
2285 bool success = GetFromTarget(transform_id, effect_id, transform); 2331 bool success = GetFromTarget(transform_id, effect_id, transform);
2286 transform->Scale(effect_node->surface_contents_scale.x(), 2332 transform->Scale(effect_node->surface_contents_scale.x(),
2287 effect_node->surface_contents_scale.y()); 2333 effect_node->surface_contents_scale.y());
2288 return success; 2334 return success;
2289 } 2335 }
2290 2336
2291 } // namespace cc 2337 } // 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