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 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1108 if (!layer->double_sided() && TransformToParentIsKnown(layer) && | 1108 if (!layer->double_sided() && TransformToParentIsKnown(layer) && |
1109 IsSurfaceBackFaceVisible(layer, combined_transform)) | 1109 IsSurfaceBackFaceVisible(layer, combined_transform)) |
1110 return; | 1110 return; |
1111 | 1111 |
1112 if (!layer->render_surface()) | 1112 if (!layer->render_surface()) |
1113 layer->CreateRenderSurface(); | 1113 layer->CreateRenderSurface(); |
1114 | 1114 |
1115 RenderSurfaceType* render_surface = layer->render_surface(); | 1115 RenderSurfaceType* render_surface = layer->render_surface(); |
1116 render_surface->ClearLayerLists(); | 1116 render_surface->ClearLayerLists(); |
1117 | 1117 |
1118 // The owning layer's draw transform has a scale from content to layer | 1118 if (IsRootLayer(layer)) { |
1119 // space which we do not want; so here we use the combined_transform | 1119 // The root layer isn't capable of transforming its render surface since |
enne (OOO)
2013/06/04 17:26:03
Hmm. I'm not sure about the "external to the CC i
aelias_OOO_until_Jul13
2013/06/04 17:54:20
Done.
| |
1120 // instead of the draw_transform. However, we do need to add a different | 1120 // it's not created from within this CC instance. So it should just |
1121 // scale factor that accounts for the surface's pixel dimensions. | 1121 // forward top-level transforms to the rest of the tree. |
1122 combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(), | 1122 sublayer_matrix = combined_transform; |
enne (OOO)
2013/06/04 17:26:03
What if the root layer also has a sublayer_matrix
aelias_OOO_until_Jul13
2013/06/04 17:54:20
It should be fine because that will be applied lat
| |
1123 1.0 / render_surface_sublayer_scale.y()); | 1123 } else { |
1124 render_surface->SetDrawTransform(combined_transform); | 1124 // The owning layer's draw transform has a scale from content to layer |
1125 // space which we do not want; so here we use the combined_transform | |
1126 // instead of the draw_transform. However, we do need to add a different | |
1127 // scale factor that accounts for the surface's pixel dimensions. | |
1128 combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(), | |
1129 1.0 / render_surface_sublayer_scale.y()); | |
1130 render_surface->SetDrawTransform(combined_transform); | |
1125 | 1131 |
1126 // If this is the root layer, there should be no scale in the surface's draw | 1132 // The owning layer's transform was re-parented by the surface, so the |
1127 // transform. | 1133 // layer's new draw_transform only needs to scale the layer to surface |
1128 if (IsRootLayer(layer)) { | 1134 // space. |
1129 DCHECK_EQ(render_surface_sublayer_scale.x(), | 1135 layer_draw_properties.target_space_transform.MakeIdentity(); |
danakj
2013/06/04 17:26:40
Can these checks stay in the IsRootLayer() block?
danakj
2013/06/04 17:31:30
enne pointed out that webview may want to actually
aelias_OOO_until_Jul13
2013/06/04 17:54:20
Patch Set 1 above applied it directly to root-laye
danakj
2013/06/04 18:02:50
Lost information: I mean that if you set a scale 2
aelias_OOO_until_Jul13
2013/06/04 22:18:27
I changed my mind on this, I believe this use case
| |
1130 combined_transform_scales.x()); | 1136 layer_draw_properties.target_space_transform. |
1131 DCHECK_EQ(render_surface_sublayer_scale.y(), | 1137 Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(), |
1132 combined_transform_scales.y()); | 1138 render_surface_sublayer_scale.y() / layer->contents_scale_y()); |
1139 | |
1140 // Inside the surface's subtree, we scale everything to the owning layer's | |
1141 // scale. The sublayer matrix transforms layer rects into target surface | |
1142 // content space. Conceptually, all layers in the subtree inherit the | |
1143 // scale at the point of the render surface in the transform hierarchy, | |
1144 // but we apply it explicitly to the owning layer and the remainder of the | |
1145 // subtree independently. | |
1146 DCHECK(sublayer_matrix.IsIdentity()); | |
1147 sublayer_matrix.Scale(render_surface_sublayer_scale.x(), | |
1148 render_surface_sublayer_scale.y()); | |
1133 } | 1149 } |
1134 | 1150 |
1135 // The owning layer's transform was re-parented by the surface, so the | |
1136 // layer's new draw_transform only needs to scale the layer to surface | |
1137 // space. | |
1138 layer_draw_properties.target_space_transform.MakeIdentity(); | |
1139 layer_draw_properties.target_space_transform. | |
1140 Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(), | |
1141 render_surface_sublayer_scale.y() / layer->contents_scale_y()); | |
1142 | |
1143 // Inside the surface's subtree, we scale everything to the owning layer's | |
1144 // scale. The sublayer matrix transforms layer rects into target surface | |
1145 // content space. Conceptually, all layers in the subtree inherit the scale | |
1146 // at the point of the render surface in the transform hierarchy, but we | |
1147 // apply it explicitly to the owning layer and the remainder of the subtree | |
1148 // indenpendently. | |
1149 DCHECK(sublayer_matrix.IsIdentity()); | |
1150 sublayer_matrix.Scale(render_surface_sublayer_scale.x(), | |
1151 render_surface_sublayer_scale.y()); | |
1152 | |
1153 // The opacity value is moved from the layer to its surface, so that the | 1151 // The opacity value is moved from the layer to its surface, so that the |
1154 // entire subtree properly inherits opacity. | 1152 // entire subtree properly inherits opacity. |
1155 render_surface->SetDrawOpacity(accumulated_draw_opacity); | 1153 render_surface->SetDrawOpacity(accumulated_draw_opacity); |
1156 render_surface->SetDrawOpacityIsAnimating(animating_opacity_to_target); | 1154 render_surface->SetDrawOpacityIsAnimating(animating_opacity_to_target); |
1157 animating_opacity_to_target = false; | 1155 animating_opacity_to_target = false; |
1158 layer_draw_properties.opacity = 1.f; | 1156 layer_draw_properties.opacity = 1.f; |
1159 layer_draw_properties.opacity_is_animating = animating_opacity_to_target; | 1157 layer_draw_properties.opacity_is_animating = animating_opacity_to_target; |
1160 layer_draw_properties.screen_space_opacity_is_animating = | 1158 layer_draw_properties.screen_space_opacity_is_animating = |
1161 animating_opacity_to_screen; | 1159 animating_opacity_to_screen; |
1162 | 1160 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1330 current_scroll_compensation_matrix); | 1328 current_scroll_compensation_matrix); |
1331 LayerType* next_fixed_container = | 1329 LayerType* next_fixed_container = |
1332 layer->IsContainerForFixedPositionLayers() ? | 1330 layer->IsContainerForFixedPositionLayers() ? |
1333 layer : current_fixed_container; | 1331 layer : current_fixed_container; |
1334 | 1332 |
1335 gfx::Rect accumulated_drawable_content_rect_of_children; | 1333 gfx::Rect accumulated_drawable_content_rect_of_children; |
1336 for (size_t i = 0; i < layer->children().size(); ++i) { | 1334 for (size_t i = 0; i < layer->children().size(); ++i) { |
1337 LayerType* child = | 1335 LayerType* child = |
1338 LayerTreeHostCommon::get_child_as_raw_ptr(layer->children(), i); | 1336 LayerTreeHostCommon::get_child_as_raw_ptr(layer->children(), i); |
1339 gfx::Rect drawable_content_rect_of_child_subtree; | 1337 gfx::Rect drawable_content_rect_of_child_subtree; |
1338 gfx::Transform identity_matrix; | |
1340 CalculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>( | 1339 CalculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>( |
1341 child, | 1340 child, |
1342 sublayer_matrix, | 1341 sublayer_matrix, |
1343 next_hierarchy_matrix, | 1342 next_hierarchy_matrix, |
1344 next_scroll_compensation_matrix, | 1343 next_scroll_compensation_matrix, |
1345 next_fixed_container, | 1344 next_fixed_container, |
1346 clip_rect_for_subtree, | 1345 clip_rect_for_subtree, |
1347 clip_rect_for_subtree_in_descendant_space, | 1346 clip_rect_for_subtree_in_descendant_space, |
1348 subtree_should_be_clipped, | 1347 subtree_should_be_clipped, |
1349 nearest_ancestor_that_moves_pixels, | 1348 nearest_ancestor_that_moves_pixels, |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1519 layer->render_target()->render_surface()-> | 1518 layer->render_target()->render_surface()-> |
1520 AddContributingDelegatedRenderPassLayer(layer); | 1519 AddContributingDelegatedRenderPassLayer(layer); |
1521 } | 1520 } |
1522 | 1521 |
1523 SavePaintPropertiesLayer(layer); | 1522 SavePaintPropertiesLayer(layer); |
1524 } | 1523 } |
1525 | 1524 |
1526 void LayerTreeHostCommon::CalculateDrawProperties( | 1525 void LayerTreeHostCommon::CalculateDrawProperties( |
1527 Layer* root_layer, | 1526 Layer* root_layer, |
1528 gfx::Size device_viewport_size, | 1527 gfx::Size device_viewport_size, |
1528 const gfx::Transform& device_transform, | |
1529 float device_scale_factor, | 1529 float device_scale_factor, |
1530 float page_scale_factor, | 1530 float page_scale_factor, |
1531 Layer* page_scale_application_layer, | 1531 Layer* page_scale_application_layer, |
1532 int max_texture_size, | 1532 int max_texture_size, |
1533 bool can_use_lcd_text, | 1533 bool can_use_lcd_text, |
1534 bool can_adjust_raster_scales, | 1534 bool can_adjust_raster_scales, |
1535 LayerList* render_surface_layer_list) { | 1535 LayerList* render_surface_layer_list) { |
1536 gfx::Rect total_drawable_content_rect; | 1536 gfx::Rect total_drawable_content_rect; |
1537 gfx::Transform identity_matrix; | 1537 gfx::Transform identity_matrix; |
1538 gfx::Transform device_scale_transform; | 1538 gfx::Transform scaled_device_transform = device_transform; |
1539 device_scale_transform.Scale(device_scale_factor, device_scale_factor); | 1539 scaled_device_transform.Scale(device_scale_factor, device_scale_factor); |
1540 LayerList dummy_layer_list; | 1540 LayerList dummy_layer_list; |
1541 | 1541 |
1542 // The root layer's render_surface should receive the device viewport as the | 1542 // The root layer's render_surface should receive the device viewport as the |
1543 // initial clip rect. | 1543 // initial clip rect. |
1544 bool subtree_should_be_clipped = true; | 1544 bool subtree_should_be_clipped = true; |
1545 gfx::Rect device_viewport_rect(device_viewport_size); | 1545 gfx::Rect device_viewport_rect(device_viewport_size); |
1546 bool in_subtree_of_page_scale_application_layer = false; | 1546 bool in_subtree_of_page_scale_application_layer = false; |
1547 | 1547 |
1548 // This function should have received a root layer. | 1548 // This function should have received a root layer. |
1549 DCHECK(IsRootLayer(root_layer)); | 1549 DCHECK(IsRootLayer(root_layer)); |
1550 | 1550 |
1551 PreCalculateMetaInformation<Layer>(root_layer); | 1551 PreCalculateMetaInformation<Layer>(root_layer); |
1552 CalculateDrawPropertiesInternal<Layer, LayerList, RenderSurface>( | 1552 CalculateDrawPropertiesInternal<Layer, LayerList, RenderSurface>( |
1553 root_layer, | 1553 root_layer, |
1554 device_scale_transform, | 1554 scaled_device_transform, |
1555 identity_matrix, | 1555 identity_matrix, |
1556 identity_matrix, | 1556 identity_matrix, |
1557 NULL, | 1557 NULL, |
1558 device_viewport_rect, | 1558 device_viewport_rect, |
1559 device_viewport_rect, | 1559 device_viewport_rect, |
1560 subtree_should_be_clipped, | 1560 subtree_should_be_clipped, |
1561 NULL, | 1561 NULL, |
1562 render_surface_layer_list, | 1562 render_surface_layer_list, |
1563 &dummy_layer_list, | 1563 &dummy_layer_list, |
1564 NULL, | 1564 NULL, |
1565 max_texture_size, | 1565 max_texture_size, |
1566 device_scale_factor, | 1566 device_scale_factor, |
1567 page_scale_factor, | 1567 page_scale_factor, |
1568 page_scale_application_layer, | 1568 page_scale_application_layer, |
1569 in_subtree_of_page_scale_application_layer, | 1569 in_subtree_of_page_scale_application_layer, |
1570 can_use_lcd_text, | 1570 can_use_lcd_text, |
1571 can_adjust_raster_scales, | 1571 can_adjust_raster_scales, |
1572 &total_drawable_content_rect); | 1572 &total_drawable_content_rect); |
1573 | 1573 |
1574 // The dummy layer list should not have been used. | 1574 // The dummy layer list should not have been used. |
1575 DCHECK_EQ(0u, dummy_layer_list.size()); | 1575 DCHECK_EQ(0u, dummy_layer_list.size()); |
1576 // A root layer render_surface should always exist after | 1576 // A root layer render_surface should always exist after |
1577 // CalculateDrawProperties. | 1577 // CalculateDrawProperties. |
1578 DCHECK(root_layer->render_surface()); | 1578 DCHECK(root_layer->render_surface()); |
1579 } | 1579 } |
1580 | 1580 |
1581 void LayerTreeHostCommon::CalculateDrawProperties( | 1581 void LayerTreeHostCommon::CalculateDrawProperties( |
1582 LayerImpl* root_layer, | 1582 LayerImpl* root_layer, |
1583 gfx::Size device_viewport_size, | 1583 gfx::Size device_viewport_size, |
1584 const gfx::Transform& device_transform, | |
1584 float device_scale_factor, | 1585 float device_scale_factor, |
1585 float page_scale_factor, | 1586 float page_scale_factor, |
1586 LayerImpl* page_scale_application_layer, | 1587 LayerImpl* page_scale_application_layer, |
1587 int max_texture_size, | 1588 int max_texture_size, |
1588 bool can_use_lcd_text, | 1589 bool can_use_lcd_text, |
1589 bool can_adjust_raster_scales, | 1590 bool can_adjust_raster_scales, |
1590 LayerImplList* render_surface_layer_list) { | 1591 LayerImplList* render_surface_layer_list) { |
1591 gfx::Rect total_drawable_content_rect; | 1592 gfx::Rect total_drawable_content_rect; |
1592 gfx::Transform identity_matrix; | 1593 gfx::Transform identity_matrix; |
1593 gfx::Transform device_scale_transform; | 1594 gfx::Transform scaled_device_transform = device_transform; |
1594 device_scale_transform.Scale(device_scale_factor, device_scale_factor); | 1595 scaled_device_transform.Scale(device_scale_factor, device_scale_factor); |
1595 LayerImplList dummy_layer_list; | 1596 LayerImplList dummy_layer_list; |
1596 LayerSorter layer_sorter; | 1597 LayerSorter layer_sorter; |
1597 | 1598 |
1598 // The root layer's render_surface should receive the device viewport as the | 1599 // The root layer's render_surface should receive the device viewport as the |
1599 // initial clip rect. | 1600 // initial clip rect. |
1600 bool subtree_should_be_clipped = true; | 1601 bool subtree_should_be_clipped = true; |
1601 gfx::Rect device_viewport_rect(device_viewport_size); | 1602 gfx::Rect device_viewport_rect(device_viewport_size); |
1602 bool in_subtree_of_page_scale_application_layer = false; | 1603 bool in_subtree_of_page_scale_application_layer = false; |
1603 | 1604 |
1604 // This function should have received a root layer. | 1605 // This function should have received a root layer. |
1605 DCHECK(IsRootLayer(root_layer)); | 1606 DCHECK(IsRootLayer(root_layer)); |
1606 | 1607 |
1607 PreCalculateMetaInformation<LayerImpl>(root_layer); | 1608 PreCalculateMetaInformation<LayerImpl>(root_layer); |
1608 CalculateDrawPropertiesInternal<LayerImpl, | 1609 CalculateDrawPropertiesInternal<LayerImpl, |
1609 LayerImplList, | 1610 LayerImplList, |
1610 RenderSurfaceImpl>( | 1611 RenderSurfaceImpl>( |
1611 root_layer, | 1612 root_layer, |
1612 device_scale_transform, | 1613 scaled_device_transform, |
1613 identity_matrix, | 1614 identity_matrix, |
1614 identity_matrix, | 1615 identity_matrix, |
1615 NULL, | 1616 NULL, |
1616 device_viewport_rect, | 1617 device_viewport_rect, |
1617 device_viewport_rect, | 1618 device_viewport_rect, |
1618 subtree_should_be_clipped, | 1619 subtree_should_be_clipped, |
1619 NULL, | 1620 NULL, |
1620 render_surface_layer_list, | 1621 render_surface_layer_list, |
1621 &dummy_layer_list, | 1622 &dummy_layer_list, |
1622 &layer_sorter, | 1623 &layer_sorter, |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1821 // At this point, we think the point does hit the touch event handler region | 1822 // At this point, we think the point does hit the touch event handler region |
1822 // on the layer, but we need to walk up the parents to ensure that the layer | 1823 // on the layer, but we need to walk up the parents to ensure that the layer |
1823 // was not clipped in such a way that the hit point actually should not hit | 1824 // was not clipped in such a way that the hit point actually should not hit |
1824 // the layer. | 1825 // the layer. |
1825 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) | 1826 if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl)) |
1826 return false; | 1827 return false; |
1827 | 1828 |
1828 return true; | 1829 return true; |
1829 } | 1830 } |
1830 } // namespace cc | 1831 } // namespace cc |
OLD | NEW |