| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |