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

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

Issue 2621403003: cc: Don't create SyncedPropety instances on the main thread. (Closed)
Patch Set: win test Created 3 years, 11 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/tree_synchronizer_unittest.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 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/tree_synchronizer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698