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 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 | 1108 |
1109 ScrollTree::ScrollTree() | 1109 ScrollTree::ScrollTree() |
1110 : currently_scrolling_node_id_(kInvalidNodeId), | 1110 : currently_scrolling_node_id_(kInvalidNodeId), |
1111 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} | 1111 layer_id_to_scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {} |
1112 | 1112 |
1113 ScrollTree::~ScrollTree() {} | 1113 ScrollTree::~ScrollTree() {} |
1114 | 1114 |
1115 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { | 1115 ScrollTree& ScrollTree::operator=(const ScrollTree& from) { |
1116 PropertyTree::operator=(from); | 1116 PropertyTree::operator=(from); |
1117 currently_scrolling_node_id_ = kInvalidNodeId; | 1117 currently_scrolling_node_id_ = kInvalidNodeId; |
1118 // layer_id_to_scroll_offset_map_ is intentionally omitted in operator=, | 1118 // Maps for ScrollOffsets/SyncedScrollOffsets are intentionally ommitted here |
1119 // because we do not want to simply copy the map when property tree is | 1119 // since we can not directly copy them. Pushing of these updates from main |
1120 // propagating from pending to active. | 1120 // currently depends on Layer properties for scroll offset animation changes |
1121 // In the main to pending case, we do want to copy it, but this can be done by | 1121 // (setting clobber_active_value for scroll offset animations interrupted on |
1122 // calling UpdateScrollOffsetMap after the assignment; | 1122 // the main thread) being pushed to impl first. |
1123 // In the other case, we want pending and active property trees to share the | |
1124 // same map. | |
1125 return *this; | 1123 return *this; |
1126 } | 1124 } |
1127 | 1125 |
1128 bool ScrollTree::operator==(const ScrollTree& other) const { | 1126 bool ScrollTree::operator==(const ScrollTree& other) const { |
1129 const ScrollTree::ScrollOffsetMap& other_scroll_offset_map = | 1127 if (layer_id_to_scroll_offset_map_ != other.layer_id_to_scroll_offset_map_) |
1130 other.scroll_offset_map(); | |
1131 if (layer_id_to_scroll_offset_map_.size() != other_scroll_offset_map.size()) | |
1132 return false; | 1128 return false; |
1133 | 1129 if (layer_id_to_synced_scroll_offset_map_ != |
1134 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1130 other.layer_id_to_synced_scroll_offset_map_) |
1135 int key = map_entry.first; | 1131 return false; |
1136 if (other_scroll_offset_map.find(key) == other_scroll_offset_map.end() || | |
1137 map_entry.second != layer_id_to_scroll_offset_map_.at(key)) | |
1138 return false; | |
1139 } | |
1140 | 1132 |
1141 bool is_currently_scrolling_node_equal = | 1133 bool is_currently_scrolling_node_equal = |
1142 currently_scrolling_node_id_ == other.currently_scrolling_node_id_; | 1134 currently_scrolling_node_id_ == other.currently_scrolling_node_id_; |
1143 | 1135 |
1144 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; | 1136 return PropertyTree::operator==(other) && is_currently_scrolling_node_equal; |
1145 } | 1137 } |
1146 | 1138 |
| 1139 #if DCHECK_IS_ON() |
| 1140 void ScrollTree::CopyCompleteTreeState(const ScrollTree& other) { |
| 1141 currently_scrolling_node_id_ = other.currently_scrolling_node_id_; |
| 1142 layer_id_to_scrollbars_enabled_map_ = |
| 1143 other.layer_id_to_scrollbars_enabled_map_; |
| 1144 layer_id_to_scroll_offset_map_ = other.layer_id_to_scroll_offset_map_; |
| 1145 layer_id_to_synced_scroll_offset_map_ = |
| 1146 other.layer_id_to_synced_scroll_offset_map_; |
| 1147 } |
| 1148 #endif |
| 1149 |
1147 void ScrollTree::clear() { | 1150 void ScrollTree::clear() { |
1148 PropertyTree<ScrollNode>::clear(); | 1151 PropertyTree<ScrollNode>::clear(); |
1149 | 1152 |
1150 if (property_trees()->is_main_thread) { | 1153 if (property_trees()->is_main_thread) { |
1151 currently_scrolling_node_id_ = kInvalidNodeId; | 1154 currently_scrolling_node_id_ = kInvalidNodeId; |
1152 layer_id_to_scroll_offset_map_.clear(); | 1155 layer_id_to_scroll_offset_map_.clear(); |
1153 } | 1156 } |
1154 | 1157 |
1155 #if DCHECK_IS_ON() | 1158 #if DCHECK_IS_ON() |
1156 ScrollTree tree; | 1159 ScrollTree tree; |
1157 if (!property_trees()->is_main_thread) { | 1160 if (!property_trees()->is_main_thread) { |
| 1161 DCHECK(layer_id_to_scroll_offset_map_.empty()); |
1158 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_; | 1162 tree.currently_scrolling_node_id_ = currently_scrolling_node_id_; |
1159 tree.layer_id_to_scroll_offset_map_ = layer_id_to_scroll_offset_map_; | 1163 tree.layer_id_to_synced_scroll_offset_map_ = |
| 1164 layer_id_to_synced_scroll_offset_map_; |
1160 } | 1165 } |
1161 DCHECK(tree == *this); | 1166 DCHECK(tree == *this); |
1162 #endif | 1167 #endif |
1163 } | 1168 } |
1164 | 1169 |
1165 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { | 1170 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { |
1166 const ScrollNode* scroll_node = Node(scroll_node_id); | 1171 const ScrollNode* scroll_node = Node(scroll_node_id); |
1167 gfx::SizeF scroll_bounds = | 1172 gfx::SizeF scroll_bounds = |
1168 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height()); | 1173 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height()); |
1169 | 1174 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1262 gfx::Transform screen_space_transform( | 1267 gfx::Transform screen_space_transform( |
1263 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), | 1268 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), |
1264 scroll_node->offset_to_transform_parent.y()); | 1269 scroll_node->offset_to_transform_parent.y()); |
1265 screen_space_transform.ConcatTransform( | 1270 screen_space_transform.ConcatTransform( |
1266 transform_tree.ToScreen(transform_node->id)); | 1271 transform_tree.ToScreen(transform_node->id)); |
1267 if (scroll_node->should_flatten) | 1272 if (scroll_node->should_flatten) |
1268 screen_space_transform.FlattenTo2d(); | 1273 screen_space_transform.FlattenTo2d(); |
1269 return screen_space_transform; | 1274 return screen_space_transform; |
1270 } | 1275 } |
1271 | 1276 |
1272 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { | 1277 SyncedScrollOffset* ScrollTree::GetOrCreateSyncedScrollOffset(int layer_id) { |
1273 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1278 DCHECK(!property_trees()->is_main_thread); |
1274 layer_id_to_scroll_offset_map_.end()) { | 1279 if (layer_id_to_synced_scroll_offset_map_.find(layer_id) == |
1275 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset; | 1280 layer_id_to_synced_scroll_offset_map_.end()) { |
| 1281 layer_id_to_synced_scroll_offset_map_[layer_id] = new SyncedScrollOffset; |
1276 } | 1282 } |
1277 return layer_id_to_scroll_offset_map_[layer_id].get(); | 1283 return layer_id_to_synced_scroll_offset_map_[layer_id].get(); |
1278 } | 1284 } |
1279 | 1285 |
1280 const SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) const { | 1286 const SyncedScrollOffset* ScrollTree::GetSyncedScrollOffset( |
1281 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1287 int layer_id) const { |
1282 layer_id_to_scroll_offset_map_.end()) { | 1288 DCHECK(!property_trees()->is_main_thread); |
| 1289 if (layer_id_to_synced_scroll_offset_map_.find(layer_id) == |
| 1290 layer_id_to_synced_scroll_offset_map_.end()) { |
1283 return nullptr; | 1291 return nullptr; |
1284 } | 1292 } |
1285 return layer_id_to_scroll_offset_map_.at(layer_id).get(); | 1293 return layer_id_to_synced_scroll_offset_map_.at(layer_id).get(); |
1286 } | 1294 } |
1287 | 1295 |
1288 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { | 1296 const gfx::ScrollOffset ScrollTree::current_scroll_offset(int layer_id) const { |
1289 return synced_scroll_offset(layer_id) | 1297 if (property_trees()->is_main_thread) { |
1290 ? synced_scroll_offset(layer_id)->Current( | 1298 ScrollOffsetMap::const_iterator it = |
| 1299 layer_id_to_scroll_offset_map_.find(layer_id); |
| 1300 return it != layer_id_to_scroll_offset_map_.end() ? it->second |
| 1301 : gfx::ScrollOffset(); |
| 1302 } |
| 1303 return GetSyncedScrollOffset(layer_id) |
| 1304 ? GetSyncedScrollOffset(layer_id)->Current( |
1291 property_trees()->is_active) | 1305 property_trees()->is_active) |
1292 : gfx::ScrollOffset(); | 1306 : gfx::ScrollOffset(); |
1293 } | 1307 } |
1294 | 1308 |
1295 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( | 1309 gfx::ScrollOffset ScrollTree::PullDeltaForMainThread( |
1296 SyncedScrollOffset* scroll_offset) { | 1310 SyncedScrollOffset* scroll_offset) { |
1297 // TODO(flackr): We should pass the fractional scroll deltas when Blink fully | 1311 // TODO(flackr): We should pass the fractional scroll deltas when Blink fully |
1298 // supports fractional scrolls. | 1312 // supports fractional scrolls. |
1299 // TODO(flackr): We should ideally round the fractional scrolls in the same | 1313 // TODO(flackr): We should ideally round the fractional scrolls in the same |
1300 // direction as the scroll will be snapped but for common cases this is | 1314 // direction as the scroll will be snapped but for common cases this is |
1301 // equivalent to rounding to the nearest integer offset. | 1315 // equivalent to rounding to the nearest integer offset. |
1302 gfx::ScrollOffset current_offset = | 1316 gfx::ScrollOffset current_offset = |
1303 scroll_offset->Current(property_trees()->is_active); | 1317 scroll_offset->Current(property_trees()->is_active); |
1304 gfx::ScrollOffset rounded_offset = | 1318 gfx::ScrollOffset rounded_offset = |
1305 gfx::ScrollOffset(roundf(current_offset.x()), roundf(current_offset.y())); | 1319 gfx::ScrollOffset(roundf(current_offset.x()), roundf(current_offset.y())); |
1306 scroll_offset->SetCurrent(rounded_offset); | 1320 scroll_offset->SetCurrent(rounded_offset); |
1307 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); | 1321 gfx::ScrollOffset delta = scroll_offset->PullDeltaForMainThread(); |
1308 scroll_offset->SetCurrent(current_offset); | 1322 scroll_offset->SetCurrent(current_offset); |
1309 return delta; | 1323 return delta; |
1310 } | 1324 } |
1311 | 1325 |
1312 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, | 1326 void ScrollTree::CollectScrollDeltas(ScrollAndScaleSet* scroll_info, |
1313 int inner_viewport_layer_id) { | 1327 int inner_viewport_layer_id) { |
1314 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1328 DCHECK(!property_trees()->is_main_thread); |
| 1329 for (auto map_entry : layer_id_to_synced_scroll_offset_map_) { |
1315 gfx::ScrollOffset scroll_delta = | 1330 gfx::ScrollOffset scroll_delta = |
1316 PullDeltaForMainThread(map_entry.second.get()); | 1331 PullDeltaForMainThread(map_entry.second.get()); |
1317 | 1332 |
1318 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); | 1333 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y()); |
1319 int layer_id = map_entry.first; | 1334 int layer_id = map_entry.first; |
1320 | 1335 |
1321 if (!scroll_delta.IsZero()) { | 1336 if (!scroll_delta.IsZero()) { |
1322 if (layer_id == inner_viewport_layer_id) { | 1337 if (layer_id == inner_viewport_layer_id) { |
1323 // Inner (visual) viewport is stored separately. | 1338 // Inner (visual) viewport is stored separately. |
1324 scroll_info->inner_viewport_scroll.layer_id = layer_id; | 1339 scroll_info->inner_viewport_scroll.layer_id = layer_id; |
1325 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; | 1340 scroll_info->inner_viewport_scroll.scroll_delta = scroll_delta_vector; |
1326 } else { | 1341 } else { |
1327 LayerTreeHostCommon::ScrollUpdateInfo scroll; | 1342 LayerTreeHostCommon::ScrollUpdateInfo scroll; |
1328 scroll.layer_id = layer_id; | 1343 scroll.layer_id = layer_id; |
1329 scroll.scroll_delta = scroll_delta_vector; | 1344 scroll.scroll_delta = scroll_delta_vector; |
1330 scroll_info->scrolls.push_back(scroll); | 1345 scroll_info->scrolls.push_back(scroll); |
1331 } | 1346 } |
1332 } | 1347 } |
1333 } | 1348 } |
1334 } | 1349 } |
1335 | 1350 |
1336 void ScrollTree::CollectScrollDeltasForTesting() { | 1351 void ScrollTree::CollectScrollDeltasForTesting() { |
1337 for (auto map_entry : layer_id_to_scroll_offset_map_) { | 1352 for (auto map_entry : layer_id_to_synced_scroll_offset_map_) { |
1338 PullDeltaForMainThread(map_entry.second.get()); | 1353 PullDeltaForMainThread(map_entry.second.get()); |
1339 } | 1354 } |
1340 } | 1355 } |
1341 | 1356 |
1342 void ScrollTree::UpdateScrollOffsetMapEntry( | 1357 void ScrollTree::PushScrollUpdatesFromMainThread( |
1343 int key, | 1358 PropertyTrees* main_property_trees, |
1344 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1359 LayerTreeImpl* sync_tree) { |
1345 LayerTreeImpl* layer_tree_impl) { | 1360 DCHECK(!property_trees()->is_main_thread); |
1346 bool changed = false; | 1361 const ScrollOffsetMap& main_scroll_offset_map = |
1347 // If we are pushing scroll offset from main to pending tree, we create a new | 1362 main_property_trees->scroll_tree.layer_id_to_scroll_offset_map_; |
1348 // instance of synced scroll offset; if we are pushing from pending to active, | |
1349 // we reuse the pending tree's value in the map. | |
1350 if (!property_trees()->is_active) { | |
1351 changed = synced_scroll_offset(key)->PushFromMainThread( | |
1352 new_scroll_offset_map->at(key)->PendingBase()); | |
1353 | 1363 |
1354 if (new_scroll_offset_map->at(key)->clobber_active_value()) { | 1364 // We first want to clear SyncedProperty instances for layers which were |
1355 synced_scroll_offset(key)->set_clobber_active_value(); | 1365 // destroyed or became non-scrollable on the main thread. |
1356 } | 1366 for (auto map_entry = layer_id_to_synced_scroll_offset_map_.begin(); |
1357 if (changed) { | 1367 map_entry != layer_id_to_synced_scroll_offset_map_.end();) { |
1358 layer_tree_impl->DidUpdateScrollOffset(key); | 1368 int layer_id = map_entry->first; |
1359 } | 1369 if (main_scroll_offset_map.find(layer_id) == main_scroll_offset_map.end()) |
1360 } else { | 1370 map_entry = layer_id_to_synced_scroll_offset_map_.erase(map_entry); |
1361 layer_id_to_scroll_offset_map_[key] = new_scroll_offset_map->at(key); | 1371 else |
1362 changed |= synced_scroll_offset(key)->PushPendingToActive(); | 1372 map_entry++; |
1363 if (changed) { | 1373 } |
1364 layer_tree_impl->DidUpdateScrollOffset(key); | 1374 |
1365 } | 1375 for (auto map_entry : main_scroll_offset_map) { |
| 1376 int layer_id = map_entry.first; |
| 1377 SyncedScrollOffset* synced_scroll_offset = |
| 1378 GetOrCreateSyncedScrollOffset(layer_id); |
| 1379 |
| 1380 bool changed = synced_scroll_offset->PushFromMainThread(map_entry.second); |
| 1381 // If we are committing directly to the active tree, push pending to active |
| 1382 // here. |
| 1383 if (property_trees()->is_active) |
| 1384 changed |= synced_scroll_offset->PushPendingToActive(); |
| 1385 |
| 1386 if (changed) |
| 1387 sync_tree->DidUpdateScrollOffset(layer_id); |
1366 } | 1388 } |
1367 } | 1389 } |
1368 | 1390 |
1369 void ScrollTree::UpdateScrollOffsetMap( | 1391 void ScrollTree::PushScrollUpdatesFromPendingTree( |
1370 ScrollTree::ScrollOffsetMap* new_scroll_offset_map, | 1392 PropertyTrees* pending_property_trees, |
1371 LayerTreeImpl* layer_tree_impl) { | 1393 LayerTreeImpl* active_tree) { |
1372 if (layer_tree_impl && !layer_tree_impl->LayerListIsEmpty()) { | 1394 DCHECK(property_trees()->is_active); |
1373 DCHECK(!property_trees()->is_main_thread); | 1395 DCHECK(!pending_property_trees->is_main_thread); |
1374 for (auto map_entry = layer_id_to_scroll_offset_map_.begin(); | 1396 DCHECK(!pending_property_trees->is_active); |
1375 map_entry != layer_id_to_scroll_offset_map_.end();) { | |
1376 int key = map_entry->first; | |
1377 if (new_scroll_offset_map->find(key) != new_scroll_offset_map->end()) { | |
1378 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | |
1379 ++map_entry; | |
1380 } else { | |
1381 map_entry = layer_id_to_scroll_offset_map_.erase(map_entry); | |
1382 } | |
1383 } | |
1384 | 1397 |
1385 for (auto& map_entry : *new_scroll_offset_map) { | 1398 // When pushing to the active tree, we can simply copy over the map from the |
1386 int key = map_entry.first; | 1399 // pending tree. The pending and active tree hold a reference to the same |
1387 if (layer_id_to_scroll_offset_map_.find(key) == | 1400 // SyncedProperty instances. |
1388 layer_id_to_scroll_offset_map_.end()) | 1401 layer_id_to_synced_scroll_offset_map_.clear(); |
1389 UpdateScrollOffsetMapEntry(key, new_scroll_offset_map, layer_tree_impl); | 1402 for (auto map_entry : pending_property_trees->scroll_tree |
1390 } | 1403 .layer_id_to_synced_scroll_offset_map_) { |
| 1404 layer_id_to_synced_scroll_offset_map_[map_entry.first] = map_entry.second; |
| 1405 if (map_entry.second->PushPendingToActive()) |
| 1406 active_tree->DidUpdateScrollOffset(map_entry.first); |
1391 } | 1407 } |
1392 } | 1408 } |
1393 | 1409 |
1394 ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() { | |
1395 return layer_id_to_scroll_offset_map_; | |
1396 } | |
1397 | |
1398 const ScrollTree::ScrollOffsetMap& ScrollTree::scroll_offset_map() const { | |
1399 return layer_id_to_scroll_offset_map_; | |
1400 } | |
1401 | |
1402 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { | 1410 void ScrollTree::ApplySentScrollDeltasFromAbortedCommit() { |
1403 DCHECK(property_trees()->is_active); | 1411 DCHECK(property_trees()->is_active); |
1404 for (auto& map_entry : layer_id_to_scroll_offset_map_) | 1412 for (auto& map_entry : layer_id_to_synced_scroll_offset_map_) |
1405 map_entry.second->AbortCommit(); | 1413 map_entry.second->AbortCommit(); |
1406 } | 1414 } |
1407 | 1415 |
1408 bool ScrollTree::SetBaseScrollOffset(int layer_id, | 1416 bool ScrollTree::SetBaseScrollOffset(int layer_id, |
1409 const gfx::ScrollOffset& scroll_offset) { | 1417 const gfx::ScrollOffset& scroll_offset) { |
1410 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1418 if (property_trees()->is_main_thread) { |
| 1419 layer_id_to_scroll_offset_map_[layer_id] = scroll_offset; |
| 1420 return true; |
| 1421 } |
| 1422 |
| 1423 // Scroll offset updates on the impl thread should only be for layers which |
| 1424 // were created on the main thread. But this method is called when we build |
| 1425 // PropertyTrees on the impl thread from LayerTreeImpl. |
| 1426 return GetOrCreateSyncedScrollOffset(layer_id)->PushFromMainThread( |
| 1427 scroll_offset); |
1411 } | 1428 } |
1412 | 1429 |
1413 bool ScrollTree::SetScrollOffset(int layer_id, | 1430 bool ScrollTree::SetScrollOffset(int layer_id, |
1414 const gfx::ScrollOffset& scroll_offset) { | 1431 const gfx::ScrollOffset& scroll_offset) { |
1415 if (property_trees()->is_main_thread) | 1432 if (property_trees()->is_main_thread) { |
1416 return synced_scroll_offset(layer_id)->PushFromMainThread(scroll_offset); | 1433 if (layer_id_to_scroll_offset_map_[layer_id] == scroll_offset) |
1417 else if (property_trees()->is_active) | 1434 return false; |
1418 return synced_scroll_offset(layer_id)->SetCurrent(scroll_offset); | 1435 layer_id_to_scroll_offset_map_[layer_id] = scroll_offset; |
| 1436 return true; |
| 1437 } |
| 1438 |
| 1439 if (property_trees()->is_active) { |
| 1440 return GetOrCreateSyncedScrollOffset(layer_id)->SetCurrent(scroll_offset); |
| 1441 } |
| 1442 |
1419 return false; | 1443 return false; |
1420 } | 1444 } |
1421 | 1445 |
1422 bool ScrollTree::UpdateScrollOffsetBaseForTesting( | 1446 bool ScrollTree::UpdateScrollOffsetBaseForTesting( |
1423 int layer_id, | 1447 int layer_id, |
1424 const gfx::ScrollOffset& offset) { | 1448 const gfx::ScrollOffset& offset) { |
1425 DCHECK(!property_trees()->is_main_thread); | 1449 DCHECK(!property_trees()->is_main_thread); |
1426 bool changed = synced_scroll_offset(layer_id)->PushFromMainThread(offset); | 1450 SyncedScrollOffset* synced_scroll_offset = |
| 1451 GetOrCreateSyncedScrollOffset(layer_id); |
| 1452 bool changed = synced_scroll_offset->PushFromMainThread(offset); |
1427 if (property_trees()->is_active) | 1453 if (property_trees()->is_active) |
1428 changed |= synced_scroll_offset(layer_id)->PushPendingToActive(); | 1454 changed |= synced_scroll_offset->PushPendingToActive(); |
1429 return changed; | 1455 return changed; |
1430 } | 1456 } |
1431 | 1457 |
1432 bool ScrollTree::SetScrollOffsetDeltaForTesting(int layer_id, | 1458 bool ScrollTree::SetScrollOffsetDeltaForTesting(int layer_id, |
1433 const gfx::Vector2dF& delta) { | 1459 const gfx::Vector2dF& delta) { |
1434 return synced_scroll_offset(layer_id)->SetCurrent( | 1460 return GetOrCreateSyncedScrollOffset(layer_id)->SetCurrent( |
1435 synced_scroll_offset(layer_id)->ActiveBase() + gfx::ScrollOffset(delta)); | 1461 GetOrCreateSyncedScrollOffset(layer_id)->ActiveBase() + |
| 1462 gfx::ScrollOffset(delta)); |
1436 } | 1463 } |
1437 | 1464 |
1438 const gfx::ScrollOffset ScrollTree::GetScrollOffsetBaseForTesting( | 1465 const gfx::ScrollOffset ScrollTree::GetScrollOffsetBaseForTesting( |
1439 int layer_id) const { | 1466 int layer_id) const { |
1440 DCHECK(!property_trees()->is_main_thread); | 1467 DCHECK(!property_trees()->is_main_thread); |
1441 if (synced_scroll_offset(layer_id)) | 1468 if (GetSyncedScrollOffset(layer_id)) |
1442 return property_trees()->is_active | 1469 return property_trees()->is_active |
1443 ? synced_scroll_offset(layer_id)->ActiveBase() | 1470 ? GetSyncedScrollOffset(layer_id)->ActiveBase() |
1444 : synced_scroll_offset(layer_id)->PendingBase(); | 1471 : GetSyncedScrollOffset(layer_id)->PendingBase(); |
1445 else | 1472 else |
1446 return gfx::ScrollOffset(); | 1473 return gfx::ScrollOffset(); |
1447 } | 1474 } |
1448 | 1475 |
1449 const gfx::ScrollOffset ScrollTree::GetScrollOffsetDeltaForTesting( | 1476 const gfx::ScrollOffset ScrollTree::GetScrollOffsetDeltaForTesting( |
1450 int layer_id) const { | 1477 int layer_id) const { |
1451 DCHECK(!property_trees()->is_main_thread); | 1478 DCHECK(!property_trees()->is_main_thread); |
1452 if (synced_scroll_offset(layer_id)) | 1479 if (GetSyncedScrollOffset(layer_id)) |
1453 return property_trees()->is_active | 1480 return property_trees()->is_active |
1454 ? synced_scroll_offset(layer_id)->Delta() | 1481 ? GetSyncedScrollOffset(layer_id)->Delta() |
1455 : synced_scroll_offset(layer_id)->PendingDelta().get(); | 1482 : GetSyncedScrollOffset(layer_id)->PendingDelta().get(); |
1456 else | 1483 else |
1457 return gfx::ScrollOffset(); | 1484 return gfx::ScrollOffset(); |
1458 } | 1485 } |
1459 | 1486 |
1460 void ScrollTree::DistributeScroll(ScrollNode* scroll_node, | 1487 void ScrollTree::DistributeScroll(ScrollNode* scroll_node, |
1461 ScrollState* scroll_state) { | 1488 ScrollState* scroll_state) { |
1462 DCHECK(scroll_node && scroll_state); | 1489 DCHECK(scroll_node && scroll_state); |
1463 if (scroll_state->FullyConsumed()) | 1490 if (scroll_state->FullyConsumed()) |
1464 return; | 1491 return; |
1465 scroll_state->DistributeToScrollChainDescendant(); | 1492 scroll_state->DistributeToScrollChainDescendant(); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1594 changed = false; | 1621 changed = false; |
1595 non_root_surfaces_enabled = true; | 1622 non_root_surfaces_enabled = true; |
1596 sequence_number++; | 1623 sequence_number++; |
1597 | 1624 |
1598 #if DCHECK_IS_ON() | 1625 #if DCHECK_IS_ON() |
1599 PropertyTrees tree; | 1626 PropertyTrees tree; |
1600 tree.transform_tree = transform_tree; | 1627 tree.transform_tree = transform_tree; |
1601 tree.effect_tree = effect_tree; | 1628 tree.effect_tree = effect_tree; |
1602 tree.clip_tree = clip_tree; | 1629 tree.clip_tree = clip_tree; |
1603 tree.scroll_tree = scroll_tree; | 1630 tree.scroll_tree = scroll_tree; |
1604 // Scroll offset map and currently scrolling node id may not be copied | 1631 tree.scroll_tree.CopyCompleteTreeState(scroll_tree); |
1605 // during operator=. | |
1606 ScrollTree::ScrollOffsetMap& map = tree.scroll_tree.scroll_offset_map(); | |
1607 map = scroll_tree.scroll_offset_map(); | |
1608 tree.scroll_tree.set_currently_scrolling_node( | |
1609 scroll_tree.CurrentlyScrollingNodeId()); | |
1610 | 1632 |
1611 tree.sequence_number = sequence_number; | 1633 tree.sequence_number = sequence_number; |
1612 tree.is_main_thread = is_main_thread; | 1634 tree.is_main_thread = is_main_thread; |
1613 tree.is_active = is_active; | 1635 tree.is_active = is_active; |
1614 DCHECK(tree == *this); | 1636 DCHECK(tree == *this); |
1615 #endif | 1637 #endif |
1616 } | 1638 } |
1617 | 1639 |
1618 void PropertyTrees::SetInnerViewportContainerBoundsDelta( | 1640 void PropertyTrees::SetInnerViewportContainerBoundsDelta( |
1619 gfx::Vector2dF bounds_delta) { | 1641 gfx::Vector2dF bounds_delta) { |
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 | 2074 |
2053 const EffectNode* effect_node = effect_tree.Node(effect_id); | 2075 const EffectNode* effect_node = effect_tree.Node(effect_id); |
2054 | 2076 |
2055 bool success = GetFromTarget(transform_id, effect_id, transform); | 2077 bool success = GetFromTarget(transform_id, effect_id, transform); |
2056 transform->Scale(effect_node->surface_contents_scale.x(), | 2078 transform->Scale(effect_node->surface_contents_scale.x(), |
2057 effect_node->surface_contents_scale.y()); | 2079 effect_node->surface_contents_scale.y()); |
2058 return success; | 2080 return success; |
2059 } | 2081 } |
2060 | 2082 |
2061 } // namespace cc | 2083 } // namespace cc |
OLD | NEW |