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