layer_tree_host_common.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_common.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/math_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/heads_up_display_layer_impl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_iterator.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/render_surface.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/render_surface_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_sorter.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollAndScaleSet::ScrollAndScaleSet() {}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollAndScaleSet::~ScrollAndScaleSet() {}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SortLayers(LayerList::iterator forst,
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       LayerList::iterator end,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       void* layer_sorter) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void SortLayers(LayerImplList::iterator first,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       LayerImplList::iterator end,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       LayerSorter* layer_sorter) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer_sorter);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TRACE_EVENT0("cc", "LayerTreeHostCommon::SortLayers");
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_sorter->Sort(first, end);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)inline gfx::Rect CalculateVisibleRectWithCachedLayerRect(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect target_surface_rect,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect layer_bound_rect,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect layer_rect_in_target_space,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& transform) {
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (layer_rect_in_target_space.IsEmpty())
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return gfx::Rect();
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is this layer fully contained within the target surface?
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (target_surface_rect.Contains(layer_rect_in_target_space))
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer_bound_rect;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer doesn't fill up the entire surface, then find the part of
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the surface rect where the layer could be visible. This avoids trying to
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // project surface rect points that are behind the projection point.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect minimal_surface_rect = target_surface_rect;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimal_surface_rect.Intersect(layer_rect_in_target_space);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Project the corners of the target surface rect into the layer space.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This bounding rectangle may be larger than it needs to be (being
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // axis-aligned), but is a reasonable filter on the space to consider.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Non-invertible transforms will create an empty rect here.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform surface_to_layer(gfx::Transform::kSkipInitialization);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!transform.GetInverse(&surface_to_layer)) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // TODO(shawnsingh): Some uninvertible transforms may be visible, but
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // their behaviour is undefined thoughout the compositor. Make their
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // behaviour well-defined and allow the visible content rect to be non-
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // empty when needed.
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Rect();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect layer_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_to_layer, gfx::RectF(minimal_surface_rect)));
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_rect.Intersect(layer_bound_rect);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_rect;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect LayerTreeHostCommon::CalculateVisibleRect(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect target_surface_rect,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect layer_bound_rect,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& transform) {
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect layer_in_surface_space =
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MathUtil::MapClippedRect(transform, layer_bound_rect);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CalculateVisibleRectWithCachedLayerRect(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      target_surface_rect, layer_bound_rect, layer_in_surface_space, transform);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType> static inline bool IsRootLayer(LayerType* layer) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !layer->parent();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool LayerIsInExisting3DRenderingContext(LayerType* layer) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // According to current W3C spec on CSS transforms, a layer is part of an
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // established 3d rendering context if its parent has transform-style of
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // preserves-3d.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer->parent() && layer->parent()->preserves_3d();
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsRootLayerOfNewRenderingContext(LayerType* layer) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // According to current W3C spec on CSS transforms (Section 6.1), a layer is
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the beginning of 3d rendering context if its parent does not have
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform-style: preserve-3d, but this layer itself does.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->parent())
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return !layer->parent()->preserves_3d() && layer->preserves_3d();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer->preserves_3d();
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsLayerBackFaceVisible(LayerType* layer) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The current W3C spec on CSS transforms says that backface visibility should
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be determined differently depending on whether the layer is in a "3d
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // rendering context" or not. For Chromium code, we can determine whether we
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are in a 3d rendering context by checking if the parent preserves 3d.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (LayerIsInExisting3DRenderingContext(layer))
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer->draw_transform().IsBackFaceVisible();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In this case, either the layer establishes a new 3d rendering context, or
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is not in a 3d rendering context at all.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer->transform().IsBackFaceVisible();
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool IsSurfaceBackFaceVisible(LayerType* layer,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Transform& draw_transform) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (LayerIsInExisting3DRenderingContext(layer))
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return draw_transform.IsBackFaceVisible();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsRootLayerOfNewRenderingContext(layer))
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return layer->transform().IsBackFaceVisible();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the render_surface is not part of a new or existing rendering context,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then the layers that contribute to this surface will decide back-face
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // visibility for themselves.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool LayerClipsSubtree(LayerType* layer) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer->masks_to_bounds() || layer->mask_layer();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static gfx::Rect CalculateVisibleContentRect(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerType* layer,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect ancestor_clip_rect_in_descendant_surface_space,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect layer_rect_in_target_space) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer->render_target());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Nothing is visible if the layer bounds are empty.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->DrawsContent() || layer->content_bounds().IsEmpty() ||
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->drawable_content_rect().IsEmpty())
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Rect();
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute visible bounds in target surface space.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect visible_rect_in_target_surface_space =
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->drawable_content_rect();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->render_target()->render_surface()->clip_rect().IsEmpty()) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // In this case the target surface does clip layers that contribute to
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // it. So, we have to convert the current surface's clip rect from its
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ancestor surface space to the current (descendant) surface
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // space. This conversion is done outside this function so that it can
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // be cached instead of computing it redundantly for every layer.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    visible_rect_in_target_surface_space.Intersect(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ancestor_clip_rect_in_descendant_surface_space);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (visible_rect_in_target_surface_space.IsEmpty())
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Rect();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CalculateVisibleRectWithCachedLayerRect(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      visible_rect_in_target_surface_space,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(layer->content_bounds()),
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_rect_in_target_space,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->draw_transform());
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool TransformToParentIsKnown(LayerImpl* layer) { return true; }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool TransformToParentIsKnown(Layer* layer) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !layer->TransformIsAnimating();
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool TransformToScreenIsKnown(LayerImpl* layer) { return true; }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline bool TransformToScreenIsKnown(Layer* layer) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !layer->screen_space_transform_is_animating();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic bool LayerShouldBeSkipped(LayerType* layer,
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                 bool layer_is_visible) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Layers can be skipped if any of these conditions are met.
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  //   - is not visible due to it or one of its ancestors being hidden.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - does not draw content.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - is transparent
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - has empty bounds
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - the layer is not double-sided, but its back face is visible.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Some additional conditions need to be computed at a later point after the
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // recursion is finished.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - the intersection of render_surface content and layer clip_rect is empty
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //   - the visible_content_rect is empty
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note, if the layer should not have been drawn due to being fully
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transparent, we would have skipped the entire subtree and never made it
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // into this function, so it is safe to omit this check here.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!layer_is_visible)
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return true;
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->DrawsContent() || layer->bounds().IsEmpty())
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerType* backface_test_layer = layer;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->use_parent_backface_visibility()) {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(layer->parent());
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!layer->parent()->use_parent_backface_visibility());
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    backface_test_layer = layer->parent();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The layer should not be drawn if (1) it is not double-sided and (2) the
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // back of the layer is known to be facing the screen.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!backface_test_layer->double_sided() &&
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TransformToScreenIsKnown(backface_test_layer) &&
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      IsLayerBackFaceVisible(backface_test_layer))
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline bool SubtreeShouldBeSkipped(LayerImpl* layer,
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          bool layer_is_visible) {
2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // When we need to do a readback/copy of a layer's output, we can not skip
2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // it or any of its ancestors.
2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (layer->draw_properties().layer_or_descendant_has_copy_request)
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If the layer is not visible, then skip it and its subtree.
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!layer_is_visible)
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If layer is on the pending tree and opacity is being animated then
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this subtree can't be skipped as we need to create, prioritize and
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // include tiles for this layer when deciding if tree can be activated.
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer->layer_tree_impl()->IsPendingTree() && layer->OpacityIsAnimating())
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return false;
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The opacity of a layer always applies to its children (either implicitly
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // via a render surface or explicitly if the parent preserves 3D), so the
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // entire subtree can be skipped if this layer is fully transparent.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !layer->opacity();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic inline bool SubtreeShouldBeSkipped(Layer* layer,
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                          bool layer_is_visible) {
2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // When we need to do a readback/copy of a layer's output, we can not skip
2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // it or any of its ancestors.
2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (layer->draw_properties().layer_or_descendant_has_copy_request)
2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If the layer is not visible, then skip it and its subtree.
2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!layer_is_visible)
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return true;
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the opacity is being animated then the opacity on the main thread is
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // unreliable (since the impl thread may be using a different opacity), so it
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not be trusted.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In particular, it should not cause the subtree to be skipped.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Similarly, for layers that might animate opacity using an impl-only
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation, their subtree should also not be skipped.
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return !layer->opacity() && !layer->OpacityIsAnimating() &&
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         !layer->OpacityCanAnimateOnImplThread();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Called on each layer that could be drawn after all information from
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CalcDrawProperties has been updated on that layer.  May have some false
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// positives (e.g. layers get this called on them but don't actually get drawn).
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void UpdateTilePrioritiesForLayer(LayerImpl* layer) {
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->UpdateTilePriorities();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Mask layers don't get this call, so explicitly update them so they can
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // kick off tile rasterization.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->mask_layer())
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->mask_layer()->UpdateTilePriorities();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->replica_layer() && layer->replica_layer()->mask_layer())
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->replica_layer()->mask_layer()->UpdateTilePriorities();
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void UpdateTilePrioritiesForLayer(Layer* layer) {}
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static inline void SavePaintPropertiesLayer(LayerImpl* layer) {}
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static inline void SavePaintPropertiesLayer(Layer* layer) {
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SavePaintProperties();
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer->mask_layer())
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->mask_layer()->SavePaintProperties();
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (layer->replica_layer() && layer->replica_layer()->mask_layer())
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->replica_layer()->mask_layer()->SavePaintProperties();
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool SubtreeShouldRenderToSeparateSurface(
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerType* layer,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool axis_aligned_with_respect_to_parent) {
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A layer and its descendants should render onto a new RenderSurfaceImpl if
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // any of these rules hold:
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The root layer owns a render surface, but it never acts as a contributing
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // surface to another render target. Compositor features that are applied via
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // a contributing surface can not be applied to the root layer. In order to
322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // use these effects, another child of the root would need to be introduced
323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // in order to act as a contributing surface to the root layer's surface.
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  bool is_root = IsRootLayer(layer);
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer uses a mask.
327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (layer->mask_layer()) {
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer has a reflection.
333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (layer->replica_layer()) {
334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer uses a CSS filter.
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!layer->filters().IsEmpty() || !layer->background_filters().IsEmpty() ||
340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      layer->filter()) {
341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_descendants_that_draw_content =
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->draw_properties().num_descendants_that_draw_content;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer flattens its subtree (i.e. the layer doesn't preserve-3d), but
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it is treated as a 3D object by its parent (i.e. parent does preserve-3d).
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (LayerIsInExisting3DRenderingContext(layer) && !layer->preserves_3d() &&
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_descendants_that_draw_content > 0) {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "cc",
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "LayerTreeHostCommon::SubtreeShouldRenderToSeparateSurface flattening",
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
356b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer clips its descendants but it is not axis-aligned with respect
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to its parent.
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool layer_clips_external_content =
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerClipsSubtree(layer) || layer->HasDelegatedContent();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_clips_external_content && !axis_aligned_with_respect_to_parent &&
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !layer->draw_properties().descendants_can_clip_selves) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "cc",
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "LayerTreeHostCommon::SubtreeShouldRenderToSeparateSurface clipping",
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
370b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer has some translucency and does not have a preserves-3d
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform style.  This condition only needs a render surface if two or more
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layers in the subtree overlap. But checking layer overlaps is unnecessarily
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // costly so instead we conservatively create a surface whenever at least two
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layers draw content for this subtree.
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool at_least_two_layers_in_subtree_draw_content =
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_descendants_that_draw_content > 0 &&
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (layer->DrawsContent() || num_descendants_that_draw_content > 1);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->opacity() != 1.f && !layer->preserves_3d() &&
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      at_least_two_layers_in_subtree_draw_content) {
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_EVENT_INSTANT0(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "cc",
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "LayerTreeHostCommon::SubtreeShouldRenderToSeparateSurface opacity",
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        TRACE_EVENT_SCOPE_THREAD);
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    DCHECK(!is_root);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The root layer should always have a render_surface.
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (is_root)
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return true;
396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  //
398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // These are allowed on the root surface, as they don't require the surface to
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // be used as a contributing surface in order to apply correctly.
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  //
401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If we force it.
403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (layer->force_render_surface())
404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return true;
405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If we'll make a copy of the layer's contents.
40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (layer->HasCopyRequest())
408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return true;
409b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static LayerImpl* NextTargetSurface(LayerImpl* layer) {
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return layer->parent() ? layer->parent()->render_target() : 0;
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This function returns a translation matrix that can be applied on a vector
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// that's in the layer's target surface coordinate, while the position offset is
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// specified in some ancestor layer's coordinate.
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Transform ComputeSizeDeltaCompensation(
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* layer,
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* container,
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Vector2dF position_offset) {
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform result_transform;
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // To apply a translate in the container's layer space,
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the following steps need to be done:
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //     Step 1a. transform from target surface space to the container's target
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //              surface space
430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //     Step 1b. transform from container's target surface space to the
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //              container's layer space
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //     Step 2. apply the compensation
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //     Step 3. transform back to target surface space
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform target_surface_space_to_container_layer_space;
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calculate step 1a
437868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LayerImpl* container_target_surface = container->render_target();
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (LayerImpl* current_target_surface = NextTargetSurface(layer);
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_target_surface &&
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          current_target_surface != container_target_surface;
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_target_surface = NextTargetSurface(current_target_surface)) {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Note: Concat is used here to convert the result coordinate space from
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    //       current render surface to the next render surface.
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    target_surface_space_to_container_layer_space.ConcatTransform(
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        current_target_surface->render_surface()->draw_transform());
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Calculate step 1b
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Transform container_layer_space_to_container_target_surface_space =
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      container->draw_transform();
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  container_layer_space_to_container_target_surface_space.Scale(
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      container->contents_scale_x(), container->contents_scale_y());
452868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Transform container_target_surface_space_to_container_layer_space;
454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (container_layer_space_to_container_target_surface_space.GetInverse(
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &container_target_surface_space_to_container_layer_space)) {
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Note: Again, Concat is used to conver the result coordinate space from
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    //       the container render surface to the container layer.
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    target_surface_space_to_container_layer_space.ConcatTransform(
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        container_target_surface_space_to_container_layer_space);
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Apply step 3
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform container_layer_space_to_target_surface_space;
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (target_surface_space_to_container_layer_space.GetInverse(
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          &container_layer_space_to_target_surface_space)) {
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result_transform.PreconcatTransform(
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        container_layer_space_to_target_surface_space);
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // TODO(shawnsingh): A non-invertible matrix could still make meaningful
470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // projection.  For example ScaleZ(0) is non-invertible but the layer is
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // still visible.
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Transform();
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Apply step 2
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  result_transform.Translate(position_offset.x(), position_offset.y());
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Apply step 1
479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  result_transform.PreconcatTransform(
480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      target_surface_space_to_container_layer_space);
481c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return result_transform;
483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ApplyPositionAdjustment(
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* layer,
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* container,
488c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& scroll_compensation,
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform* combined_transform) {}
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ApplyPositionAdjustment(
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* layer,
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* container,
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& scroll_compensation,
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Transform* combined_transform) {
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->position_constraint().is_fixed_position())
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Special case: this layer is a composited fixed-position layer; we need to
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // explicitly compensate for all ancestors' nonzero scroll_deltas to keep
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this layer fixed correctly.
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note carefully: this is Concat, not Preconcat
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // (current_scroll_compensation * combined_transform).
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  combined_transform->ConcatTransform(scroll_compensation);
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For right-edge or bottom-edge anchored fixed position layers,
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the layer should relocate itself if the container changes its size.
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool fixed_to_right_edge =
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->position_constraint().is_fixed_to_right_edge();
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool fixed_to_bottom_edge =
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->position_constraint().is_fixed_to_bottom_edge();
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Vector2dF position_offset = container->fixed_container_size_delta();
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  position_offset.set_x(fixed_to_right_edge ? position_offset.x() : 0);
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  position_offset.set_y(fixed_to_bottom_edge ? position_offset.y() : 0);
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (position_offset.IsZero())
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note: Again, this is Concat. The compensation matrix will be applied on
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //       the vector in target surface space.
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  combined_transform->ConcatTransform(
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ComputeSizeDeltaCompensation(layer, container, position_offset));
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Transform ComputeScrollCompensationForThisLayer(
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* scrolling_layer,
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& parent_matrix) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For every layer that has non-zero scroll_delta, we have to compute a
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform that can undo the scroll_delta translation. In particular, we
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // want this matrix to premultiply a fixed-position layer's parent_matrix, so
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we design this transform in three steps as follows. The steps described
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // here apply from right-to-left, so Step 1 would be the right-most matrix:
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //     Step 1. transform from target surface space to the exact space where
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //           scroll_delta is actually applied.
5349ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  //           -- this is inverse of parent_matrix
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //     Step 2. undo the scroll_delta
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //           -- this is just a translation by scroll_delta.
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //     Step 3. transform back to target surface space.
5389ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  //           -- this transform is the parent_matrix
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These steps create a matrix that both start and end in target surface
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // space. So this matrix can pre-multiply any fixed-position layer's
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // draw_transform to undo the scroll_deltas -- as long as that fixed position
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layer is fixed onto the same render_target as this scrolling_layer.
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5469ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  gfx::Transform scroll_compensation_for_this_layer = parent_matrix;  // Step 3
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_compensation_for_this_layer.Translate(
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scrolling_layer->ScrollDelta().x(),
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scrolling_layer->ScrollDelta().y());  // Step 2
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5519ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  gfx::Transform inverse_parent_matrix(gfx::Transform::kSkipInitialization);
5529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (!parent_matrix.GetInverse(&inverse_parent_matrix)) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(shawnsingh): Either we need to handle uninvertible transforms
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // here, or DCHECK that the transform is invertible.
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_compensation_for_this_layer.PreconcatTransform(
5579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      inverse_parent_matrix);  // Step 1
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return scroll_compensation_for_this_layer;
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Transform ComputeScrollCompensationMatrixForChildren(
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* current_layer,
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& current_parent_matrix,
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& current_scroll_compensation) {
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The main thread (i.e. Layer) does not need to worry about scroll
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // compensation.  So we can just return an identity matrix here.
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Transform();
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Transform ComputeScrollCompensationMatrixForChildren(
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* layer,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& parent_matrix,
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& current_scroll_compensation_matrix) {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "Total scroll compensation" is the transform needed to cancel out all
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // scroll_delta translations that occurred since the nearest container layer,
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // even if there are render_surfaces in-between.
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There are some edge cases to be aware of, that are not explicit in the
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // code:
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  - A layer that is both a fixed-position and container should not be its
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  own container, instead, that means it is fixed to an ancestor, and is a
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  container for any fixed-position descendants.
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  - A layer that is a fixed-position container and has a render_surface
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  should behave the same as a container without a render_surface, the
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  render_surface is irrelevant in that case.
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  - A layer that does not have an explicit container is simply fixed to the
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  viewport.  (i.e. the root render_surface.)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  - If the fixed-position layer has its own render_surface, then the
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  render_surface is the one who gets fixed.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function needs to be called AFTER layers create their own
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // render_surfaces.
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Avoid the overheads (including stack allocation and matrix
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initialization/copy) if we know that the scroll compensation doesn't need
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to be reset or adjusted.
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->IsContainerForFixedPositionLayers() &&
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->ScrollDelta().IsZero() && !layer->render_surface())
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return current_scroll_compensation_matrix;
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start as identity matrix.
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform next_scroll_compensation_matrix;
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If this layer is not a container, then it inherits the existing scroll
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // compensations.
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->IsContainerForFixedPositionLayers())
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_scroll_compensation_matrix = current_scroll_compensation_matrix;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the current layer has a non-zero scroll_delta, then we should compute
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // its local scroll compensation and accumulate it to the
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // next_scroll_compensation_matrix.
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->ScrollDelta().IsZero()) {
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Transform scroll_compensation_for_this_layer =
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ComputeScrollCompensationForThisLayer(
6169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch            layer, parent_matrix);
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_scroll_compensation_matrix.PreconcatTransform(
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scroll_compensation_for_this_layer);
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the layer created its own render_surface, we have to adjust
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // next_scroll_compensation_matrix.  The adjustment allows us to continue
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // using the scroll compensation on the next surface.
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  Step 1 (right-most in the math): transform from the new surface to the
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  original ancestor surface
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  Step 2: apply the scroll compensation
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //  Step 3: transform back to the new surface.
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->render_surface() &&
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !next_scroll_compensation_matrix.IsIdentity()) {
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Transform inverse_surface_draw_transform(
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Transform::kSkipInitialization);
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer->render_surface()->draw_transform().GetInverse(
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &inverse_surface_draw_transform)) {
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // TODO(shawnsingh): Either we need to handle uninvertible transforms
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // here, or DCHECK that the transform is invertible.
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_scroll_compensation_matrix =
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        inverse_surface_draw_transform * next_scroll_compensation_matrix *
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->render_surface()->draw_transform();
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return next_scroll_compensation_matrix;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void CalculateContentsScale(LayerType* layer,
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          float contents_scale,
648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                          float device_scale_factor,
649b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                          float page_scale_factor,
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          bool animating_transform_to_screen) {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->CalculateContentsScale(contents_scale,
652b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                device_scale_factor,
653b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                page_scale_factor,
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                animating_transform_to_screen,
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                &layer->draw_properties().contents_scale_x,
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                &layer->draw_properties().contents_scale_y,
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                &layer->draw_properties().content_bounds);
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerType* mask_layer = layer->mask_layer();
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer) {
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer->CalculateContentsScale(
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contents_scale,
663b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        device_scale_factor,
664b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        page_scale_factor,
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_screen,
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &mask_layer->draw_properties().contents_scale_x,
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &mask_layer->draw_properties().contents_scale_y,
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &mask_layer->draw_properties().content_bounds);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerType* replica_mask_layer =
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->replica_layer() ? layer->replica_layer()->mask_layer() : NULL;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_mask_layer) {
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_mask_layer->CalculateContentsScale(
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        contents_scale,
676b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        device_scale_factor,
677b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        page_scale_factor,
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_screen,
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &replica_mask_layer->draw_properties().contents_scale_x,
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &replica_mask_layer->draw_properties().contents_scale_y,
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &replica_mask_layer->draw_properties().content_bounds);
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void UpdateLayerContentsScale(
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* layer,
687b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool can_adjust_raster_scale,
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float ideal_contents_scale,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool animating_transform_to_screen) {
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CalculateContentsScale(layer,
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         ideal_contents_scale,
694b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         device_scale_factor,
695b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         page_scale_factor,
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         animating_transform_to_screen);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void UpdateLayerContentsScale(
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* layer,
701b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool can_adjust_raster_scale,
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float ideal_contents_scale,
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool animating_transform_to_screen) {
706b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (can_adjust_raster_scale) {
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float ideal_raster_scale =
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ideal_contents_scale / (device_scale_factor * page_scale_factor);
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
710b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool need_to_set_raster_scale = layer->raster_scale_is_unknown();
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If we've previously saved a raster_scale but the ideal changes, things
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // are unpredictable and we should just use 1.
714b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (!need_to_set_raster_scale && layer->raster_scale() != 1.f &&
715b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        ideal_raster_scale != layer->raster_scale()) {
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ideal_raster_scale = 1.f;
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      need_to_set_raster_scale = true;
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (need_to_set_raster_scale) {
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool use_and_save_ideal_scale =
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ideal_raster_scale >= 1.f && !animating_transform_to_screen;
723b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      if (use_and_save_ideal_scale)
724b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        layer->set_raster_scale(ideal_raster_scale);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
728b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  float raster_scale = 1.f;
729b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!layer->raster_scale_is_unknown())
730b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    raster_scale = layer->raster_scale();
731b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float contents_scale = raster_scale * device_scale_factor * page_scale_factor;
734b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  CalculateContentsScale(layer,
735b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         contents_scale,
736b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         device_scale_factor,
737b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         page_scale_factor,
738b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                         animating_transform_to_screen);
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
741ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic inline RenderSurface* CreateOrReuseRenderSurface(Layer* layer) {
742ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // The render surface should always be new on the main thread, as the
743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // RenderSurfaceLayerList should be a new empty list when given to
744ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // CalculateDrawProperties.
745ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DCHECK(!layer->render_surface());
746ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  layer->CreateRenderSurface();
747ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return layer->render_surface();
748ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
750ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstatic inline RenderSurfaceImpl* CreateOrReuseRenderSurface(LayerImpl* layer) {
751ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!layer->render_surface()) {
752ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    layer->CreateRenderSurface();
753ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return layer->render_surface();
754ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
755ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
756ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  layer->render_surface()->ClearLayerLists();
757ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return layer->render_surface();
758ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
759ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType, typename LayerList>
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static inline void RemoveSurfaceForEarlyExit(
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerType* layer_to_remove,
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerList* render_surface_layer_list) {
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(layer_to_remove->render_surface());
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Technically, we know that the layer we want to remove should be
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // at the back of the render_surface_layer_list. However, we have had
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bugs before that added unnecessary layers here
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (https://bugs.webkit.org/show_bug.cgi?id=74147), but that causes
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // things to crash. So here we proactively remove any additional
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layers from the end of the list.
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (render_surface_layer_list->back() != layer_to_remove) {
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer_list->back()->ClearRenderSurface();
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer_list->pop_back();
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(render_surface_layer_list->back(), layer_to_remove);
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  render_surface_layer_list->pop_back();
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_to_remove->ClearRenderSurface();
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct PreCalculateMetaInformationRecursiveData {
7817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool layer_or_descendant_has_copy_request;
7827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PreCalculateMetaInformationRecursiveData()
7847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : layer_or_descendant_has_copy_request(false) {}
7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void Merge(const PreCalculateMetaInformationRecursiveData& data) {
7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_or_descendant_has_copy_request |=
7887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        data.layer_or_descendant_has_copy_request;
7897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
7907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
7917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Recursively walks the layer tree to compute any information that is needed
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// before doing the main recursion.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <typename LayerType>
7957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic void PreCalculateMetaInformation(
7967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    LayerType* layer,
7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PreCalculateMetaInformationRecursiveData* recursive_data) {
7987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool has_delegated_content = layer->HasDelegatedContent();
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_descendants_that_draw_content = 0;
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool descendants_can_clip_selves = true;
8017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (has_delegated_content) {
8037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Layers with delegated content need to be treated as if they have as
8047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // many children as the number of layers they own delegated quads for.
8057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Since we don't know this number right now, we choose one that acts like
8067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // infinity for our purposes.
8077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    num_descendants_that_draw_content = 1000;
8087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    descendants_can_clip_selves = false;
8097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer->children().size(); ++i) {
812868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LayerType* child_layer =
813868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        LayerTreeHostCommon::get_child_as_raw_ptr(layer->children(), i);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PreCalculateMetaInformationRecursiveData data_for_child;
8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    PreCalculateMetaInformation(child_layer, &data_for_child);
8177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (!has_delegated_content) {
8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      bool sublayer_transform_prevents_clip =
8207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !layer->sublayer_transform().IsPositiveScaleOrTranslation();
8217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      num_descendants_that_draw_content += child_layer->DrawsContent() ? 1 : 0;
8237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      num_descendants_that_draw_content +=
8247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          child_layer->draw_properties().num_descendants_that_draw_content;
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if ((child_layer->DrawsContent() && !child_layer->CanClipSelf()) ||
8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !child_layer->draw_properties().descendants_can_clip_selves ||
8287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          sublayer_transform_prevents_clip ||
8297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !child_layer->transform().IsPositiveScaleOrTranslation())
8307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        descendants_can_clip_selves = false;
8317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
8327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    recursive_data->Merge(data_for_child);
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (layer->HasCopyRequest())
8377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    recursive_data->layer_or_descendant_has_copy_request = true;
8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().num_descendants_that_draw_content =
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      num_descendants_that_draw_content;
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->draw_properties().descendants_can_clip_selves =
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      descendants_can_clip_selves;
8437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  layer->draw_properties().layer_or_descendant_has_copy_request =
8447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      recursive_data->layer_or_descendant_has_copy_request;
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void RoundTranslationComponents(gfx::Transform* transform) {
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform->matrix().
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setDouble(0, 3, MathUtil::Round(transform->matrix().getDouble(0, 3)));
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform->matrix().
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      setDouble(1, 3, MathUtil::Round(transform->matrix().getDouble(1, 3)));
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Recursively walks the layer tree starting at the given node and computes all
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the necessary transformations, clip rects, render surfaces, etc.
856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtemplate <typename LayerType,
857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          typename LayerListType,
858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          typename RenderSurfaceType>
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void CalculateDrawPropertiesInternal(
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerType* layer,
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& parent_matrix,
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& full_hierarchy_matrix,
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& current_scroll_compensation_matrix,
864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerType* current_fixed_container,
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect clip_rect_from_ancestor,
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect clip_rect_from_ancestor_in_descendant_space,
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool ancestor_clips_subtree,
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderSurfaceType* nearest_ancestor_that_moves_pixels,
869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LayerListType* render_surface_layer_list,
870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LayerListType* layer_list,
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerSorter* layer_sorter,
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int max_texture_size,
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor,
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerType* page_scale_application_layer,
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool in_subtree_of_page_scale_application_layer,
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool subtree_can_use_lcd_text,
878b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool subtree_can_adjust_raster_scales,
8797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool subtree_is_visible_from_ancestor,
880c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Rect* drawable_content_rect_of_subtree) {
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function computes the new matrix transformations recursively for this
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layer and all its descendants. It also computes the appropriate render
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // surfaces.
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Some important points to remember:
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 0. Here, transforms are notated in Matrix x Vector order, and in words we
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // describe what the transform does from left to right.
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 1. In our terminology, the "layer origin" refers to the top-left corner of
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a layer, and the positive Y-axis points downwards. This interpretation is
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // valid because the orthographic projection applied at draw time flips the Y
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // axis appropriately.
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 2. The anchor point, when given as a PointF object, is specified in "unit
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layer space", where the bounds of the layer map to [0, 1]. However, as a
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transform object, the transform to the anchor point is specified in "layer
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // space", where the bounds of the layer map to [bounds.width(),
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bounds.height()].
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 3. Definition of various transforms used:
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[parent] is the parent matrix, with respect to the nearest render
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        surface, passed down recursively.
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[root] is the full hierarchy, with respect to the root, passed down
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        recursively.
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Tr[origin] is the translation matrix from the parent's origin to
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        this layer's origin.
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Tr[origin2anchor] is the translation from the layer's origin to its
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        anchor point
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Tr[origin2center] is the translation from the layer's origin to its
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        center
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[layer] is the layer's matrix (applied at the anchor point)
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[sublayer] is the layer's sublayer transform (also applied at the
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        layer's anchor point)
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        S[layer2content] is the ratio of a layer's content_bounds() to its
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Bounds().
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //    Some composite transforms can help in understanding the sequence of
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //    transforms:
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        composite_layer_transform = Tr[origin2anchor] * M[layer] *
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Tr[origin2anchor].inverse()
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        composite_sublayer_transform = Tr[origin2anchor] * M[sublayer] *
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Tr[origin2anchor].inverse()
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // 4. When a layer (or render surface) is drawn, it is drawn into a "target
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // render surface". Therefore the draw transform does not necessarily
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform from screen space to local layer space. Instead, the draw
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform is the transform between the "target render surface space" and
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // local layer space. Note that render surfaces, except for the root, also
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // draw themselves into a different target render surface, and so their draw
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // transform and origin transforms are also described with respect to the
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // target.
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Using these definitions, then:
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The draw transform for the layer is:
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[draw] = M[parent] * Tr[origin] * composite_layer_transform *
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            S[layer2content] = M[parent] * Tr[layer->position() + anchor] *
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            M[layer] * Tr[anchor2origin] * S[layer2content]
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Interpreting the math left-to-right, this transforms from the
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        layer's render surface to the origin of the layer in content space.
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The screen space transform is:
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[screenspace] = M[root] * Tr[origin] * composite_layer_transform *
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            S[layer2content]
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                       = M[root] * Tr[layer->position() + anchor] * M[layer]
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                           * Tr[anchor2origin] * S[layer2content]
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        Interpreting the math left-to-right, this transforms from the root
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        render surface's content space to the origin of the layer in content
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        space.
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The transform hierarchy that is passed on to children (i.e. the child's
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // parent_matrix) is:
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[parent]_for_child = M[parent] * Tr[origin] *
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            composite_layer_transform * composite_sublayer_transform
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                            = M[parent] * Tr[layer->position() + anchor] *
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                              M[layer] * Tr[anchor2origin] *
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                              composite_sublayer_transform
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        and a similar matrix for the full hierarchy with respect to the
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        root.
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Finally, note that the final matrix used by the shader for the layer is P *
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // M[draw] * S . This final product is computed in drawTexturedQuad(), where:
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        P is the projection matrix
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        S is the scale adjustment (to scale up a canonical quad to the
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            layer's size)
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When a render surface has a replica layer, that layer's transform is used
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to draw a second copy of the surface.  gfx::Transforms named here are
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // relative to the surface, unless they specify they are relative to the
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // replica layer.
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We will denote a scale by device scale S[deviceScale]
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The render surface draw transform to its target surface origin is:
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[surfaceDraw] = M[owningLayer->Draw]
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The render surface origin transform to its the root (screen space) origin
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is:
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[surface2root] =  M[owningLayer->screenspace] *
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            S[deviceScale].inverse()
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The replica draw transform to its target surface origin is:
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[replicaDraw] = S[deviceScale] * M[surfaceDraw] *
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            Tr[replica->position() + replica->anchor()] * Tr[replica] *
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            Tr[origin2anchor].inverse() * S[contents_scale].inverse()
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The replica draw transform to the root (screen space) origin is:
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //        M[replica2root] = M[surface2root] * Tr[replica->position()] *
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //            Tr[replica] * Tr[origin2anchor].inverse()
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // It makes no sense to have a non-unit page_scale_factor without specifying
1004c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // which layer roots the subtree the scale is applied to.
1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(page_scale_application_layer || (page_scale_factor == 1.f));
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1007c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If we early-exit anywhere in this function, the drawable_content_rect of
1008c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // this subtree should be considered empty.
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *drawable_content_rect_of_subtree = gfx::Rect();
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Layers with a copy request are always visible, as well as un-hiding their
10127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // subtree. Otherise, layers that are marked as hidden will hide themselves
10137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // and their subtree.
10147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool layer_is_visible =
10157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      subtree_is_visible_from_ancestor && !layer->hide_layer_and_subtree();
10167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (layer->HasCopyRequest())
10177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_is_visible = true;
10187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The root layer cannot skip CalcDrawProperties.
10207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_visible))
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As this function proceeds, these are the properties for the current
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layer that actually get computed. To avoid unnecessary copies
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (particularly for matrices), we do computations directly on these values
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when possible.
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DrawProperties<LayerType, RenderSurfaceType>& layer_draw_properties =
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->draw_properties();
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect clip_rect_for_subtree;
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool subtree_should_be_clipped = false;
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This value is cached on the stack so that we don't have to inverse-project
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the surface's clip rect redundantly for every layer. This value is the
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // same as the surface's clip rect, except that instead of being described
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in the target surface space (i.e. the ancestor surface space), it is
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // described in the current surface space.
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect clip_rect_for_subtree_in_descendant_space;
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float accumulated_draw_opacity = layer->opacity();
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool animating_opacity_to_target = layer->OpacityIsAnimating();
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool animating_opacity_to_screen = animating_opacity_to_target;
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->parent()) {
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    accumulated_draw_opacity *= layer->parent()->draw_opacity();
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_opacity_to_target |= layer->parent()->draw_opacity_is_animating();
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_opacity_to_screen |=
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->parent()->screen_space_opacity_is_animating();
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool animating_transform_to_target = layer->TransformIsAnimating();
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool animating_transform_to_screen = animating_transform_to_target;
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->parent()) {
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_transform_to_target |=
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->parent()->draw_transform_is_animating();
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_transform_to_screen |=
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->parent()->screen_space_transform_is_animating();
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size bounds = layer->bounds();
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF anchor_point = layer->anchor_point();
10617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::PointF position = layer->position() - layer->TotalScrollOffset();
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform combined_transform = parent_matrix;
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->transform().IsIdentity()) {
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // LT = Tr[origin] * Tr[origin2anchor]
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    combined_transform.Translate3d(
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        position.x() + anchor_point.x() * bounds.width(),
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        position.y() + anchor_point.y() * bounds.height(),
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->anchor_point_z());
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // LT = Tr[origin] * Tr[origin2anchor] * M[layer]
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    combined_transform.PreconcatTransform(layer->transform());
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // LT = Tr[origin] * Tr[origin2anchor] * M[layer] * Tr[anchor2origin]
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    combined_transform.Translate3d(-anchor_point.x() * bounds.width(),
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   -anchor_point.y() * bounds.height(),
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   -layer->anchor_point_z());
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    combined_transform.Translate(position.x(), position.y());
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!animating_transform_to_target && layer->scrollable() &&
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      combined_transform.IsScaleOrTranslation()) {
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Align the scrollable layer's position to screen space pixels to avoid
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // blurriness.  To avoid side-effects, do this only if the transform is
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // simple.
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RoundTranslationComponents(&combined_transform);
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Apply adjustment from position constraints.
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ApplyPositionAdjustment(layer, current_fixed_container,
1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      current_scroll_compensation_matrix, &combined_transform);
1091c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Compute the 2d scale components of the transform hierarchy up to the target
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // surface. From there, we can decide on a contents scale for the layer.
10949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  float layer_scale_factors = device_scale_factor;
10959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (in_subtree_of_page_scale_application_layer)
10969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    layer_scale_factors *= page_scale_factor;
1097c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2dF combined_transform_scales =
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MathUtil::ComputeTransform2dScaleComponents(
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          combined_transform,
1100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          layer_scale_factors);
1101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float ideal_contents_scale =
1103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      subtree_can_adjust_raster_scales
1104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ? std::max(combined_transform_scales.x(),
1105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 combined_transform_scales.y())
1106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      : layer_scale_factors;
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateLayerContentsScale(
1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer,
1109b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      subtree_can_adjust_raster_scales,
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ideal_contents_scale,
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_scale_factor,
11129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch      in_subtree_of_page_scale_application_layer ? page_scale_factor : 1.f,
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      animating_transform_to_screen);
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The draw_transform that gets computed below is effectively the layer's
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // draw_transform, unless the layer itself creates a render_surface. In that
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // case, the render_surface re-parents the transforms.
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.target_space_transform = combined_transform;
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // M[draw] = M[parent] * LT * S[layer2content]
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.target_space_transform.Scale
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (1.f / layer->contents_scale_x(), 1.f / layer->contents_scale_y());
11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The layer's screen_space_transform represents the transform between root
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // layer's "screen space" and local content space.
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.screen_space_transform = full_hierarchy_matrix;
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->preserves_3d())
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.screen_space_transform.FlattenTo2d();
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.screen_space_transform.PreconcatTransform
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (layer_draw_properties.target_space_transform);
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adjusting text AA method during animation may cause repaints, which in-turn
11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // causes jank.
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool adjust_text_aa =
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !animating_opacity_to_screen && !animating_transform_to_screen;
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // To avoid color fringing, LCD text should only be used on opaque layers with
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // just integral translation.
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool layer_can_use_lcd_text =
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      subtree_can_use_lcd_text && (accumulated_draw_opacity == 1.f) &&
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_draw_properties.target_space_transform.
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          IsIdentityOrIntegerTranslation();
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF content_rect(layer->content_bounds());
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // full_hierarchy_matrix is the matrix that transforms objects between screen
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // space (except projection matrix) and the most recent RenderSurfaceImpl's
11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // space.  next_hierarchy_matrix will only change if this layer uses a new
11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderSurfaceImpl, otherwise remains the same.
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform next_hierarchy_matrix = full_hierarchy_matrix;
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform sublayer_matrix;
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If the subtree will scale layer contents by the transform hierarchy, then
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // we should scale things into the render surface by the transform hierarchy
1153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // to take advantage of that.
1154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  gfx::Vector2dF render_surface_sublayer_scale =
1155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      subtree_can_adjust_raster_scales
1156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ? combined_transform_scales
1157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      : gfx::Vector2dF(layer_scale_factors, layer_scale_factors);
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SubtreeShouldRenderToSeparateSurface(
11607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          layer, combined_transform.Preserves2dAxisAlignment())) {
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Check back-face visibility before continuing with this surface and its
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // subtree
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer->double_sided() && TransformToParentIsKnown(layer) &&
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IsSurfaceBackFaceVisible(layer, combined_transform))
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderSurfaceType* render_surface = CreateOrReuseRenderSurface(layer);
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (IsRootLayer(layer)) {
1170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // The root layer's render surface size is predetermined and so the root
1171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // layer can't directly support non-identity transforms.  It should just
1172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // forward top-level transforms to the rest of the tree.
1173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sublayer_matrix = combined_transform;
11747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
11757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // The root surface does not contribute to any other surface, it has no
11767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      // target.
11777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      layer->render_surface()->set_contributes_to_drawn_surface(false);
1178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    } else {
1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // The owning layer's draw transform has a scale from content to layer
1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // space which we do not want; so here we use the combined_transform
1181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // instead of the draw_transform. However, we do need to add a different
1182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // scale factor that accounts for the surface's pixel dimensions.
1183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      combined_transform.Scale(1.0 / render_surface_sublayer_scale.x(),
1184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               1.0 / render_surface_sublayer_scale.y());
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      render_surface->SetDrawTransform(combined_transform);
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // The owning layer's transform was re-parented by the surface, so the
1188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // layer's new draw_transform only needs to scale the layer to surface
1189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // space.
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      layer_draw_properties.target_space_transform.MakeIdentity();
1191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      layer_draw_properties.target_space_transform.
1192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          Scale(render_surface_sublayer_scale.x() / layer->contents_scale_x(),
1193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                render_surface_sublayer_scale.y() / layer->contents_scale_y());
1194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // Inside the surface's subtree, we scale everything to the owning layer's
1196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // scale.  The sublayer matrix transforms layer rects into target surface
1197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // content space.  Conceptually, all layers in the subtree inherit the
1198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // scale at the point of the render surface in the transform hierarchy,
1199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // but we apply it explicitly to the owning layer and the remainder of the
1200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      // subtree independently.
1201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DCHECK(sublayer_matrix.IsIdentity());
1202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      sublayer_matrix.Scale(render_surface_sublayer_scale.x(),
1203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            render_surface_sublayer_scale.y());
12047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
12057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      layer->render_surface()->set_contributes_to_drawn_surface(
12067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          subtree_is_visible_from_ancestor && layer_is_visible);
1207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
1208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The opacity value is moved from the layer to its surface, so that the
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // entire subtree properly inherits opacity.
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetDrawOpacity(accumulated_draw_opacity);
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetDrawOpacityIsAnimating(animating_opacity_to_target);
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_opacity_to_target = false;
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.opacity = 1.f;
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.opacity_is_animating = animating_opacity_to_target;
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.screen_space_opacity_is_animating =
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_opacity_to_screen;
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetTargetSurfaceTransformsAreAnimating(
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_target);
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetScreenSpaceTransformsAreAnimating(
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_screen);
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    animating_transform_to_target = false;
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.target_space_transform_is_animating =
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_target;
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.screen_space_transform_is_animating =
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_screen;
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Update the aggregate hierarchy matrix to include the transform of the
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // newly created RenderSurfaceImpl.
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    next_hierarchy_matrix.PreconcatTransform(render_surface->draw_transform());
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The new render_surface here will correctly clip the entire subtree. So,
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we do not need to continue propagating the clipping state further down
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the tree. This way, we can avoid transforming clip rects from ancestor
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // target surface space to current target surface space that could cause
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // more w < 0 headaches.
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    subtree_should_be_clipped = false;
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (layer->mask_layer()) {
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DrawProperties<LayerType, RenderSurfaceType>& mask_layer_draw_properties =
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->mask_layer()->draw_properties();
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask_layer_draw_properties.render_target = layer;
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask_layer_draw_properties.visible_content_rect =
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(layer->content_bounds());
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (layer->replica_layer() && layer->replica_layer()->mask_layer()) {
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DrawProperties<LayerType, RenderSurfaceType>&
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      replica_mask_draw_properties =
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->mask_layer()->draw_properties();
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      replica_mask_draw_properties.render_target = layer;
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      replica_mask_draw_properties.visible_content_rect =
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Rect(layer->content_bounds());
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(senorblanco): make this smarter for the SkImageFilter case (check
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // for pixel-moving filters)
1259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (layer->filters().HasFilterThatMovesPixels() || layer->filter())
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      nearest_ancestor_that_moves_pixels = render_surface;
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The render surface clip rect is expressed in the space where this surface
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // draws, i.e. the same space as clip_rect_from_ancestor.
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetIsClipped(ancestor_clips_subtree);
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ancestor_clips_subtree) {
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_surface->SetClipRect(clip_rect_from_ancestor);
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform inverse_surface_draw_transform(
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::Transform::kSkipInitialization);
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!render_surface->draw_transform().GetInverse(
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              &inverse_surface_draw_transform)) {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // TODO(shawnsingh): Either we need to handle uninvertible transforms
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // here, or DCHECK that the transform is invertible.
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree_in_descendant_space =
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              inverse_surface_draw_transform, render_surface->clip_rect()));
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_surface->SetClipRect(gfx::Rect());
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree_in_descendant_space =
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          clip_rect_from_ancestor_in_descendant_space;
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetNearestAncestorThatMovesPixels(
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        nearest_ancestor_that_moves_pixels);
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the new render surface is drawn translucent or with a non-integral
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // translation then the subtree that gets drawn on this render surface
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // cannot use LCD text.
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    subtree_can_use_lcd_text = layer_can_use_lcd_text;
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface_layer_list->push_back(layer);
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(layer->parent());
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note: layer_draw_properties.target_space_transform is computed above,
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // before this if-else statement.
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.target_space_transform_is_animating =
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_target;
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.screen_space_transform_is_animating =
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_transform_to_screen;
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.opacity = accumulated_draw_opacity;
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.opacity_is_animating = animating_opacity_to_target;
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.screen_space_opacity_is_animating =
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        animating_opacity_to_screen;
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sublayer_matrix = combined_transform;
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->ClearRenderSurface();
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Layers without render_surfaces directly inherit the ancestor's clip
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // status.
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    subtree_should_be_clipped = ancestor_clips_subtree;
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ancestor_clips_subtree)
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree = clip_rect_from_ancestor;
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The surface's cached clip rect value propagates regardless of what
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // clipping goes on between layers here.
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clip_rect_for_subtree_in_descendant_space =
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clip_rect_from_ancestor_in_descendant_space;
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Layers that are not their own render_target will render into the target
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of their nearest ancestor.
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.render_target = layer->parent()->render_target();
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Mark whether a layer could be drawn directly to the back buffer, for
132790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // example when it could use LCD text even though it's in a non-contents
132890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // opaque layer.  This means that it can't be drawn to an intermediate
132990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // render target and also that no blending is applied to the layer as a whole
133090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // (meaning that its contents don't have to be pre-composited into a bitmap or
133190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // a render target).
133290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  //
133390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Ignoring animations is an optimization,
133490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // as it means that we're going to need some retained resources for this
133590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // layer in the near future even if its opacity is 1 now.
133690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_draw_properties.can_draw_directly_to_backbuffer =
133790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      IsRootLayer(layer_draw_properties.render_target) &&
133890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      layer->draw_properties().opacity == 1.f &&
133990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      !animating_opacity_to_screen;
134090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (adjust_text_aa)
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.can_use_lcd_text = layer_can_use_lcd_text;
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect rect_in_target_space = ToEnclosingRect(
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MathUtil::MapClippedRect(layer->draw_transform(), content_rect));
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (LayerClipsSubtree(layer)) {
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    subtree_should_be_clipped = true;
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ancestor_clips_subtree && !layer->render_surface()) {
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree = clip_rect_from_ancestor;
13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree.Intersect(rect_in_target_space);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      clip_rect_for_subtree = rect_in_target_space;
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13579ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  if (layer == page_scale_application_layer) {
13589ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    sublayer_matrix.Scale(page_scale_factor, page_scale_factor);
13599ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    in_subtree_of_page_scale_application_layer = true;
13609ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  }
13619ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Flatten to 2D if the layer doesn't preserve 3D.
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->preserves_3d())
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sublayer_matrix.FlattenTo2d();
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Apply the sublayer transform at the anchor point of the layer.
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer->sublayer_transform().IsIdentity()) {
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sublayer_matrix.Translate(layer->anchor_point().x() * bounds.width(),
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              layer->anchor_point().y() * bounds.height());
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sublayer_matrix.PreconcatTransform(layer->sublayer_transform());
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sublayer_matrix.Translate(-layer->anchor_point().x() * bounds.width(),
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              -layer->anchor_point().y() * bounds.height());
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  LayerListType& descendants =
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (layer->render_surface() ? layer->render_surface()->layer_list()
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               : *layer_list);
13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Any layers that are appended after this point are in the layer's subtree
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and should be included in the sorting process.
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t sorting_start_index = descendants.size();
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!LayerShouldBeSkipped(layer, layer_is_visible))
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    descendants.push_back(layer);
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform next_scroll_compensation_matrix =
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ComputeScrollCompensationMatrixForChildren(
1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          layer,
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          parent_matrix,
1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          current_scroll_compensation_matrix);
1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerType* next_fixed_container =
1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->IsContainerForFixedPositionLayers() ?
1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          layer : current_fixed_container;
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect accumulated_drawable_content_rect_of_children;
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < layer->children().size(); ++i) {
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerType* child =
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        LayerTreeHostCommon::get_child_as_raw_ptr(layer->children(), i);
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect drawable_content_rect_of_child_subtree;
1400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    gfx::Transform identity_matrix;
1401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    CalculateDrawPropertiesInternal<LayerType,
1402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                    LayerListType,
1403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                    RenderSurfaceType>(
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        child,
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sublayer_matrix,
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        next_hierarchy_matrix,
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        next_scroll_compensation_matrix,
1408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        next_fixed_container,
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clip_rect_for_subtree,
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clip_rect_for_subtree_in_descendant_space,
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        subtree_should_be_clipped,
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        nearest_ancestor_that_moves_pixels,
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        render_surface_layer_list,
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &descendants,
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer_sorter,
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        max_texture_size,
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_scale_factor,
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        page_scale_factor,
1419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        page_scale_application_layer,
1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        in_subtree_of_page_scale_application_layer,
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        subtree_can_use_lcd_text,
1422b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        subtree_can_adjust_raster_scales,
14237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        layer_is_visible,
1424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        &drawable_content_rect_of_child_subtree);
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!drawable_content_rect_of_child_subtree.IsEmpty()) {
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      accumulated_drawable_content_rect_of_children.Union(
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          drawable_content_rect_of_child_subtree);
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (child->render_surface())
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        descendants.push_back(child);
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->render_surface() && !IsRootLayer(layer) &&
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->render_surface()->layer_list().empty()) {
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RemoveSurfaceForEarlyExit(layer, render_surface_layer_list);
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute the total drawable_content_rect for this subtree (the rect is in
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // target surface space).
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect local_drawable_content_rect_of_subtree =
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      accumulated_drawable_content_rect_of_children;
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->DrawsContent())
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_drawable_content_rect_of_subtree.Union(rect_in_target_space);
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (subtree_should_be_clipped)
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    local_drawable_content_rect_of_subtree.Intersect(clip_rect_for_subtree);
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute the layer's drawable content rect (the rect is in target surface
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // space).
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.drawable_content_rect = rect_in_target_space;
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (subtree_should_be_clipped) {
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.drawable_content_rect.
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Intersect(clip_rect_for_subtree);
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tell the layer the rect that is clipped by. In theory we could use a
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tighter clip rect here (drawable_content_rect), but that actually does not
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // reduce how much would be drawn, and instead it would create unnecessary
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changes to scissor state affecting GPU performance.
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.is_clipped = subtree_should_be_clipped;
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (subtree_should_be_clipped) {
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.clip_rect = clip_rect_for_subtree;
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initialize the clip rect to a safe value that will not clip the
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // layer, just in case clipping is still accidentally used.
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_draw_properties.clip_rect = rect_in_target_space;
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute the layer's visible content rect (the rect is in content space)
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_draw_properties.visible_content_rect = CalculateVisibleContentRect(
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer, clip_rect_for_subtree_in_descendant_space, rect_in_target_space);
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compute the remaining properties for the render surface, if the layer has
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // one.
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsRootLayer(layer)) {
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The root layer's surface's content_rect is always the entire viewport.
14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(layer->render_surface());
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->render_surface()->SetContentRect(clip_rect_from_ancestor);
14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (layer->render_surface() && !IsRootLayer(layer)) {
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderSurfaceType* render_surface = layer->render_surface();
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect clipped_content_rect = local_drawable_content_rect_of_subtree;
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't clip if the layer is reflected as the reflection shouldn't be
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // clipped. If the layer is animating, then the surface's transform to
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // its target is not known on the main thread, and we should not use it
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // to clip.
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!layer->replica_layer() && TransformToParentIsKnown(layer)) {
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Note, it is correct to use ancestor_clips_subtree here, because we are
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // looking at this layer's render_surface, not the layer itself.
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (ancestor_clips_subtree && !clipped_content_rect.IsEmpty()) {
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Rect surface_clip_rect = LayerTreeHostCommon::CalculateVisibleRect(
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            render_surface->clip_rect(),
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            clipped_content_rect,
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            render_surface->draw_transform());
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        clipped_content_rect.Intersect(surface_clip_rect);
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The RenderSurfaceImpl backing texture cannot exceed the maximum supported
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // texture size.
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clipped_content_rect.set_width(
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::min(clipped_content_rect.width(), max_texture_size));
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    clipped_content_rect.set_height(
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::min(clipped_content_rect.height(), max_texture_size));
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (clipped_content_rect.IsEmpty()) {
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RemoveSurfaceForEarlyExit(layer, render_surface_layer_list);
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetContentRect(clipped_content_rect);
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The owning layer's screen_space_transform has a scale from content to
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // layer space which we need to undo and replace with a scale from the
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // surface's subtree into layer space.
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Transform screen_space_transform = layer->screen_space_transform();
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    screen_space_transform.Scale(
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->contents_scale_x() / render_surface_sublayer_scale.x(),
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->contents_scale_y() / render_surface_sublayer_scale.y());
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    render_surface->SetScreenSpaceTransform(screen_space_transform);
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (layer->replica_layer()) {
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform surface_origin_to_replica_origin_transform;
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_origin_to_replica_origin_transform.Scale(
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          render_surface_sublayer_scale.x(), render_surface_sublayer_scale.y());
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_origin_to_replica_origin_transform.Translate(
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->position().x() +
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->anchor_point().x() * bounds.width(),
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->position().y() +
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->anchor_point().y() * bounds.height());
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_origin_to_replica_origin_transform.PreconcatTransform(
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->replica_layer()->transform());
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_origin_to_replica_origin_transform.Translate(
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          -layer->replica_layer()->anchor_point().x() * bounds.width(),
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          -layer->replica_layer()->anchor_point().y() * bounds.height());
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      surface_origin_to_replica_origin_transform.Scale(
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1.0 / render_surface_sublayer_scale.x(),
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1.0 / render_surface_sublayer_scale.y());
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Compute the replica's "originTransform" that maps from the replica's
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // origin space to the target surface origin space.
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform replica_origin_transform =
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->render_surface()->draw_transform() *
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          surface_origin_to_replica_origin_transform;
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_surface->SetReplicaDrawTransform(replica_origin_transform);
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Compute the replica's "screen_space_transform" that maps from the
15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // replica's origin space to the screen's origin space.
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform replica_screen_space_transform =
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          layer->render_surface()->screen_space_transform() *
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          surface_origin_to_replica_origin_transform;
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_surface->SetReplicaScreenSpaceTransform(
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          replica_screen_space_transform);
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateTilePrioritiesForLayer(layer);
1558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SavePaintPropertiesLayer(layer);
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If neither this layer nor any of its children were added, early out.
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sorting_start_index == descendants.size())
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If preserves-3d then sort all the descendants in 3D so that they can be
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // drawn from back to front. If the preserves-3d property is also set on the
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // parent then skip the sorting as the parent will sort all the descendants
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // anyway.
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_sorter && descendants.size() && layer->preserves_3d() &&
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!layer->parent() || !layer->parent()->preserves_3d())) {
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SortLayers(descendants.begin() + sorting_start_index,
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               descendants.end(),
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               layer_sorter);
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->render_surface()) {
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *drawable_content_rect_of_subtree =
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::ToEnclosingRect(layer->render_surface()->DrawableContentRect());
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *drawable_content_rect_of_subtree = local_drawable_content_rect_of_subtree;
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->HasContributingDelegatedRenderPasses()) {
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->render_target()->render_surface()->
15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddContributingDelegatedRenderPassLayer(layer);
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostCommon::CalculateDrawProperties(
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* root_layer,
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size device_viewport_size,
1591868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const gfx::Transform& device_transform,
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor,
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
1594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Layer* page_scale_application_layer,
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int max_texture_size,
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool can_use_lcd_text,
1597b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool can_adjust_raster_scales,
1598ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    RenderSurfaceLayerList* render_surface_layer_list) {
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect total_drawable_content_rect;
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform identity_matrix;
1601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Transform scaled_device_transform = device_transform;
1602868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scaled_device_transform.Scale(device_scale_factor, device_scale_factor);
1603ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  RenderSurfaceLayerList dummy_layer_list;
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The root layer's render_surface should receive the device viewport as the
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initial clip rect.
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool subtree_should_be_clipped = true;
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect device_viewport_rect(device_viewport_size);
1609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool in_subtree_of_page_scale_application_layer = false;
16107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool subtree_is_visible = true;
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function should have received a root layer.
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsRootLayer(root_layer));
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PreCalculateMetaInformationRecursiveData recursive_data;
16167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PreCalculateMetaInformation(root_layer, &recursive_data);
16177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  CalculateDrawPropertiesInternal<Layer, RenderSurfaceLayerList, RenderSurface>(
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_layer,
1620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      scaled_device_transform,
1621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      identity_matrix,
1622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      identity_matrix,
1623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      root_layer,
1624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_viewport_rect,
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_viewport_rect,
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      subtree_should_be_clipped,
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NULL,
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      render_surface_layer_list,
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &dummy_layer_list,
1630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NULL,
1631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      max_texture_size,
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      device_scale_factor,
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      page_scale_factor,
1634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      page_scale_application_layer,
1635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      in_subtree_of_page_scale_application_layer,
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      can_use_lcd_text,
1637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      can_adjust_raster_scales,
16387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      subtree_is_visible,
1639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &total_drawable_content_rect);
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The dummy layer list should not have been used.
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(0u, dummy_layer_list.size());
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A root layer render_surface should always exist after
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CalculateDrawProperties.
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(root_layer->render_surface());
16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTreeHostCommon::CalculateDrawProperties(
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* root_layer,
16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size device_viewport_size,
1651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const gfx::Transform& device_transform,
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor,
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float page_scale_factor,
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImpl* page_scale_application_layer,
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int max_texture_size,
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool can_use_lcd_text,
1657b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    bool can_adjust_raster_scales,
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    LayerImplList* render_surface_layer_list) {
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect total_drawable_content_rect;
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform identity_matrix;
1661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Transform scaled_device_transform = device_transform;
1662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scaled_device_transform.Scale(device_scale_factor, device_scale_factor);
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LayerImplList dummy_layer_list;
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerSorter layer_sorter;
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The root layer's render_surface should receive the device viewport as the
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // initial clip rect.
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool subtree_should_be_clipped = true;
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect device_viewport_rect(device_viewport_size);
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool in_subtree_of_page_scale_application_layer = false;
16717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool subtree_is_visible = true;
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This function should have received a root layer.
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(IsRootLayer(root_layer));
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PreCalculateMetaInformationRecursiveData recursive_data;
16777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PreCalculateMetaInformation(root_layer, &recursive_data);
16787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CalculateDrawPropertiesInternal<LayerImpl,
1680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  LayerImplList,
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  RenderSurfaceImpl>(
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      root_layer,
1683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      scaled_device_transform,
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      identity_matrix,
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      identity_matrix,
1686868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      root_layer,
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_viewport_rect,
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_viewport_rect,
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      subtree_should_be_clipped,
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL,
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      render_surface_layer_list,
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &dummy_layer_list,
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &layer_sorter,
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      max_texture_size,
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      device_scale_factor,
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      page_scale_factor,
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      page_scale_application_layer,
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      in_subtree_of_page_scale_application_layer,
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      can_use_lcd_text,
1700b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      can_adjust_raster_scales,
17017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      subtree_is_visible,
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      &total_drawable_content_rect);
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The dummy layer list should not have been used.
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK_EQ(0u, dummy_layer_list.size());
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A root layer render_surface should always exist after
17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CalculateDrawProperties.
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(root_layer->render_surface());
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool PointHitsRect(
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::PointF screen_space_point,
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& local_space_to_screen_space_transform,
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RectF local_space_rect) {
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the transform is not invertible, then assume that this point doesn't hit
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this rect.
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform inverse_local_space_to_screen_space(
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform::kSkipInitialization);
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!local_space_to_screen_space_transform.GetInverse(
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &inverse_local_space_to_screen_space))
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transform the hit test point from screen space to the local space of the
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // given rect.
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clipped = false;
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF hit_test_point_in_local_space = MathUtil::ProjectPoint(
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      inverse_local_space_to_screen_space, screen_space_point, &clipped);
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If ProjectPoint could not project to a valid value, then we assume that
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this point doesn't hit this rect.
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (clipped)
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return local_space_rect.Contains(hit_test_point_in_local_space);
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool PointHitsRegion(gfx::PointF screen_space_point,
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const gfx::Transform& screen_space_transform,
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const Region& layer_space_region,
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            float layer_content_scale_x,
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            float layer_content_scale_y) {
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the transform is not invertible, then assume that this point doesn't hit
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this region.
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform inverse_screen_space_transform(
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Transform::kSkipInitialization);
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!screen_space_transform.GetInverse(&inverse_screen_space_transform))
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transform the hit test point from screen space to the local space of the
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // given region.
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool clipped = false;
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF hit_test_point_in_content_space = MathUtil::ProjectPoint(
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      inverse_screen_space_transform, screen_space_point, &clipped);
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::PointF hit_test_point_in_layer_space =
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScalePoint(hit_test_point_in_content_space,
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      1.f / layer_content_scale_x,
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      1.f / layer_content_scale_y);
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If ProjectPoint could not project to a valid value, then we assume that
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this point doesn't hit this region.
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (clipped)
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_space_region.Contains(
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ToRoundedPoint(hit_test_point_in_layer_space));
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool PointIsClippedBySurfaceOrClipRect(gfx::PointF screen_space_point,
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              LayerImpl* layer) {
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerImpl* current_layer = layer;
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Walk up the layer tree and hit-test any render_surfaces and any layer
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // clip rects that are active.
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (current_layer) {
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (current_layer->render_surface() &&
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !PointHitsRect(
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            screen_space_point,
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            current_layer->render_surface()->screen_space_transform(),
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            current_layer->render_surface()->content_rect()))
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Note that drawable content rects are actually in target surface space, so
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the transform we have to provide is the target surface's
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // screen_space_transform.
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* render_target = current_layer->render_target();
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (LayerClipsSubtree(current_layer) &&
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        !PointHitsRect(
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            screen_space_point,
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            render_target->render_surface()->screen_space_transform(),
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            current_layer->drawable_content_rect()))
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_layer = current_layer->parent();
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we have finished walking all ancestors without having already exited,
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then the point is not clipped by any ancestors.
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPoint(
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::PointF screen_space_point,
1803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list) {
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerImpl* found_layer = NULL;
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef LayerIterator<LayerImpl,
1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        LayerImplList,
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        RenderSurfaceImpl,
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        LayerIteratorActions::FrontToBack> LayerIteratorType;
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list);
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerIteratorType
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           it = LayerIteratorType::Begin(&render_surface_layer_list);
18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != end;
18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++it) {
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We don't want to consider render_surfaces for hit testing.
18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!it.represents_itself())
18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* current_layer = (*it);
18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::RectF content_rect(current_layer->content_bounds());
18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!PointHitsRect(screen_space_point,
18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       current_layer->screen_space_transform(),
18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       content_rect))
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // At this point, we think the point does hit the layer, but we need to walk
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // up the parents to ensure that the layer was not clipped in such a way
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // that the hit point actually should not hit the layer.
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (PointIsClippedBySurfaceOrClipRect(screen_space_point, current_layer))
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Skip the HUD layer.
18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (current_layer == current_layer->layer_tree_impl()->hud_layer())
18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    found_layer = current_layer;
18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    break;
18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This can potentially return NULL, which means the screen_space_point did
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not successfully hit test any layers, not even the root layer.
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return found_layer;
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerImpl* LayerTreeHostCommon::FindLayerThatIsHitByPointInTouchHandlerRegion(
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::PointF screen_space_point,
1849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const LayerImplList& render_surface_layer_list) {
18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerImpl* found_layer = NULL;
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef LayerIterator<LayerImpl,
1853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        LayerImplList,
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        RenderSurfaceImpl,
18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        LayerIteratorActions::FrontToBack> LayerIteratorType;
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list);
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerIteratorType
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           it = LayerIteratorType::Begin(&render_surface_layer_list);
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != end;
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++it) {
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We don't want to consider render_surfaces for hit testing.
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!it.represents_itself())
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* current_layer = (*it);
18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!LayerHasTouchEventHandlersAt(screen_space_point, current_layer))
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    found_layer = current_layer;
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    break;
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This can potentially return NULL, which means the screen_space_point did
18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not successfully hit test any layers, not even the root layer.
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return found_layer;
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerTreeHostCommon::LayerHasTouchEventHandlersAt(
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::PointF screen_space_point,
18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* layer_impl) {
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_impl->touch_event_handler_region().IsEmpty())
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!PointHitsRegion(screen_space_point,
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       layer_impl->screen_space_transform(),
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       layer_impl->touch_event_handler_region(),
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       layer_impl->contents_scale_x(),
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       layer_impl->contents_scale_y()))
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // At this point, we think the point does hit the touch event handler region
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on the layer, but we need to walk up the parents to ensure that the layer
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // was not clipped in such a way that the hit point actually should not hit
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the layer.
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (PointIsClippedBySurfaceOrClipRect(screen_space_point, layer_impl))
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1903