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_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 // Note: Again, Concat is used to conver the result coordinate space from | 405 // Note: Again, Concat is used to conver the result coordinate space from |
406 // the container render surface to the container layer. | 406 // the container render surface to the container layer. |
407 target_surface_space_to_container_layer_space.ConcatTransform( | 407 target_surface_space_to_container_layer_space.ConcatTransform( |
408 container_target_surface_space_to_container_layer_space); | 408 container_target_surface_space_to_container_layer_space); |
409 } | 409 } |
410 } | 410 } |
411 | 411 |
412 // Apply step 3 | 412 // Apply step 3 |
413 gfx::Transform container_layer_space_to_target_surface_space; | 413 gfx::Transform container_layer_space_to_target_surface_space; |
414 if (target_surface_space_to_container_layer_space.GetInverse( | 414 if (target_surface_space_to_container_layer_space.GetInverse( |
415 &container_layer_space_to_target_surface_space)) | 415 &container_layer_space_to_target_surface_space)) { |
416 result_transform.PreconcatTransform( | 416 result_transform.PreconcatTransform( |
417 container_layer_space_to_target_surface_space); | 417 container_layer_space_to_target_surface_space); |
418 else { | 418 } else { |
419 // FIXME: A non-invertible matrix could still make meaningful projection. | 419 // FIXME: A non-invertible matrix could still make meaningful projection. |
420 // For example ScaleZ(0) is non-invertible but the layer is still visible. | 420 // For example ScaleZ(0) is non-invertible but the layer is still visible. |
421 return gfx::Transform(); | 421 return gfx::Transform(); |
422 } | 422 } |
423 | 423 |
424 // Apply step 2 | 424 // Apply step 2 |
425 result_transform.Translate(position_offset.x(), position_offset.y()); | 425 result_transform.Translate(position_offset.x(), position_offset.y()); |
426 | 426 |
427 // Apply step 1 | 427 // Apply step 1 |
428 result_transform.PreconcatTransform( | 428 result_transform.PreconcatTransform( |
429 target_surface_space_to_container_layer_space); | 429 target_surface_space_to_container_layer_space); |
430 | 430 |
431 return result_transform; | 431 return result_transform; |
432 } | 432 } |
433 | 433 |
434 void ApplyPositionAdjustment( | 434 void ApplyPositionAdjustment( |
435 Layer* layer, | 435 Layer* layer, |
436 Layer* container, | 436 Layer* container, |
437 const gfx::Transform& scroll_compensation, | 437 const gfx::Transform& scroll_compensation, |
438 gfx::Transform* combined_transform) { } | 438 gfx::Transform* combined_transform) { } |
439 void ApplyPositionAdjustment( | 439 void ApplyPositionAdjustment( |
440 LayerImpl* layer, | 440 LayerImpl* layer, |
441 LayerImpl* container, | 441 LayerImpl* container, |
442 const gfx::Transform& scroll_compensation, | 442 const gfx::Transform& scroll_compensation, |
443 gfx::Transform* combined_transform) | 443 gfx::Transform* combined_transform) { |
444 { | |
445 if (!layer->position_constraint().is_fixed_position()) | 444 if (!layer->position_constraint().is_fixed_position()) |
446 return; | 445 return; |
447 | 446 |
448 // Special case: this layer is a composited fixed-position layer; we need to | 447 // Special case: this layer is a composited fixed-position layer; we need to |
449 // explicitly compensate for all ancestors' nonzero scroll_deltas to keep | 448 // explicitly compensate for all ancestors' nonzero scroll_deltas to keep |
450 // this layer fixed correctly. | 449 // this layer fixed correctly. |
451 // Note carefully: this is Concat, not Preconcat | 450 // Note carefully: this is Concat, not Preconcat |
452 // (current_scroll_compensation * combined_transform). | 451 // (current_scroll_compensation * combined_transform). |
453 combined_transform->ConcatTransform(scroll_compensation); | 452 combined_transform->ConcatTransform(scroll_compensation); |
454 | 453 |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 gfx::Rect clip_rect_from_ancestor_in_descendant_space, | 769 gfx::Rect clip_rect_from_ancestor_in_descendant_space, |
771 bool ancestor_clips_subtree, | 770 bool ancestor_clips_subtree, |
772 RenderSurfaceType* nearest_ancestor_that_moves_pixels, | 771 RenderSurfaceType* nearest_ancestor_that_moves_pixels, |
773 LayerList* render_surface_layer_list, | 772 LayerList* render_surface_layer_list, |
774 LayerList* layer_list, | 773 LayerList* layer_list, |
775 LayerSorter* layer_sorter, | 774 LayerSorter* layer_sorter, |
776 int max_texture_size, | 775 int max_texture_size, |
777 float device_scale_factor, | 776 float device_scale_factor, |
778 float page_scale_factor, | 777 float page_scale_factor, |
779 bool subtree_can_use_lcd_text, | 778 bool subtree_can_use_lcd_text, |
780 gfx::Rect* drawable_content_rect_of_subtree, | 779 gfx::Rect* drawable_content_rect_of_subtree) { |
781 bool update_tile_priorities) { | |
782 // This function computes the new matrix transformations recursively for this | 780 // This function computes the new matrix transformations recursively for this |
783 // layer and all its descendants. It also computes the appropriate render | 781 // layer and all its descendants. It also computes the appropriate render |
784 // surfaces. | 782 // surfaces. |
785 // Some important points to remember: | 783 // Some important points to remember: |
786 // | 784 // |
787 // 0. Here, transforms are notated in Matrix x Vector order, and in words we | 785 // 0. Here, transforms are notated in Matrix x Vector order, and in words we |
788 // describe what the transform does from left to right. | 786 // describe what the transform does from left to right. |
789 // | 787 // |
790 // 1. In our terminology, the "layer origin" refers to the top-left corner of | 788 // 1. In our terminology, the "layer origin" refers to the top-left corner of |
791 // a layer, and the positive Y-axis points downwards. This interpretation is | 789 // a layer, and the positive Y-axis points downwards. This interpretation is |
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1249 clip_rect_for_subtree_in_descendant_space, | 1247 clip_rect_for_subtree_in_descendant_space, |
1250 subtree_should_be_clipped, | 1248 subtree_should_be_clipped, |
1251 nearest_ancestor_that_moves_pixels, | 1249 nearest_ancestor_that_moves_pixels, |
1252 render_surface_layer_list, | 1250 render_surface_layer_list, |
1253 &descendants, | 1251 &descendants, |
1254 layer_sorter, | 1252 layer_sorter, |
1255 max_texture_size, | 1253 max_texture_size, |
1256 device_scale_factor, | 1254 device_scale_factor, |
1257 page_scale_factor, | 1255 page_scale_factor, |
1258 subtree_can_use_lcd_text, | 1256 subtree_can_use_lcd_text, |
1259 &drawable_content_rect_of_child_subtree, | 1257 &drawable_content_rect_of_child_subtree); |
1260 update_tile_priorities); | |
1261 if (!drawable_content_rect_of_child_subtree.IsEmpty()) { | 1258 if (!drawable_content_rect_of_child_subtree.IsEmpty()) { |
1262 accumulated_drawable_content_rect_of_children.Union( | 1259 accumulated_drawable_content_rect_of_children.Union( |
1263 drawable_content_rect_of_child_subtree); | 1260 drawable_content_rect_of_child_subtree); |
1264 if (child->render_surface()) | 1261 if (child->render_surface()) |
1265 descendants.push_back(child); | 1262 descendants.push_back(child); |
1266 } | 1263 } |
1267 } | 1264 } |
1268 | 1265 |
1269 if (layer->render_surface() && !IsRootLayer(layer) && | 1266 if (layer->render_surface() && !IsRootLayer(layer) && |
1270 layer->render_surface()->layer_list().empty()) { | 1267 layer->render_surface()->layer_list().empty()) { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1384 // Compute the replica's "screen_space_transform" that maps from the | 1381 // Compute the replica's "screen_space_transform" that maps from the |
1385 // replica's origin space to the screen's origin space. | 1382 // replica's origin space to the screen's origin space. |
1386 gfx::Transform replica_screen_space_transform = | 1383 gfx::Transform replica_screen_space_transform = |
1387 layer->render_surface()->screen_space_transform() * | 1384 layer->render_surface()->screen_space_transform() * |
1388 surface_origin_to_replica_origin_transform; | 1385 surface_origin_to_replica_origin_transform; |
1389 render_surface->SetReplicaScreenSpaceTransform( | 1386 render_surface->SetReplicaScreenSpaceTransform( |
1390 replica_screen_space_transform); | 1387 replica_screen_space_transform); |
1391 } | 1388 } |
1392 } | 1389 } |
1393 | 1390 |
1394 if (update_tile_priorities) | 1391 UpdateTilePrioritiesForLayer(layer); |
1395 UpdateTilePrioritiesForLayer(layer); | |
1396 | 1392 |
1397 // If neither this layer nor any of its children were added, early out. | 1393 // If neither this layer nor any of its children were added, early out. |
1398 if (sorting_start_index == descendants.size()) | 1394 if (sorting_start_index == descendants.size()) |
1399 return; | 1395 return; |
1400 | 1396 |
1401 // If preserves-3d then sort all the descendants in 3D so that they can be | 1397 // If preserves-3d then sort all the descendants in 3D so that they can be |
1402 // drawn from back to front. If the preserves-3d property is also set on the | 1398 // drawn from back to front. If the preserves-3d property is also set on the |
1403 // parent then skip the sorting as the parent will sort all the descendants | 1399 // parent then skip the sorting as the parent will sort all the descendants |
1404 // anyway. | 1400 // anyway. |
1405 if (layer_sorter && descendants.size() && layer->preserves_3d() && | 1401 if (layer_sorter && descendants.size() && layer->preserves_3d() && |
(...skipping 29 matching lines...) Expand all Loading... |
1435 gfx::Rect total_drawable_content_rect; | 1431 gfx::Rect total_drawable_content_rect; |
1436 gfx::Transform identity_matrix; | 1432 gfx::Transform identity_matrix; |
1437 gfx::Transform device_scale_transform; | 1433 gfx::Transform device_scale_transform; |
1438 device_scale_transform.Scale(device_scale_factor, device_scale_factor); | 1434 device_scale_transform.Scale(device_scale_factor, device_scale_factor); |
1439 LayerList dummy_layer_list; | 1435 LayerList dummy_layer_list; |
1440 | 1436 |
1441 // The root layer's render_surface should receive the device viewport as the | 1437 // The root layer's render_surface should receive the device viewport as the |
1442 // initial clip rect. | 1438 // initial clip rect. |
1443 bool subtree_should_be_clipped = true; | 1439 bool subtree_should_be_clipped = true; |
1444 gfx::Rect device_viewport_rect(device_viewport_size); | 1440 gfx::Rect device_viewport_rect(device_viewport_size); |
1445 bool update_tile_priorities = false; | |
1446 | 1441 |
1447 // This function should have received a root layer. | 1442 // This function should have received a root layer. |
1448 DCHECK(IsRootLayer(root_layer)); | 1443 DCHECK(IsRootLayer(root_layer)); |
1449 | 1444 |
1450 PreCalculateMetaInformation<Layer>(root_layer); | 1445 PreCalculateMetaInformation<Layer>(root_layer); |
1451 CalculateDrawPropertiesInternal<Layer, | 1446 CalculateDrawPropertiesInternal<Layer, |
1452 LayerList, | 1447 LayerList, |
1453 RenderSurface>(root_layer, | 1448 RenderSurface>(root_layer, |
1454 device_scale_transform, | 1449 device_scale_transform, |
1455 identity_matrix, | 1450 identity_matrix, |
1456 identity_matrix, | 1451 identity_matrix, |
1457 NULL, | 1452 NULL, |
1458 device_viewport_rect, | 1453 device_viewport_rect, |
1459 device_viewport_rect, | 1454 device_viewport_rect, |
1460 subtree_should_be_clipped, | 1455 subtree_should_be_clipped, |
1461 NULL, | 1456 NULL, |
1462 render_surface_layer_list, | 1457 render_surface_layer_list, |
1463 &dummy_layer_list, | 1458 &dummy_layer_list, |
1464 NULL, | 1459 NULL, |
1465 max_texture_size, | 1460 max_texture_size, |
1466 device_scale_factor, | 1461 device_scale_factor, |
1467 page_scale_factor, | 1462 page_scale_factor, |
1468 can_use_lcd_text, | 1463 can_use_lcd_text, |
1469 &total_drawable_content_rect, | 1464 &total_drawable_content_rect); |
1470 update_tile_priorities); | |
1471 | 1465 |
1472 // The dummy layer list should not have been used. | 1466 // The dummy layer list should not have been used. |
1473 DCHECK_EQ(0u, dummy_layer_list.size()); | 1467 DCHECK_EQ(0u, dummy_layer_list.size()); |
1474 // A root layer render_surface should always exist after | 1468 // A root layer render_surface should always exist after |
1475 // CalculateDrawProperties. | 1469 // CalculateDrawProperties. |
1476 DCHECK(root_layer->render_surface()); | 1470 DCHECK(root_layer->render_surface()); |
1477 } | 1471 } |
1478 | 1472 |
1479 void LayerTreeHostCommon::CalculateDrawProperties( | 1473 void LayerTreeHostCommon::CalculateDrawProperties( |
1480 LayerImpl* root_layer, | 1474 LayerImpl* root_layer, |
1481 gfx::Size device_viewport_size, | 1475 gfx::Size device_viewport_size, |
1482 float device_scale_factor, | 1476 float device_scale_factor, |
1483 float page_scale_factor, | 1477 float page_scale_factor, |
1484 int max_texture_size, | 1478 int max_texture_size, |
1485 bool can_use_lcd_text, | 1479 bool can_use_lcd_text, |
1486 LayerImplList* render_surface_layer_list, | 1480 LayerImplList* render_surface_layer_list) { |
1487 bool update_tile_priorities) { | |
1488 gfx::Rect total_drawable_content_rect; | 1481 gfx::Rect total_drawable_content_rect; |
1489 gfx::Transform identity_matrix; | 1482 gfx::Transform identity_matrix; |
1490 gfx::Transform device_scale_transform; | 1483 gfx::Transform device_scale_transform; |
1491 device_scale_transform.Scale(device_scale_factor, device_scale_factor); | 1484 device_scale_transform.Scale(device_scale_factor, device_scale_factor); |
1492 LayerImplList dummy_layer_list; | 1485 LayerImplList dummy_layer_list; |
1493 LayerSorter layer_sorter; | 1486 LayerSorter layer_sorter; |
1494 | 1487 |
1495 // The root layer's render_surface should receive the device viewport as the | 1488 // The root layer's render_surface should receive the device viewport as the |
1496 // initial clip rect. | 1489 // initial clip rect. |
1497 bool subtree_should_be_clipped = true; | 1490 bool subtree_should_be_clipped = true; |
(...skipping 15 matching lines...) Expand all Loading... |
1513 device_viewport_rect, | 1506 device_viewport_rect, |
1514 subtree_should_be_clipped, | 1507 subtree_should_be_clipped, |
1515 NULL, | 1508 NULL, |
1516 render_surface_layer_list, | 1509 render_surface_layer_list, |
1517 &dummy_layer_list, | 1510 &dummy_layer_list, |
1518 &layer_sorter, | 1511 &layer_sorter, |
1519 max_texture_size, | 1512 max_texture_size, |
1520 device_scale_factor, | 1513 device_scale_factor, |
1521 page_scale_factor, | 1514 page_scale_factor, |
1522 can_use_lcd_text, | 1515 can_use_lcd_text, |
1523 &total_drawable_content_rect, | 1516 &total_drawable_content_rect); |
1524 update_tile_priorities); | |
1525 | 1517 |
1526 // The dummy layer list should not have been used. | 1518 // The dummy layer list should not have been used. |
1527 DCHECK_EQ(0u, dummy_layer_list.size()); | 1519 DCHECK_EQ(0u, dummy_layer_list.size()); |
1528 // A root layer render_surface should always exist after | 1520 // A root layer render_surface should always exist after |
1529 // CalculateDrawProperties. | 1521 // CalculateDrawProperties. |
1530 DCHECK(root_layer->render_surface()); | 1522 DCHECK(root_layer->render_surface()); |
1531 } | 1523 } |
1532 | 1524 |
1533 static bool PointHitsRect( | 1525 static bool PointHitsRect( |
1534 gfx::PointF screen_space_point, | 1526 gfx::PointF screen_space_point, |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 // At this point, we think the point does hit the touch event handler region | 1707 // At this point, we think the point does hit the touch event handler region |
1716 // on the layer, but we need to walk up the parents to ensure that the layer | 1708 // on the layer, but we need to walk up the parents to ensure that the layer |
1717 // was not clipped in such a way that the hit point actually should not hit | 1709 // was not clipped in such a way that the hit point actually should not hit |
1718 // the layer. | 1710 // the layer. |
1719 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) | 1711 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) |
1720 return false; | 1712 return false; |
1721 | 1713 |
1722 return true; | 1714 return true; |
1723 } | 1715 } |
1724 } // namespace cc | 1716 } // namespace cc |
OLD | NEW |