| 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 1813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1824 layer->contents_opaque(); | 1824 layer->contents_opaque(); |
| 1825 } | 1825 } |
| 1826 | 1826 |
| 1827 // full_hierarchy_matrix is the matrix that transforms objects between screen | 1827 // full_hierarchy_matrix is the matrix that transforms objects between screen |
| 1828 // space (except projection matrix) and the most recent RenderSurfaceImpl's | 1828 // space (except projection matrix) and the most recent RenderSurfaceImpl's |
| 1829 // space. next_hierarchy_matrix will only change if this layer uses a new | 1829 // space. next_hierarchy_matrix will only change if this layer uses a new |
| 1830 // RenderSurfaceImpl, otherwise remains the same. | 1830 // RenderSurfaceImpl, otherwise remains the same. |
| 1831 data_for_children.full_hierarchy_matrix = | 1831 data_for_children.full_hierarchy_matrix = |
| 1832 data_from_ancestor.full_hierarchy_matrix; | 1832 data_from_ancestor.full_hierarchy_matrix; |
| 1833 | 1833 |
| 1834 // If the subtree will scale layer contents by the transform hierarchy, then | |
| 1835 // we should scale things into the render surface by the transform hierarchy | |
| 1836 // to take advantage of that. | |
| 1837 gfx::Vector2dF render_surface_sublayer_scale = | |
| 1838 globals.can_adjust_raster_scales | |
| 1839 ? combined_transform_scales | |
| 1840 : gfx::Vector2dF(layer_scale_factors, layer_scale_factors); | |
| 1841 | |
| 1842 bool render_to_separate_surface = | 1834 bool render_to_separate_surface = |
| 1843 IsRootLayer(layer) || | 1835 IsRootLayer(layer) || |
| 1844 (globals.can_render_to_separate_surface && layer->render_surface()); | 1836 (globals.can_render_to_separate_surface && layer->render_surface()); |
| 1845 | 1837 |
| 1846 if (render_to_separate_surface) { | 1838 if (render_to_separate_surface) { |
| 1847 DCHECK(layer->render_surface()); | 1839 DCHECK(layer->render_surface()); |
| 1848 // Check back-face visibility before continuing with this surface and its | 1840 // Check back-face visibility before continuing with this surface and its |
| 1849 // subtree | 1841 // subtree |
| 1850 if (!layer->double_sided() && TransformToParentIsKnown(layer) && | 1842 if (!layer->double_sided() && TransformToParentIsKnown(layer) && |
| 1851 IsSurfaceBackFaceVisible(layer, combined_transform)) { | 1843 IsSurfaceBackFaceVisible(layer, combined_transform)) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1866 data_for_children.parent_matrix = combined_transform; | 1858 data_for_children.parent_matrix = combined_transform; |
| 1867 | 1859 |
| 1868 // The root surface does not contribute to any other surface, it has no | 1860 // The root surface does not contribute to any other surface, it has no |
| 1869 // target. | 1861 // target. |
| 1870 layer->render_surface()->set_contributes_to_drawn_surface(false); | 1862 layer->render_surface()->set_contributes_to_drawn_surface(false); |
| 1871 } else { | 1863 } else { |
| 1872 // The owning layer's draw transform has a scale from content to layer | 1864 // The owning layer's draw transform has a scale from content to layer |
| 1873 // space which we do not want; so here we use the combined_transform | 1865 // space which we do not want; so here we use the combined_transform |
| 1874 // instead of the draw_transform. However, we do need to add a different | 1866 // instead of the draw_transform. However, we do need to add a different |
| 1875 // scale factor that accounts for the surface's pixel dimensions. | 1867 // scale factor that accounts for the surface's pixel dimensions. |
| 1876 combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(), | 1868 // Remove the combined_transform scale from the draw transform. |
| 1877 1.0 / render_surface_sublayer_scale.y()); | 1869 gfx::Transform draw_transform = combined_transform; |
| 1878 render_surface->SetDrawTransform(combined_transform); | 1870 draw_transform.Scale(1.0 / combined_transform_scales.x(), |
| 1871 1.0 / combined_transform_scales.y()); |
| 1872 render_surface->SetDrawTransform(draw_transform); |
| 1879 | 1873 |
| 1880 // The owning layer's transform was re-parented by the surface, so the | 1874 // The owning layer's transform was re-parented by the surface, so the |
| 1881 // layer's new draw_transform only needs to scale the layer to surface | 1875 // layer's new draw_transform only needs to scale the layer to surface |
| 1882 // space. | 1876 // space. |
| 1883 layer_draw_properties.target_space_transform.MakeIdentity(); | 1877 layer_draw_properties.target_space_transform.MakeIdentity(); |
| 1884 layer_draw_properties.target_space_transform. | 1878 layer_draw_properties.target_space_transform.Scale( |
| 1885 Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(), | 1879 combined_transform_scales.x() / layer->contents_scale_x(), |
| 1886 render_surface_sublayer_scale.y() / layer->contents_scale_y()); | 1880 combined_transform_scales.y() / layer->contents_scale_y()); |
| 1887 | 1881 |
| 1888 // Inside the surface's subtree, we scale everything to the owning layer's | 1882 // Inside the surface's subtree, we scale everything to the owning layer's |
| 1889 // scale. The sublayer matrix transforms layer rects into target surface | 1883 // scale. The sublayer matrix transforms layer rects into target surface |
| 1890 // content space. Conceptually, all layers in the subtree inherit the | 1884 // content space. Conceptually, all layers in the subtree inherit the |
| 1891 // scale at the point of the render surface in the transform hierarchy, | 1885 // scale at the point of the render surface in the transform hierarchy, |
| 1892 // but we apply it explicitly to the owning layer and the remainder of the | 1886 // but we apply it explicitly to the owning layer and the remainder of the |
| 1893 // subtree independently. | 1887 // subtree independently. |
| 1894 DCHECK(data_for_children.parent_matrix.IsIdentity()); | 1888 DCHECK(data_for_children.parent_matrix.IsIdentity()); |
| 1895 data_for_children.parent_matrix.Scale(render_surface_sublayer_scale.x(), | 1889 data_for_children.parent_matrix.Scale(combined_transform_scales.x(), |
| 1896 render_surface_sublayer_scale.y()); | 1890 combined_transform_scales.y()); |
| 1897 | 1891 |
| 1898 // Even if the |layer_is_drawn|, it only contributes to a drawn surface | 1892 // Even if the |layer_is_drawn|, it only contributes to a drawn surface |
| 1899 // when the |layer_is_visible|. | 1893 // when the |layer_is_visible|. |
| 1900 layer->render_surface()->set_contributes_to_drawn_surface( | 1894 layer->render_surface()->set_contributes_to_drawn_surface( |
| 1901 layer_is_visible); | 1895 layer_is_visible); |
| 1902 } | 1896 } |
| 1903 | 1897 |
| 1904 // The opacity value is moved from the layer to its surface, so that the | 1898 // The opacity value is moved from the layer to its surface, so that the |
| 1905 // entire subtree properly inherits opacity. | 1899 // entire subtree properly inherits opacity. |
| 1906 render_surface->SetDrawOpacity(accumulated_draw_opacity); | 1900 render_surface->SetDrawOpacity(accumulated_draw_opacity); |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2304 IsRootLayer(layer->parent()->render_target()) || | 2298 IsRootLayer(layer->parent()->render_target()) || |
| 2305 layer->parent()->render_target()->is_root_for_isolated_group()); | 2299 layer->parent()->render_target()->is_root_for_isolated_group()); |
| 2306 | 2300 |
| 2307 render_surface->SetContentRect(clipped_content_rect); | 2301 render_surface->SetContentRect(clipped_content_rect); |
| 2308 | 2302 |
| 2309 // The owning layer's screen_space_transform has a scale from content to | 2303 // The owning layer's screen_space_transform has a scale from content to |
| 2310 // layer space which we need to undo and replace with a scale from the | 2304 // layer space which we need to undo and replace with a scale from the |
| 2311 // surface's subtree into layer space. | 2305 // surface's subtree into layer space. |
| 2312 gfx::Transform screen_space_transform = layer->screen_space_transform(); | 2306 gfx::Transform screen_space_transform = layer->screen_space_transform(); |
| 2313 screen_space_transform.Scale( | 2307 screen_space_transform.Scale( |
| 2314 layer->contents_scale_x() / render_surface_sublayer_scale.x(), | 2308 layer->contents_scale_x() / combined_transform_scales.x(), |
| 2315 layer->contents_scale_y() / render_surface_sublayer_scale.y()); | 2309 layer->contents_scale_y() / combined_transform_scales.y()); |
| 2316 render_surface->SetScreenSpaceTransform(screen_space_transform); | 2310 render_surface->SetScreenSpaceTransform(screen_space_transform); |
| 2317 | 2311 |
| 2318 if (layer->replica_layer()) { | 2312 if (layer->replica_layer()) { |
| 2319 gfx::Transform surface_origin_to_replica_origin_transform; | 2313 gfx::Transform surface_origin_to_replica_origin_transform; |
| 2320 surface_origin_to_replica_origin_transform.Scale( | 2314 surface_origin_to_replica_origin_transform.Scale( |
| 2321 render_surface_sublayer_scale.x(), render_surface_sublayer_scale.y()); | 2315 combined_transform_scales.x(), combined_transform_scales.y()); |
| 2322 surface_origin_to_replica_origin_transform.Translate( | 2316 surface_origin_to_replica_origin_transform.Translate( |
| 2323 layer->replica_layer()->position().x() + | 2317 layer->replica_layer()->position().x() + |
| 2324 layer->replica_layer()->transform_origin().x(), | 2318 layer->replica_layer()->transform_origin().x(), |
| 2325 layer->replica_layer()->position().y() + | 2319 layer->replica_layer()->position().y() + |
| 2326 layer->replica_layer()->transform_origin().y()); | 2320 layer->replica_layer()->transform_origin().y()); |
| 2327 surface_origin_to_replica_origin_transform.PreconcatTransform( | 2321 surface_origin_to_replica_origin_transform.PreconcatTransform( |
| 2328 layer->replica_layer()->transform()); | 2322 layer->replica_layer()->transform()); |
| 2329 surface_origin_to_replica_origin_transform.Translate( | 2323 surface_origin_to_replica_origin_transform.Translate( |
| 2330 -layer->replica_layer()->transform_origin().x(), | 2324 -layer->replica_layer()->transform_origin().x(), |
| 2331 -layer->replica_layer()->transform_origin().y()); | 2325 -layer->replica_layer()->transform_origin().y()); |
| 2332 surface_origin_to_replica_origin_transform.Scale( | 2326 surface_origin_to_replica_origin_transform.Scale( |
| 2333 1.0 / render_surface_sublayer_scale.x(), | 2327 1.0 / combined_transform_scales.x(), |
| 2334 1.0 / render_surface_sublayer_scale.y()); | 2328 1.0 / combined_transform_scales.y()); |
| 2335 | 2329 |
| 2336 // Compute the replica's "originTransform" that maps from the replica's | 2330 // Compute the replica's "originTransform" that maps from the replica's |
| 2337 // origin space to the target surface origin space. | 2331 // origin space to the target surface origin space. |
| 2338 gfx::Transform replica_origin_transform = | 2332 gfx::Transform replica_origin_transform = |
| 2339 layer->render_surface()->draw_transform() * | 2333 layer->render_surface()->draw_transform() * |
| 2340 surface_origin_to_replica_origin_transform; | 2334 surface_origin_to_replica_origin_transform; |
| 2341 render_surface->SetReplicaDrawTransform(replica_origin_transform); | 2335 render_surface->SetReplicaDrawTransform(replica_origin_transform); |
| 2342 | 2336 |
| 2343 // Compute the replica's "screen_space_transform" that maps from the | 2337 // Compute the replica's "screen_space_transform" that maps from the |
| 2344 // replica's origin space to the screen's origin space. | 2338 // replica's origin space to the screen's origin space. |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2570 inputs->current_render_surface_layer_list_id); | 2564 inputs->current_render_surface_layer_list_id); |
| 2571 | 2565 |
| 2572 // The dummy layer list should not have been used. | 2566 // The dummy layer list should not have been used. |
| 2573 DCHECK_EQ(0u, dummy_layer_list.size()); | 2567 DCHECK_EQ(0u, dummy_layer_list.size()); |
| 2574 // A root layer render_surface should always exist after | 2568 // A root layer render_surface should always exist after |
| 2575 // CalculateDrawProperties. | 2569 // CalculateDrawProperties. |
| 2576 DCHECK(inputs->root_layer->render_surface()); | 2570 DCHECK(inputs->root_layer->render_surface()); |
| 2577 } | 2571 } |
| 2578 | 2572 |
| 2579 } // namespace cc | 2573 } // namespace cc |
| OLD | NEW |