| Index: cc/trees/layer_tree_host_common.cc
|
| diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
|
| index 6123e25e07e41badb14d5e027f491a24b80e1d26..88609329c9256efe74287aef2310d1df7c77e64d 100644
|
| --- a/cc/trees/layer_tree_host_common.cc
|
| +++ b/cc/trees/layer_tree_host_common.cc
|
| @@ -406,8 +406,7 @@ gfx::Transform ComputeSizeDeltaCompensation(
|
|
|
| gfx::Transform target_surface_space_to_container_layer_space;
|
| // Calculate step 1a
|
| - LayerImpl* container_target_surface =
|
| - container ? container->render_target() : 0;
|
| + LayerImpl* container_target_surface = container->render_target();
|
| for (LayerImpl* current_target_surface = NextTargetSurface(layer);
|
| current_target_surface &&
|
| current_target_surface != container_target_surface;
|
| @@ -418,20 +417,18 @@ gfx::Transform ComputeSizeDeltaCompensation(
|
| current_target_surface->render_surface()->draw_transform());
|
| }
|
| // Calculate step 1b
|
| - if (container) {
|
| - gfx::Transform container_layer_space_to_container_target_surface_space =
|
| - container->draw_transform();
|
| - container_layer_space_to_container_target_surface_space.Scale(
|
| - container->contents_scale_x(), container->contents_scale_y());
|
| -
|
| - gfx::Transform container_target_surface_space_to_container_layer_space;
|
| - if (container_layer_space_to_container_target_surface_space.GetInverse(
|
| - &container_target_surface_space_to_container_layer_space)) {
|
| - // Note: Again, Concat is used to conver the result coordinate space from
|
| - // the container render surface to the container layer.
|
| - target_surface_space_to_container_layer_space.ConcatTransform(
|
| - container_target_surface_space_to_container_layer_space);
|
| - }
|
| + gfx::Transform container_layer_space_to_container_target_surface_space =
|
| + container->draw_transform();
|
| + container_layer_space_to_container_target_surface_space.Scale(
|
| + container->contents_scale_x(), container->contents_scale_y());
|
| +
|
| + gfx::Transform container_target_surface_space_to_container_layer_space;
|
| + if (container_layer_space_to_container_target_surface_space.GetInverse(
|
| + &container_target_surface_space_to_container_layer_space)) {
|
| + // Note: Again, Concat is used to conver the result coordinate space from
|
| + // the container render surface to the container layer.
|
| + target_surface_space_to_container_layer_space.ConcatTransform(
|
| + container_target_surface_space_to_container_layer_space);
|
| }
|
|
|
| // Apply step 3
|
| @@ -482,8 +479,7 @@ void ApplyPositionAdjustment(
|
| layer->position_constraint().is_fixed_to_right_edge();
|
| bool fixed_to_bottom_edge =
|
| layer->position_constraint().is_fixed_to_bottom_edge();
|
| - gfx::Vector2dF position_offset =
|
| - container ? container->fixed_container_size_delta() : gfx::Vector2dF();
|
| + gfx::Vector2dF position_offset = container->fixed_container_size_delta();
|
| position_offset.set_x(fixed_to_right_edge ? position_offset.x() : 0);
|
| position_offset.set_y(fixed_to_bottom_edge ? position_offset.y() : 0);
|
| if (position_offset.IsZero())
|
| @@ -1115,41 +1111,39 @@ static void CalculateDrawPropertiesInternal(
|
| RenderSurfaceType* render_surface = layer->render_surface();
|
| render_surface->ClearLayerLists();
|
|
|
| - // The owning layer's draw transform has a scale from content to layer
|
| - // space which we do not want; so here we use the combined_transform
|
| - // instead of the draw_transform. However, we do need to add a different
|
| - // scale factor that accounts for the surface's pixel dimensions.
|
| - combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(),
|
| - 1.0 / render_surface_sublayer_scale.y());
|
| - render_surface->SetDrawTransform(combined_transform);
|
| -
|
| - // If this is the root layer, there should be no scale in the surface's draw
|
| - // transform.
|
| if (IsRootLayer(layer)) {
|
| - DCHECK_EQ(render_surface_sublayer_scale.x(),
|
| - combined_transform_scales.x());
|
| - DCHECK_EQ(render_surface_sublayer_scale.y(),
|
| - combined_transform_scales.y());
|
| + // The root layer's render surface size is predetermined and so the root
|
| + // layer can't directly support non-identity transforms. It should just
|
| + // forward top-level transforms to the rest of the tree.
|
| + sublayer_matrix = combined_transform;
|
| + } else {
|
| + // The owning layer's draw transform has a scale from content to layer
|
| + // space which we do not want; so here we use the combined_transform
|
| + // instead of the draw_transform. However, we do need to add a different
|
| + // scale factor that accounts for the surface's pixel dimensions.
|
| + combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(),
|
| + 1.0 / render_surface_sublayer_scale.y());
|
| + render_surface->SetDrawTransform(combined_transform);
|
| +
|
| + // The owning layer's transform was re-parented by the surface, so the
|
| + // layer's new draw_transform only needs to scale the layer to surface
|
| + // space.
|
| + layer_draw_properties.target_space_transform.MakeIdentity();
|
| + layer_draw_properties.target_space_transform.
|
| + Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(),
|
| + render_surface_sublayer_scale.y() / layer->contents_scale_y());
|
| +
|
| + // Inside the surface's subtree, we scale everything to the owning layer's
|
| + // scale. The sublayer matrix transforms layer rects into target surface
|
| + // content space. Conceptually, all layers in the subtree inherit the
|
| + // scale at the point of the render surface in the transform hierarchy,
|
| + // but we apply it explicitly to the owning layer and the remainder of the
|
| + // subtree independently.
|
| + DCHECK(sublayer_matrix.IsIdentity());
|
| + sublayer_matrix.Scale(render_surface_sublayer_scale.x(),
|
| + render_surface_sublayer_scale.y());
|
| }
|
|
|
| - // The owning layer's transform was re-parented by the surface, so the
|
| - // layer's new draw_transform only needs to scale the layer to surface
|
| - // space.
|
| - layer_draw_properties.target_space_transform.MakeIdentity();
|
| - layer_draw_properties.target_space_transform.
|
| - Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(),
|
| - render_surface_sublayer_scale.y() / layer->contents_scale_y());
|
| -
|
| - // Inside the surface's subtree, we scale everything to the owning layer's
|
| - // scale. The sublayer matrix transforms layer rects into target surface
|
| - // content space. Conceptually, all layers in the subtree inherit the scale
|
| - // at the point of the render surface in the transform hierarchy, but we
|
| - // apply it explicitly to the owning layer and the remainder of the subtree
|
| - // indenpendently.
|
| - DCHECK(sublayer_matrix.IsIdentity());
|
| - sublayer_matrix.Scale(render_surface_sublayer_scale.x(),
|
| - render_surface_sublayer_scale.y());
|
| -
|
| // The opacity value is moved from the layer to its surface, so that the
|
| // entire subtree properly inherits opacity.
|
| render_surface->SetDrawOpacity(accumulated_draw_opacity);
|
| @@ -1337,6 +1331,7 @@ static void CalculateDrawPropertiesInternal(
|
| LayerType* child =
|
| LayerTreeHostCommon::get_child_as_raw_ptr(layer->children(), i);
|
| gfx::Rect drawable_content_rect_of_child_subtree;
|
| + gfx::Transform identity_matrix;
|
| CalculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>(
|
| child,
|
| sublayer_matrix,
|
| @@ -1526,6 +1521,7 @@ static void CalculateDrawPropertiesInternal(
|
| void LayerTreeHostCommon::CalculateDrawProperties(
|
| Layer* root_layer,
|
| gfx::Size device_viewport_size,
|
| + const gfx::Transform& device_transform,
|
| float device_scale_factor,
|
| float page_scale_factor,
|
| Layer* page_scale_application_layer,
|
| @@ -1535,8 +1531,8 @@ void LayerTreeHostCommon::CalculateDrawProperties(
|
| LayerList* render_surface_layer_list) {
|
| gfx::Rect total_drawable_content_rect;
|
| gfx::Transform identity_matrix;
|
| - gfx::Transform device_scale_transform;
|
| - device_scale_transform.Scale(device_scale_factor, device_scale_factor);
|
| + gfx::Transform scaled_device_transform = device_transform;
|
| + scaled_device_transform.Scale(device_scale_factor, device_scale_factor);
|
| LayerList dummy_layer_list;
|
|
|
| // The root layer's render_surface should receive the device viewport as the
|
| @@ -1551,10 +1547,10 @@ void LayerTreeHostCommon::CalculateDrawProperties(
|
| PreCalculateMetaInformation<Layer>(root_layer);
|
| CalculateDrawPropertiesInternal<Layer, LayerList, RenderSurface>(
|
| root_layer,
|
| - device_scale_transform,
|
| + scaled_device_transform,
|
| identity_matrix,
|
| identity_matrix,
|
| - NULL,
|
| + root_layer,
|
| device_viewport_rect,
|
| device_viewport_rect,
|
| subtree_should_be_clipped,
|
| @@ -1581,6 +1577,7 @@ void LayerTreeHostCommon::CalculateDrawProperties(
|
| void LayerTreeHostCommon::CalculateDrawProperties(
|
| LayerImpl* root_layer,
|
| gfx::Size device_viewport_size,
|
| + const gfx::Transform& device_transform,
|
| float device_scale_factor,
|
| float page_scale_factor,
|
| LayerImpl* page_scale_application_layer,
|
| @@ -1590,8 +1587,8 @@ void LayerTreeHostCommon::CalculateDrawProperties(
|
| LayerImplList* render_surface_layer_list) {
|
| gfx::Rect total_drawable_content_rect;
|
| gfx::Transform identity_matrix;
|
| - gfx::Transform device_scale_transform;
|
| - device_scale_transform.Scale(device_scale_factor, device_scale_factor);
|
| + gfx::Transform scaled_device_transform = device_transform;
|
| + scaled_device_transform.Scale(device_scale_factor, device_scale_factor);
|
| LayerImplList dummy_layer_list;
|
| LayerSorter layer_sorter;
|
|
|
| @@ -1609,10 +1606,10 @@ void LayerTreeHostCommon::CalculateDrawProperties(
|
| LayerImplList,
|
| RenderSurfaceImpl>(
|
| root_layer,
|
| - device_scale_transform,
|
| + scaled_device_transform,
|
| identity_matrix,
|
| identity_matrix,
|
| - NULL,
|
| + root_layer,
|
| device_viewport_rect,
|
| device_viewport_rect,
|
| subtree_should_be_clipped,
|
|
|