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

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: rebase Created 4 years, 2 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"
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 if (node->affected_by_inner_viewport_bounds_delta_x) 535 if (node->affected_by_inner_viewport_bounds_delta_x)
536 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); 536 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x());
537 else if (node->affected_by_outer_viewport_bounds_delta_x) 537 else if (node->affected_by_outer_viewport_bounds_delta_x)
538 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); 538 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x());
539 539
540 if (node->affected_by_inner_viewport_bounds_delta_y) 540 if (node->affected_by_inner_viewport_bounds_delta_y)
541 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); 541 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y());
542 else if (node->affected_by_outer_viewport_bounds_delta_y) 542 else if (node->affected_by_outer_viewport_bounds_delta_y)
543 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); 543 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y());
544 544
545 transform.Translate(node->source_to_parent.x() - node->scroll_offset.x() + 545 transform.Translate(
546 fixed_position_adjustment.x(), 546 node->source_to_parent.x() - node->scroll_offset_with_overscroll.x() +
547 node->source_to_parent.y() - node->scroll_offset.y() + 547 fixed_position_adjustment.x(),
548 fixed_position_adjustment.y()); 548 node->source_to_parent.y() - node->scroll_offset_with_overscroll.y() +
549 fixed_position_adjustment.y());
549 transform.Translate(StickyPositionOffset(this, node)); 550 transform.Translate(StickyPositionOffset(this, node));
550 transform.PreconcatTransform(node->local); 551 transform.PreconcatTransform(node->local);
551 transform.PreconcatTransform(node->pre_local); 552 transform.PreconcatTransform(node->pre_local);
552 553
553 node->set_to_parent(transform); 554 node->set_to_parent(transform);
554 node->needs_local_transform_update = false; 555 node->needs_local_transform_update = false;
555 } 556 }
556 557
557 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, 558 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node,
558 TransformNode* parent_node, 559 TransformNode* parent_node,
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 1289
1289 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1290 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1290 const proto::EffectTreeData& data = proto.effect_tree_data(); 1291 const proto::EffectTreeData& data = proto.effect_tree_data();
1291 1292
1292 DCHECK(mask_layer_ids_.empty()); 1293 DCHECK(mask_layer_ids_.empty());
1293 for (int i = 0; i < data.mask_layer_ids_size(); ++i) { 1294 for (int i = 0; i < data.mask_layer_ids_size(); ++i) {
1294 mask_layer_ids_.push_back(data.mask_layer_ids(i)); 1295 mask_layer_ids_.push_back(data.mask_layer_ids(i));
1295 } 1296 }
1296 } 1297 }
1297 1298
1299 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll() {}
1300 ScrollTree::ScrollWithOverscroll::ScrollWithOverscroll(
1301 ScrollWithOverscroll&& rhs) = default;
1302 ScrollTree::ScrollWithOverscroll::~ScrollWithOverscroll() {}
1303
1298 ScrollTree::ScrollTree() 1304 ScrollTree::ScrollTree()
1299 : currently_scrolling_node_id_(kInvalidNodeId), 1305 : currently_scrolling_node_id_(kInvalidNodeId),
1300 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} 1306 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {}
1301 1307
1302 ScrollTree::~ScrollTree() {} 1308 ScrollTree::~ScrollTree() {}
1303 1309
1304 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { 1310 ScrollTree& ScrollTree::operator=(const ScrollTree& from) {
1305 PropertyTree::operator=(from); 1311 PropertyTree::operator=(from);
1306 currently_scrolling_node_id_ = kInvalidNodeId; 1312 currently_scrolling_node_id_ = kInvalidNodeId;
1307 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, 1313 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=,
1308 // because we do not want to simply copy the map when property tree is 1314 // because we do not want to simply copy the map when property tree is
1309 // propagating from pending to active. 1315 // propagating from pending to active.
1310 // In the main to pending case, we do want to copy it, but this can be done by 1316 // In the main to pending case, we do want to copy it, but this can be done by
1311 // calling UpdateScrollOffsetMap after the assignment; 1317 // calling UpdateScrollOffsetMap after the assignment;
1312 // In the other case, we want pending and active property trees to share the 1318 // In the other case, we want pending and active property trees to share the
1313 // same map. 1319 // same map.
1314 return *this; 1320 return *this;
1315 } 1321 }
1316 1322
1317 bool ScrollTree::operator==(const ScrollTree& other) const { 1323 bool ScrollTree::operator==(const ScrollTree& other) const {
1318 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map = 1324 const ScrollOffsetMap& other_scroll_offset_map =
1319 other.scroll_offset_map(); 1325 other.layer_id_to_scroll_offset_map_;
1320 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) 1326 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size())
1321 return false; 1327 return false;
1322 1328
1323 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1329 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1324 int key = map_entry.first; 1330 int key = map_entry.first;
1325 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() || 1331 auto other_entry_it = other_scroll_offset_map.find(key);
1326 map_entry.second != layer_id_to_scroll_offset_map_.at(key)) 1332 if (other_entry_it == other_scroll_offset_map.end() ||
1333 map_entry.second != other_entry_it->second)
1327 return false; 1334 return false;
1328 } 1335 }
1329 1336
1330 bool is_currently_scrolling_node_equal = 1337 bool is_currently_scrolling_node_equal =
1331 currently_scrolling_node_id_ == other.currently_scrolling_node_id_; 1338 currently_scrolling_node_id_ == other.currently_scrolling_node_id_;
1332 1339
1333 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; 1340 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal;
1334 } 1341 }
1335 1342
1336 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const { 1343 void ScrollTree::ToProtobuf(proto::PropertyTree* proto) const {
1337 DCHECK(!proto->has_property_type()); 1344 DCHECK(!proto->has_property_type());
1338 proto->set_property_type(proto::PropertyTree::Scroll); 1345 proto->set_property_type(proto::PropertyTree::Scroll);
1339 1346
1340 PropertyTree::ToProtobuf(proto); 1347 PropertyTree::ToProtobuf(proto);
1341 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data(); 1348 proto::ScrollTreeData* data = proto->mutable_scroll_tree_data();
1342 1349
1343 data->set_currently_scrolling_node_id(currently_scrolling_node_id_); 1350 data->set_currently_scrolling_node_id(currently_scrolling_node_id_);
1344 for (auto i : layer_id_to_scroll_offset_map_) { 1351 for (const auto& i : layer_id_to_scroll_offset_map_) {
1345 data->add_layer_id_to_scroll_offset_map(); 1352 data->add_layer_id_to_scroll_offset_map();
1346 proto::ScrollOffsetMapEntry* entry = 1353 proto::ScrollOffsetMapEntry* entry =
1347 data->mutable_layer_id_to_scroll_offset_map( 1354 data->mutable_layer_id_to_scroll_offset_map(
1348 data->layer_id_to_scroll_offset_map_size() - 1); 1355 data->layer_id_to_scroll_offset_map_size() - 1);
1349 entry->set_layer_id(i.first); 1356 entry->set_layer_id(i.first);
1350 SyncedScrollOffsetToProto(*i.second.get(), entry->mutable_scroll_offset()); 1357 SyncedScrollOffsetToProto(*i.second.synced_offset.get(),
1358 entry->mutable_scroll_offset());
1359 ScrollOffsetToProto(i.second.overscroll, entry->mutable_overscroll());
1351 } 1360 }
1352 } 1361 }
1353 1362
1354 void ScrollTree::FromProtobuf( 1363 void ScrollTree::FromProtobuf(
1355 const proto::PropertyTree& proto, 1364 const proto::PropertyTree& proto,
1356 std::unordered_map<int, int>* node_id_to_index_map) { 1365 std::unordered_map<int, int>* node_id_to_index_map) {
1357 DCHECK(proto.has_property_type()); 1366 DCHECK(proto.has_property_type());
1358 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll); 1367 DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
1359 1368
1360 PropertyTree::FromProtobuf(proto, node_id_to_index_map); 1369 PropertyTree::FromProtobuf(proto, node_id_to_index_map);
1361 const proto::ScrollTreeData& data = proto.scroll_tree_data(); 1370 const proto::ScrollTreeData& data = proto.scroll_tree_data();
1362 1371
1363 currently_scrolling_node_id_ = data.currently_scrolling_node_id(); 1372 currently_scrolling_node_id_ = data.currently_scrolling_node_id();
1364 1373
1365 // TODO(khushalsagar): This should probably be removed if the copy constructor 1374 // TODO(khushalsagar): This should probably be removed if the copy constructor
1366 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well. 1375 // for ScrollTree copies the |layer_id_to_scroll_offset_map_| as well.
1367 layer_id_to_scroll_offset_map_.clear(); 1376 layer_id_to_scroll_offset_map_.clear();
1368 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) { 1377 for (int i = 0; i < data.layer_id_to_scroll_offset_map_size(); ++i) {
1369 const proto::ScrollOffsetMapEntry entry = 1378 const proto::ScrollOffsetMapEntry entry =
1370 data.layer_id_to_scroll_offset_map(i); 1379 data.layer_id_to_scroll_offset_map(i);
1371 layer_id_to_scroll_offset_map_[entry.layer_id()] = new SyncedScrollOffset(); 1380 ScrollWithOverscroll* scroll = GetOrCreate(entry.layer_id());
1372 ProtoToSyncedScrollOffset( 1381 scroll->synced_offset = new SyncedScrollOffset();
1373 entry.scroll_offset(), 1382 ProtoToSyncedScrollOffset(entry.scroll_offset(),
1374 layer_id_to_scroll_offset_map_[entry.layer_id()].get()); 1383 scroll->synced_offset.get());
1384 scroll->overscroll = ProtoToScrollOffset(entry.overscroll());
1375 } 1385 }
1376 } 1386 }
1377 1387
1378 void ScrollTree::clear() { 1388 void ScrollTree::clear() {
1379 PropertyTree<ScrollNode>::clear(); 1389 PropertyTree<ScrollNode>::clear();
1380 1390
1381 if (property_trees()->is_main_thread) { 1391 if (property_trees()->is_main_thread) {
1382 currently_scrolling_node_id_ = kInvalidNodeId; 1392 currently_scrolling_node_id_ = kInvalidNodeId;
1383 layer_id_to_scroll_offset_map_.clear(); 1393 layer_id_to_scroll_offset_map_.clear();
1384 } 1394 }
1385 1395
1386 #if DCHECK_IS_ON() 1396 #if DCHECK_IS_ON()
1387 ScrollTree tree; 1397 ScrollTree tree;
1388 if (!property_trees()->is_main_thread) { 1398 if (!property_trees()->is_main_thread) {
1389 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_; 1399 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_;
1390 tree.layer_id_to_scroll_offset_map_ = layer_id_to_scroll_offset_map_; 1400 // tree.layer_id_to_scroll_offset_map_ = layer_id_to_scroll_offset_map_;
1391 } 1401 }
1392 DCHECK(tree == *this); 1402 DCHECK(tree == *this);
1393 #endif 1403 #endif
1394 } 1404 }
1395 1405
1396 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { 1406 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
1397 const ScrollNode* scroll_node = Node(scroll_node_id); 1407 const ScrollNode* scroll_node = Node(scroll_node_id);
1398 gfx::SizeF scroll_bounds = 1408 gfx::SizeF scroll_bounds =
1399 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height()); 1409 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height());
1400 1410
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1493 gfx::Transform screen_space_transform( 1503 gfx::Transform screen_space_transform(
1494 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), 1504 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(),
1495 scroll_node->offset_to_transform_parent.y()); 1505 scroll_node->offset_to_transform_parent.y());
1496 screen_space_transform.ConcatTransform( 1506 screen_space_transform.ConcatTransform(
1497 transform_tree.ToScreen(transform_node->id)); 1507 transform_tree.ToScreen(transform_node->id));
1498 if (scroll_node->should_flatten) 1508 if (scroll_node->should_flatten)
1499 screen_space_transform.FlattenTo2d(); 1509 screen_space_transform.FlattenTo2d();
1500 return screen_space_transform; 1510 return screen_space_transform;
1501 } 1511 }
1502 1512
1513 ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrCreate(int layer_id) {
1514 auto it = layer_id_to_scroll_offset_map_.find(layer_id);
1515 if (it == layer_id_to_scroll_offset_map_.end()) {
1516 it =
1517 layer_id_to_scroll_offset_map_.emplace(layer_id, ScrollWithOverscroll())
1518 .first;
1519 it->second.synced_offset = new SyncedScrollOffset;
1520 }
1521 return &it->second;
1522 }
1523
1524 const ScrollTree::ScrollWithOverscroll* ScrollTree::GetOrNull(
1525 int layer_id) const {
1526 auto it = layer_id_to_scroll_offset_map_.find(layer_id);
1527 if (it == layer_id_to_scroll_offset_map_.end())
1528 return nullptr;
1529 return &it->second;
1530 }
1531
1503 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { 1532 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) {
1504 if (layer_id_to_scroll_offset_map_.find(layer_id) == 1533 return GetOrCreate(layer_id)->synced_offset.get();
1505 layer_id_to_scroll_offset_map_.end()) {
1506 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset;
1507 }
1508 return layer_id_to_scroll_offset_map_[layer_id].get();
1509 } 1534 }
1510 1535
1511 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { 1536 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const {
1512 if (layer_id_to_scroll_offset_map_.find(layer_id) == 1537 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1513 layer_id_to_scroll_offset_map_.end()) { 1538 return scroll ? scroll->synced_offset.get() : nullptr;
1514 return nullptr;
1515 }
1516 return layer_id_to_scroll_offset_map_.at(layer_id).get();
1517 } 1539 }
1518 1540
1519 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { 1541 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const {
1520 return synced_scroll_offset(layer_id) 1542 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1521 ? synced_scroll_offset(layer_id)->Current( 1543 return scroll ? scroll->synced_offset->Current(property_trees()->is_active)
1522 property_trees()->is_active) 1544 : gfx::ScrollOffset();
1523 : gfx::ScrollOffset(); 1545 }
1546
1547 const gfx::ScrollOffset ScrollTree::current_overscroll(int layer_id) const {
1548 const ScrollWithOverscroll* scroll = GetOrNull(layer_id);
1549 return scroll ? scroll->overscroll : gfx::ScrollOffset();
1524 } 1550 }
1525 1551
1526 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( 1552 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread(
1527 SyncedScrollOffset* scroll_offset) { 1553 SyncedScrollOffset* scroll_offset) {
1528 // TODO(miletus): Remove all this temporary flooring machinery when 1554 // TODO(miletus): Remove all this temporary flooring machinery when
1529 // Blink fully supports fractional scrolls. 1555 // Blink fully supports fractional scrolls.
1530 gfx::ScrollOffset current_offset = 1556 gfx::ScrollOffset current_offset =
1531 scroll_offset->Current(property_trees()->is_active); 1557 scroll_offset->Current(property_trees()->is_active);
1532 gfx::ScrollOffset current_delta = property_trees()->is_active 1558 gfx::ScrollOffset current_delta = property_trees()->is_active
1533 ? scroll_offset->Delta() 1559 ? scroll_offset->Delta()
1534 : scroll_offset->PendingDelta().get(); 1560 : scroll_offset->PendingDelta().get();
1535 gfx::ScrollOffset floored_delta(floor(current_delta.x()), 1561 gfx::ScrollOffset floored_delta(floor(current_delta.x()),
1536 floor(current_delta.y())); 1562 floor(current_delta.y()));
1537 gfx::ScrollOffset diff_delta = floored_delta - current_delta; 1563 gfx::ScrollOffset diff_delta = floored_delta - current_delta;
1538 gfx::ScrollOffset tmp_offset = current_offset + diff_delta; 1564 gfx::ScrollOffset tmp_offset = current_offset + diff_delta;
1539 scroll_offset->SetCurrent(tmp_offset); 1565 scroll_offset->SetCurrent(tmp_offset);
1540 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); 1566 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread();
1541 scroll_offset->SetCurrent(current_offset); 1567 scroll_offset->SetCurrent(current_offset);
1542 return delta; 1568 return delta;
1543 } 1569 }
1544 1570
1545 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 1571 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
1546 int inner_viewport_layer_id) { 1572 int inner_viewport_layer_id) {
1547 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1573 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1548 gfx::ScrollOffset scroll_delta = 1574 gfx::ScrollOffset scroll_delta =
1549 PullDeltaForMainThread(map_entry.second.get()); 1575 PullDeltaForMainThread(map_entry.second.synced_offset.get());
1550 1576 gfx::ScrollOffset overscroll = map_entry.second.overscroll;
1551 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); 1577 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y());
1552 int layer_id = map_entry.first; 1578 int layer_id = map_entry.first;
1553 1579
1554 if (!scroll_delta.IsZero()) { 1580 if (!scroll_delta.IsZero() || !overscroll.IsZero()) {
1555 if (layer_id == inner_viewport_layer_id) { 1581 if (layer_id == inner_viewport_layer_id) {
1556 // Inner (visual) viewport is stored separately. 1582 // Inner (visual) viewport is stored separately.
1557 scroll_info->inner_viewport_scroll.layer_id = layer_id; 1583 scroll_info->inner_viewport_scroll.layer_id = layer_id;
1558 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; 1584 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector;
1585 scroll_info->inner_viewport_scroll.overscroll = overscroll;
1559 } else { 1586 } else {
1560 LayerTreeHostCommon::ScrollUpdateInfo scroll; 1587 LayerTreeHostCommon::ScrollUpdateInfo scroll;
1561 scroll.layer_id = layer_id; 1588 scroll.layer_id = layer_id;
1562 scroll.scroll_delta = scroll_delta_vector; 1589 scroll.scroll_delta = scroll_delta_vector;
1563 scroll_info->scrolls.push_back(scroll); 1590 scroll.overscroll = overscroll;
1591 scroll_info->scrolls.push_back(std::move(scroll));
1564 } 1592 }
1565 } 1593 }
1566 } 1594 }
1567 } 1595 }
1568 1596
1569 void ScrollTree::CollectScrollDeltasForTesting() { 1597 void ScrollTree::CollectScrollDeltasForTesting() {
1570 for (auto map_entry : layer_id_to_scroll_offset_map_) { 1598 for (const auto& map_entry : layer_id_to_scroll_offset_map_) {
1571 PullDeltaForMainThread(map_entry.second.get()); 1599 PullDeltaForMainThread(map_entry.second.synced_offset.get());
1572 } 1600 }
1573 } 1601 }
1574 1602
1575 void ScrollTree::UpdateScrollOffsetMapEntry( 1603 void ScrollTree::UpdateScrollOffsetMapEntry(
1576 int key, 1604 int key,
1577 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, 1605 ScrollOffsetMap* new_scroll_offset_map,
1578 LayerTreeImpl* layer_tree_impl) { 1606 LayerTreeImpl* layer_tree_impl) {
1579 bool changed = false; 1607 bool changed = false;
1580 // If we are pushing scroll offset from main to pending tree, we create a new 1608 // If we are pushing scroll offset from main to pending tree, we create a new
1581 // instance of synced scroll offset; if we are pushing from pending to active, 1609 // instance of synced scroll offset; if we are pushing from pending to active,
1582 // we reuse the pending tree's value in the map. 1610 // we reuse the pending tree's value in the map.
1611 ScrollWithOverscroll& other_scroll = new_scroll_offset_map->at(key);
1583 if (!property_trees()->is_active) { 1612 if (!property_trees()->is_active) {
1584 changed = synced_scroll_offset(key)->PushFromMainThread( 1613 ScrollWithOverscroll& this_scroll = *GetOrCreate(key);
1585 new_scroll_offset_map->at(key)->PendingBase()); 1614 changed = this_scroll.synced_offset->PushFromMainThread(
1615 other_scroll.synced_offset->PendingBase());
1586 1616
1587 if (new_scroll_offset_map->at(key)->clobber_active_value()) { 1617 if (other_scroll.synced_offset->clobber_active_value()) {
1588 synced_scroll_offset(key)->set_clobber_active_value(); 1618 this_scroll.synced_offset->set_clobber_active_value();
1589 } 1619 }
1620 changed |= this_scroll.overscroll != other_scroll.overscroll;
1621 this_scroll.overscroll = other_scroll.overscroll;
1590 if (changed) { 1622 if (changed) {
1591 layer_tree_impl->DidUpdateScrollOffset(key); 1623 layer_tree_impl->DidUpdateScrollOffset(key);
1592 } 1624 }
1593 } else { 1625 } else {
1594 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key); 1626 ScrollWithOverscroll& this_scroll = layer_id_to_scroll_offset_map_[key];
1595 changed |= synced_scroll_offset(key)->PushPendingToActive(); 1627 this_scroll.synced_offset = other_scroll.synced_offset;
1628 // Nothing to do for overscroll.
1629 changed |= this_scroll.synced_offset->PushPendingToActive();
1596 if (changed) { 1630 if (changed) {
1597 layer_tree_impl->DidUpdateScrollOffset(key); 1631 layer_tree_impl->DidUpdateScrollOffset(key);
1598 } 1632 }
1599 } 1633 }
1600 } 1634 }
1601 1635
1602 void ScrollTree::UpdateScrollOffsetMap( 1636 void ScrollTree::UpdateScrollOffsetMap(ScrollTree* scroll_tree,
1603 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, 1637 LayerTreeImpl* layer_tree_impl) {
1604 LayerTreeImpl* layer_tree_impl) { 1638 ScrollOffsetMap* new_scroll_offset_map =
1639 &scroll_tree->layer_id_to_scroll_offset_map_;
1605 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { 1640 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) {
1606 DCHECK(!property_trees()->is_main_thread); 1641 DCHECK(!property_trees()->is_main_thread);
1607 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); 1642 for (auto map_entry = layer_id_to_scroll_offset_map_.begin();
1608 map_entry != layer_id_to_scroll_offset_map_.end();) { 1643 map_entry != layer_id_to_scroll_offset_map_.end();) {
1609 int key = map_entry->first; 1644 int key = map_entry->first;
1610 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { 1645 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) {
1611 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); 1646 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1612 ++map_entry; 1647 ++map_entry;
1613 } else { 1648 } else {
1614 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); 1649 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry);
1615 } 1650 }
1616 } 1651 }
1617 1652
1618 for (auto& map_entry : *new_scroll_offset_map) { 1653 for (auto& map_entry : *new_scroll_offset_map) {
1619 int key = map_entry.first; 1654 int key = map_entry.first;
1620 if (layer_id_to_scroll_offset_map_.find(key) == 1655 if (layer_id_to_scroll_offset_map_.find(key) ==
1621 layer_id_to_scroll_offset_map_.end()) 1656 layer_id_to_scroll_offset_map_.end())
1622 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); 1657 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl);
1623 } 1658 }
1624 } 1659 }
1625 } 1660 }
1626 1661
1627 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() { 1662 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map_for_test()
1628 return layer_id_to_scroll_offset_map_; 1663 const {
1629 }
1630
1631 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const {
1632 return layer_id_to_scroll_offset_map_; 1664 return layer_id_to_scroll_offset_map_;
1633 } 1665 }
1634 1666
1635 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { 1667 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() {
1636 DCHECK(property_trees()->is_active); 1668 DCHECK(property_trees()->is_active);
1637 for (auto& map_entry : layer_id_to_scroll_offset_map_) 1669 for (auto& map_entry : layer_id_to_scroll_offset_map_)
1638 map_entry.second->AbortCommit(); 1670 map_entry.second.synced_offset->AbortCommit();
1639 } 1671 }
1640 1672
1641 bool ScrollTree::SetBaseScrollOffset(int layer_id, 1673 void ScrollTree::SetBaseScrollOffset(int layer_id,
1642 const gfx::ScrollOffset& scroll_offset) { 1674 const gfx::ScrollOffset& scroll_offset,
1643 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); 1675 const gfx::ScrollOffset& overscroll) {
1676 ScrollWithOverscroll* scroll = GetOrCreate(layer_id);
1677 scroll->overscroll = overscroll;
1678 scroll->synced_offset->PushFromMainThread(scroll_offset);
1644 } 1679 }
1645 1680
1646 bool ScrollTree::SetScrollOffset(int layer_id, 1681 bool ScrollTree::SetScrollOffset(int layer_id,
1647 const gfx::ScrollOffset& scroll_offset) { 1682 const gfx::ScrollOffset& scroll_offset,
1683 const gfx::ScrollOffset& overscroll) {
1684 ScrollWithOverscroll* scroll = GetOrCreate(layer_id);
1685 bool change = scroll->overscroll != overscroll;
1686 scroll->overscroll = overscroll;
1687
1648 if (property_trees()->is_main_thread) 1688 if (property_trees()->is_main_thread)
1649 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); 1689 change |= synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset);
1650 else if (property_trees()->is_active) 1690 else if (property_trees()->is_active)
1651 return synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); 1691 change |= synced_scroll_offset(layer_id)->SetCurrent(scroll_offset);
1652 return false; 1692 return change;
1693 }
1694
1695 void ScrollTree::SetScrollOffsetClobberActiveValue(int layer_id) {
1696 GetOrCreate(layer_id)->synced_offset->set_clobber_active_value();
1653 } 1697 }
1654 1698
1655 bool ScrollTree::UpdateScrollOffsetBaseForTesting( 1699 bool ScrollTree::UpdateScrollOffsetBaseForTesting(
1656 int layer_id, 1700 int layer_id,
1657 const gfx::ScrollOffset& offset) { 1701 const gfx::ScrollOffset& offset) {
1658 DCHECK(!property_trees()->is_main_thread); 1702 DCHECK(!property_trees()->is_main_thread);
1659 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); 1703 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset);
1660 if (property_trees()->is_active) 1704 if (property_trees()->is_active)
1661 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); 1705 changed |= synced_scroll_offset(layer_id)->PushPendingToActive();
1662 return changed; 1706 return changed;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 LayerTreeImpl* layer_tree_impl) { 1758 LayerTreeImpl* layer_tree_impl) {
1715 gfx::ScrollOffset adjusted_scroll(scroll); 1759 gfx::ScrollOffset adjusted_scroll(scroll);
1716 if (!scroll_node->user_scrollable_horizontal) 1760 if (!scroll_node->user_scrollable_horizontal)
1717 adjusted_scroll.set_x(0); 1761 adjusted_scroll.set_x(0);
1718 if (!scroll_node->user_scrollable_vertical) 1762 if (!scroll_node->user_scrollable_vertical)
1719 adjusted_scroll.set_y(0); 1763 adjusted_scroll.set_y(0);
1720 DCHECK(scroll_node->scrollable); 1764 DCHECK(scroll_node->scrollable);
1721 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); 1765 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id);
1722 gfx::ScrollOffset new_offset = 1766 gfx::ScrollOffset new_offset =
1723 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); 1767 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node);
1724 if (SetScrollOffset(scroll_node->owner_id, new_offset)) 1768 gfx::ScrollOffset overscroll = current_overscroll(scroll_node->owner_id);
1769 if (SetScrollOffset(scroll_node->owner_id, new_offset, overscroll))
1725 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id); 1770 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id);
1726 1771
1727 gfx::ScrollOffset unscrolled = 1772 gfx::ScrollOffset unscrolled =
1728 old_offset + gfx::ScrollOffset(scroll) - new_offset; 1773 old_offset + gfx::ScrollOffset(scroll) - new_offset;
1729 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); 1774 return gfx::Vector2dF(unscrolled.x(), unscrolled.y());
1730 } 1775 }
1731 1776
1732 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( 1777 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits(
1733 gfx::ScrollOffset offset, 1778 gfx::ScrollOffset offset,
1734 ScrollNode* scroll_node) const { 1779 ScrollNode* scroll_node) const {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1879 non_root_surfaces_enabled = true; 1924 non_root_surfaces_enabled = true;
1880 1925
1881 #if DCHECK_IS_ON() 1926 #if DCHECK_IS_ON()
1882 PropertyTrees tree; 1927 PropertyTrees tree;
1883 tree.transform_tree = transform_tree; 1928 tree.transform_tree = transform_tree;
1884 tree.effect_tree = effect_tree; 1929 tree.effect_tree = effect_tree;
1885 tree.clip_tree = clip_tree; 1930 tree.clip_tree = clip_tree;
1886 tree.scroll_tree = scroll_tree; 1931 tree.scroll_tree = scroll_tree;
1887 // Scroll offset map and currently scrolling node id may not be copied 1932 // Scroll offset map and currently scrolling node id may not be copied
1888 // during operator=. 1933 // during operator=.
1889 ScrollTree::ScrollOffsetMap& map = tree.scroll_tree.scroll_offset_map(); 1934 // ScrollTree::ScrollOffsetMap& map =
1890 map = scroll_tree.scroll_offset_map(); 1935 // tree.scroll_tree.scroll_offset_map_for_test();
1936 // map = scroll_tree.scroll_offset_map();
1891 tree.scroll_tree.set_currently_scrolling_node( 1937 tree.scroll_tree.set_currently_scrolling_node(
1892 scroll_tree.CurrentlyScrollingNodeId()); 1938 scroll_tree.CurrentlyScrollingNodeId());
1893 1939
1894 tree.sequence_number = sequence_number; 1940 tree.sequence_number = sequence_number;
1895 tree.is_main_thread = is_main_thread; 1941 tree.is_main_thread = is_main_thread;
1896 tree.is_active = is_active; 1942 tree.is_active = is_active;
1897 DCHECK(tree == *this); 1943 DCHECK(tree == *this);
1898 #endif 1944 #endif
1899 } 1945 }
1900 1946
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
2365 from_target.ConcatTransform(draw_transforms.from_target); 2411 from_target.ConcatTransform(draw_transforms.from_target);
2366 from_target.Scale(effect_node->surface_contents_scale.x(), 2412 from_target.Scale(effect_node->surface_contents_scale.x(),
2367 effect_node->surface_contents_scale.y()); 2413 effect_node->surface_contents_scale.y());
2368 DCHECK(from_target.ApproximatelyEqual(*transform) || 2414 DCHECK(from_target.ApproximatelyEqual(*transform) ||
2369 !draw_transforms.invertible); 2415 !draw_transforms.invertible);
2370 } 2416 }
2371 return success; 2417 return success;
2372 } 2418 }
2373 2419
2374 } // namespace cc 2420 } // 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