Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 1250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1261 | 1261 |
| 1262 SurfaceSequence LayerTreeHost::CreateSurfaceSequence() { | 1262 SurfaceSequence LayerTreeHost::CreateSurfaceSequence() { |
| 1263 return SurfaceSequence(surface_id_namespace_, next_surface_sequence_++); | 1263 return SurfaceSequence(surface_id_namespace_, next_surface_sequence_++); |
| 1264 } | 1264 } |
| 1265 | 1265 |
| 1266 Layer* LayerTreeHost::LayerById(int id) const { | 1266 Layer* LayerTreeHost::LayerById(int id) const { |
| 1267 LayerIdMap::const_iterator iter = layer_id_map_.find(id); | 1267 LayerIdMap::const_iterator iter = layer_id_map_.find(id); |
| 1268 return iter != layer_id_map_.end() ? iter->second : NULL; | 1268 return iter != layer_id_map_.end() ? iter->second : NULL; |
| 1269 } | 1269 } |
| 1270 | 1270 |
| 1271 Layer* LayerTreeHost::LayerForElementId(ElementId element_id) const { | |
| 1272 auto iter = element_id_to_layer_map_.find(element_id); | |
| 1273 return iter != element_id_to_layer_map_.end() ? iter->second.main : nullptr; | |
| 1274 } | |
| 1275 | |
| 1276 Layer* LayerTreeHost::ScrollLayerForElementId(ElementId element_id) const { | |
| 1277 auto iter = element_id_to_layer_map_.find(element_id); | |
| 1278 return iter != element_id_to_layer_map_.end() ? iter->second.scroll : nullptr; | |
|
esprehn
2016/05/10 22:55:13
this could just be tracked inside blink and access
loyso (OOO)
2016/05/12 06:02:15
We definitely can't do this:
1) In impl compositor
| |
| 1279 } | |
| 1280 | |
| 1271 void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) { | 1281 void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) { |
| 1272 layers_that_should_push_properties_.insert(layer); | 1282 layers_that_should_push_properties_.insert(layer); |
| 1273 } | 1283 } |
| 1274 | 1284 |
| 1275 void LayerTreeHost::RemoveLayerShouldPushProperties(Layer* layer) { | 1285 void LayerTreeHost::RemoveLayerShouldPushProperties(Layer* layer) { |
| 1276 layers_that_should_push_properties_.erase(layer); | 1286 layers_that_should_push_properties_.erase(layer); |
| 1277 } | 1287 } |
| 1278 | 1288 |
| 1279 std::unordered_set<Layer*>& LayerTreeHost::LayersThatShouldPushProperties() { | 1289 std::unordered_set<Layer*>& LayerTreeHost::LayersThatShouldPushProperties() { |
| 1280 return layers_that_should_push_properties_; | 1290 return layers_that_should_push_properties_; |
| 1281 } | 1291 } |
| 1282 | 1292 |
| 1283 bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) { | 1293 bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) { |
| 1284 return layers_that_should_push_properties_.find(layer) != | 1294 return layers_that_should_push_properties_.find(layer) != |
| 1285 layers_that_should_push_properties_.end(); | 1295 layers_that_should_push_properties_.end(); |
| 1286 } | 1296 } |
| 1287 | 1297 |
| 1288 void LayerTreeHost::RegisterLayer(Layer* layer) { | 1298 void LayerTreeHost::RegisterLayer(Layer* layer) { |
| 1289 DCHECK(!LayerById(layer->id())); | 1299 DCHECK(!LayerById(layer->id())); |
| 1290 DCHECK(!in_paint_layer_contents_); | 1300 DCHECK(!in_paint_layer_contents_); |
| 1291 layer_id_map_[layer->id()] = layer; | 1301 layer_id_map_[layer->id()] = layer; |
| 1292 animation_host_->RegisterElement(layer->id(), ElementListType::ACTIVE); | |
| 1293 } | 1302 } |
| 1294 | 1303 |
| 1295 void LayerTreeHost::UnregisterLayer(Layer* layer) { | 1304 void LayerTreeHost::UnregisterLayer(Layer* layer) { |
| 1296 DCHECK(LayerById(layer->id())); | 1305 DCHECK(LayerById(layer->id())); |
| 1297 DCHECK(!in_paint_layer_contents_); | 1306 DCHECK(!in_paint_layer_contents_); |
| 1298 animation_host_->UnregisterElement(layer->id(), ElementListType::ACTIVE); | |
| 1299 RemoveLayerShouldPushProperties(layer); | 1307 RemoveLayerShouldPushProperties(layer); |
| 1300 layer_id_map_.erase(layer->id()); | 1308 layer_id_map_.erase(layer->id()); |
| 1301 } | 1309 } |
| 1302 | 1310 |
| 1311 void LayerTreeHost::RegisterLayerForElementId(Layer* layer) { | |
| 1312 DCHECK(layer->element_id()); | |
| 1313 ElementLayers& element_layers = element_id_to_layer_map_[layer->element_id()]; | |
| 1314 if (layer->scrollable()) { | |
| 1315 DCHECK(!element_layers.scroll); | |
| 1316 element_layers.scroll = layer; | |
| 1317 } else { | |
| 1318 DCHECK(!element_layers.main); | |
| 1319 element_layers.main = layer; | |
| 1320 } | |
| 1321 animation_host_->RegisterElement(layer->element_id(), | |
| 1322 ElementListType::ACTIVE); | |
| 1323 } | |
| 1324 | |
| 1325 void LayerTreeHost::UnregisterLayerForElementId(Layer* layer) { | |
| 1326 DCHECK(layer->element_id()); | |
| 1327 animation_host_->UnregisterElement(layer->element_id(), | |
| 1328 ElementListType::ACTIVE); | |
| 1329 | |
| 1330 auto iter = element_id_to_layer_map_.find(layer->element_id()); | |
| 1331 if (iter == element_id_to_layer_map_.end()) | |
| 1332 return; | |
| 1333 | |
| 1334 ElementLayers& element_layers = iter->second; | |
| 1335 if (layer->scrollable()) { | |
| 1336 DCHECK_EQ(element_layers.scroll, layer); | |
| 1337 element_layers.scroll = nullptr; | |
| 1338 } else { | |
| 1339 DCHECK_EQ(element_layers.main, layer); | |
| 1340 element_layers.main = nullptr; | |
| 1341 } | |
| 1342 | |
| 1343 if (!element_layers.main && !element_layers.scroll) | |
| 1344 element_id_to_layer_map_.erase(layer->element_id()); | |
| 1345 } | |
| 1346 | |
| 1303 bool LayerTreeHost::IsElementInList(ElementId element_id, | 1347 bool LayerTreeHost::IsElementInList(ElementId element_id, |
| 1304 ElementListType list_type) const { | 1348 ElementListType list_type) const { |
| 1305 return list_type == ElementListType::ACTIVE && LayerById(element_id); | 1349 return list_type == ElementListType::ACTIVE && |
| 1350 element_id_to_layer_map_.find(element_id) != | |
| 1351 element_id_to_layer_map_.end(); | |
| 1306 } | 1352 } |
| 1307 | 1353 |
| 1308 void LayerTreeHost::SetMutatorsNeedCommit() { | 1354 void LayerTreeHost::SetMutatorsNeedCommit() { |
| 1309 SetNeedsCommit(); | 1355 SetNeedsCommit(); |
| 1310 } | 1356 } |
| 1311 | 1357 |
| 1312 void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { | 1358 void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { |
| 1313 property_trees_.needs_rebuild = true; | 1359 property_trees_.needs_rebuild = true; |
| 1314 } | 1360 } |
| 1315 | 1361 |
| 1316 void LayerTreeHost::SetElementFilterMutated(ElementId element_id, | 1362 void LayerTreeHost::SetElementFilterMutated(ElementId element_id, |
| 1317 ElementListType list_type, | 1363 ElementListType list_type, |
| 1318 const FilterOperations& filters) { | 1364 const FilterOperations& filters) { |
| 1319 Layer* layer = LayerById(element_id); | 1365 Layer* layer = LayerForElementId(element_id); |
| 1320 DCHECK(layer); | 1366 DCHECK(layer); |
| 1321 layer->OnFilterAnimated(filters); | 1367 layer->OnFilterAnimated(filters); |
| 1322 } | 1368 } |
| 1323 | 1369 |
| 1324 void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, | 1370 void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, |
| 1325 ElementListType list_type, | 1371 ElementListType list_type, |
| 1326 float opacity) { | 1372 float opacity) { |
| 1327 Layer* layer = LayerById(element_id); | 1373 Layer* layer = LayerForElementId(element_id); |
| 1328 DCHECK(layer); | 1374 DCHECK(layer); |
| 1329 layer->OnOpacityAnimated(opacity); | 1375 layer->OnOpacityAnimated(opacity); |
| 1330 } | 1376 } |
| 1331 | 1377 |
| 1332 void LayerTreeHost::SetElementTransformMutated( | 1378 void LayerTreeHost::SetElementTransformMutated( |
| 1333 ElementId element_id, | 1379 ElementId element_id, |
| 1334 ElementListType list_type, | 1380 ElementListType list_type, |
| 1335 const gfx::Transform& transform) { | 1381 const gfx::Transform& transform) { |
| 1336 Layer* layer = LayerById(element_id); | 1382 Layer* layer = LayerForElementId(element_id); |
| 1337 DCHECK(layer); | 1383 DCHECK(layer); |
| 1338 layer->OnTransformAnimated(transform); | 1384 layer->OnTransformAnimated(transform); |
| 1339 } | 1385 } |
| 1340 | 1386 |
| 1341 void LayerTreeHost::SetElementScrollOffsetMutated( | 1387 void LayerTreeHost::SetElementScrollOffsetMutated( |
| 1342 ElementId element_id, | 1388 ElementId element_id, |
| 1343 ElementListType list_type, | 1389 ElementListType list_type, |
| 1344 const gfx::ScrollOffset& scroll_offset) { | 1390 const gfx::ScrollOffset& scroll_offset) { |
| 1345 Layer* layer = LayerById(element_id); | 1391 Layer* layer = ScrollLayerForElementId(element_id); |
| 1346 DCHECK(layer); | 1392 DCHECK(layer); |
| 1347 layer->OnScrollOffsetAnimated(scroll_offset); | 1393 layer->OnScrollOffsetAnimated(scroll_offset); |
| 1348 } | 1394 } |
| 1349 | 1395 |
| 1350 void LayerTreeHost::ElementTransformIsPotentiallyAnimatingChanged( | 1396 void LayerTreeHost::ElementTransformIsPotentiallyAnimatingChanged( |
| 1351 ElementId element_id, | 1397 ElementId element_id, |
| 1352 ElementListType list_type, | 1398 ElementListType list_type, |
| 1353 bool is_animating) { | 1399 bool is_animating) { |
| 1354 Layer* layer = LayerById(element_id); | 1400 Layer* layer = LayerForElementId(element_id); |
| 1355 DCHECK(layer); | 1401 if (layer) |
| 1356 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); | 1402 layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); |
| 1357 } | 1403 } |
| 1358 | 1404 |
| 1359 gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( | 1405 gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( |
| 1360 ElementId element_id) const { | 1406 ElementId element_id) const { |
| 1361 Layer* layer = LayerById(element_id); | 1407 Layer* layer = ScrollLayerForElementId(element_id); |
| 1362 DCHECK(layer); | 1408 DCHECK(layer); |
| 1363 return layer->ScrollOffsetForAnimation(); | 1409 return layer->ScrollOffsetForAnimation(); |
| 1364 } | 1410 } |
| 1365 | 1411 |
| 1366 bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted( | 1412 bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted( |
| 1367 const Layer* layer) const { | 1413 const Layer* layer) const { |
| 1368 return animation_host_->ScrollOffsetAnimationWasInterrupted(layer->id()); | 1414 if (!layer->element_id()) |
| 1415 return false; | |
| 1416 | |
| 1417 return animation_host_->ScrollOffsetAnimationWasInterrupted( | |
| 1418 layer->element_id()); | |
| 1369 } | 1419 } |
| 1370 | 1420 |
| 1371 bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const { | 1421 bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const { |
| 1372 return animation_host_->IsAnimatingFilterProperty(layer->id(), | 1422 if (!layer->element_id()) |
| 1423 return false; | |
| 1424 | |
| 1425 return animation_host_->IsAnimatingFilterProperty(layer->element_id(), | |
| 1373 ElementListType::ACTIVE); | 1426 ElementListType::ACTIVE); |
| 1374 } | 1427 } |
| 1375 | 1428 |
| 1376 bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const { | 1429 bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const { |
| 1377 return animation_host_->IsAnimatingOpacityProperty(layer->id(), | 1430 if (!layer->element_id()) |
| 1431 return false; | |
| 1432 | |
| 1433 return animation_host_->IsAnimatingOpacityProperty(layer->element_id(), | |
| 1378 ElementListType::ACTIVE); | 1434 ElementListType::ACTIVE); |
| 1379 } | 1435 } |
| 1380 | 1436 |
| 1381 bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const { | 1437 bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const { |
| 1382 return animation_host_->IsAnimatingTransformProperty(layer->id(), | 1438 if (!layer->element_id()) |
| 1439 return false; | |
| 1440 | |
| 1441 return animation_host_->IsAnimatingTransformProperty(layer->element_id(), | |
| 1383 ElementListType::ACTIVE); | 1442 ElementListType::ACTIVE); |
| 1384 } | 1443 } |
| 1385 | 1444 |
| 1386 bool LayerTreeHost::HasPotentiallyRunningFilterAnimation( | 1445 bool LayerTreeHost::HasPotentiallyRunningFilterAnimation( |
| 1387 const Layer* layer) const { | 1446 const Layer* layer) const { |
| 1447 if (!layer->element_id()) | |
| 1448 return false; | |
| 1449 | |
| 1388 return animation_host_->HasPotentiallyRunningFilterAnimation( | 1450 return animation_host_->HasPotentiallyRunningFilterAnimation( |
| 1389 layer->id(), ElementListType::ACTIVE); | 1451 layer->element_id(), ElementListType::ACTIVE); |
| 1390 } | 1452 } |
| 1391 | 1453 |
| 1392 bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation( | 1454 bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation( |
| 1393 const Layer* layer) const { | 1455 const Layer* layer) const { |
| 1456 if (!layer->element_id()) | |
| 1457 return false; | |
| 1458 | |
| 1394 return animation_host_->HasPotentiallyRunningOpacityAnimation( | 1459 return animation_host_->HasPotentiallyRunningOpacityAnimation( |
| 1395 layer->id(), ElementListType::ACTIVE); | 1460 layer->element_id(), ElementListType::ACTIVE); |
| 1396 } | 1461 } |
| 1397 | 1462 |
| 1398 bool LayerTreeHost::HasPotentiallyRunningTransformAnimation( | 1463 bool LayerTreeHost::HasPotentiallyRunningTransformAnimation( |
| 1399 const Layer* layer) const { | 1464 const Layer* layer) const { |
| 1465 if (!layer->element_id()) | |
| 1466 return false; | |
| 1467 | |
| 1400 return animation_host_->HasPotentiallyRunningTransformAnimation( | 1468 return animation_host_->HasPotentiallyRunningTransformAnimation( |
| 1401 layer->id(), ElementListType::ACTIVE); | 1469 layer->element_id(), ElementListType::ACTIVE); |
| 1402 } | 1470 } |
| 1403 | 1471 |
| 1404 bool LayerTreeHost::HasOnlyTranslationTransforms(const Layer* layer) const { | 1472 bool LayerTreeHost::HasOnlyTranslationTransforms(const Layer* layer) const { |
| 1405 return animation_host_->HasOnlyTranslationTransforms(layer->id(), | 1473 if (!layer->element_id()) |
| 1474 return true; | |
| 1475 | |
| 1476 return animation_host_->HasOnlyTranslationTransforms(layer->element_id(), | |
| 1406 ElementListType::ACTIVE); | 1477 ElementListType::ACTIVE); |
| 1407 } | 1478 } |
| 1408 | 1479 |
| 1409 bool LayerTreeHost::MaximumTargetScale(const Layer* layer, | 1480 bool LayerTreeHost::MaximumTargetScale(const Layer* layer, |
| 1410 float* max_scale) const { | 1481 float* max_scale) const { |
| 1482 if (!layer->element_id()) | |
| 1483 return true; | |
| 1484 | |
| 1411 return animation_host_->MaximumTargetScale( | 1485 return animation_host_->MaximumTargetScale( |
| 1412 layer->id(), ElementListType::ACTIVE, max_scale); | 1486 layer->element_id(), ElementListType::ACTIVE, max_scale); |
| 1413 } | 1487 } |
| 1414 | 1488 |
| 1415 bool LayerTreeHost::AnimationStartScale(const Layer* layer, | 1489 bool LayerTreeHost::AnimationStartScale(const Layer* layer, |
| 1416 float* start_scale) const { | 1490 float* start_scale) const { |
| 1491 if (!layer->element_id()) | |
| 1492 return true; | |
| 1493 | |
| 1417 return animation_host_->AnimationStartScale( | 1494 return animation_host_->AnimationStartScale( |
| 1418 layer->id(), ElementListType::ACTIVE, start_scale); | 1495 layer->element_id(), ElementListType::ACTIVE, start_scale); |
| 1419 } | 1496 } |
| 1420 | 1497 |
| 1421 bool LayerTreeHost::HasAnyAnimationTargetingProperty( | 1498 bool LayerTreeHost::HasAnyAnimationTargetingProperty( |
| 1422 const Layer* layer, | 1499 const Layer* layer, |
| 1423 TargetProperty::Type property) const { | 1500 TargetProperty::Type property) const { |
| 1424 return animation_host_->HasAnyAnimationTargetingProperty(layer->id(), | 1501 if (!layer->element_id()) |
| 1502 return false; | |
| 1503 | |
| 1504 return animation_host_->HasAnyAnimationTargetingProperty(layer->element_id(), | |
| 1425 property); | 1505 property); |
| 1426 } | 1506 } |
| 1427 | 1507 |
| 1428 bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const { | 1508 bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const { |
| 1429 return animation_host_->AnimationsPreserveAxisAlignment(layer->id()); | 1509 if (!layer->element_id()) |
| 1510 return true; | |
| 1511 | |
| 1512 return animation_host_->AnimationsPreserveAxisAlignment(layer->element_id()); | |
| 1430 } | 1513 } |
| 1431 | 1514 |
| 1432 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { | 1515 bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { |
| 1433 return animation_host_->HasAnyAnimation(layer->id()); | 1516 if (!layer->element_id()) |
| 1517 return false; | |
| 1518 | |
| 1519 return animation_host_->HasAnyAnimation(layer->element_id()); | |
| 1434 } | 1520 } |
| 1435 | 1521 |
| 1436 bool LayerTreeHost::HasActiveAnimationForTesting(const Layer* layer) const { | 1522 bool LayerTreeHost::HasActiveAnimationForTesting(const Layer* layer) const { |
| 1437 return animation_host_->HasActiveAnimationForTesting(layer->id()); | 1523 if (!layer->element_id()) |
| 1524 return false; | |
| 1525 | |
| 1526 return animation_host_->HasActiveAnimationForTesting(layer->element_id()); | |
| 1438 } | 1527 } |
| 1439 | 1528 |
| 1440 bool LayerTreeHost::IsSingleThreaded() const { | 1529 bool LayerTreeHost::IsSingleThreaded() const { |
| 1441 DCHECK(compositor_mode_ != CompositorMode::SINGLE_THREADED || | 1530 DCHECK(compositor_mode_ != CompositorMode::SINGLE_THREADED || |
| 1442 !task_runner_provider_->HasImplThread()); | 1531 !task_runner_provider_->HasImplThread()); |
| 1443 return compositor_mode_ == CompositorMode::SINGLE_THREADED; | 1532 return compositor_mode_ == CompositorMode::SINGLE_THREADED; |
| 1444 } | 1533 } |
| 1445 | 1534 |
| 1446 bool LayerTreeHost::IsThreaded() const { | 1535 bool LayerTreeHost::IsThreaded() const { |
| 1447 DCHECK(compositor_mode_ != CompositorMode::THREADED || | 1536 DCHECK(compositor_mode_ != CompositorMode::THREADED || |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1632 int seq_num = property_trees_.sequence_number; | 1721 int seq_num = property_trees_.sequence_number; |
| 1633 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { | 1722 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { |
| 1634 layer->set_property_tree_sequence_number(seq_num); | 1723 layer->set_property_tree_sequence_number(seq_num); |
| 1635 }); | 1724 }); |
| 1636 | 1725 |
| 1637 surface_id_namespace_ = proto.surface_id_namespace(); | 1726 surface_id_namespace_ = proto.surface_id_namespace(); |
| 1638 next_surface_sequence_ = proto.next_surface_sequence(); | 1727 next_surface_sequence_ = proto.next_surface_sequence(); |
| 1639 } | 1728 } |
| 1640 | 1729 |
| 1641 } // namespace cc | 1730 } // namespace cc |
| OLD | NEW |