diff options
Diffstat (limited to 'chromium/cc/trees/property_tree_builder.cc')
-rw-r--r-- | chromium/cc/trees/property_tree_builder.cc | 962 |
1 files changed, 166 insertions, 796 deletions
diff --git a/chromium/cc/trees/property_tree_builder.cc b/chromium/cc/trees/property_tree_builder.cc index e962ff9a63c..0f04b6a6660 100644 --- a/chromium/cc/trees/property_tree_builder.cc +++ b/chromium/cc/trees/property_tree_builder.cc @@ -17,7 +17,7 @@ #include "cc/trees/clip_node.h" #include "cc/trees/draw_property_utils.h" #include "cc/trees/effect_node.h" -#include "cc/trees/layer_tree_impl.h" +#include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_settings.h" #include "cc/trees/mutator_host.h" #include "cc/trees/scroll_node.h" @@ -37,71 +37,48 @@ struct DataForRecursion { int scroll_tree_parent; int closest_ancestor_with_cached_render_surface; int closest_ancestor_with_copy_request; - uint32_t main_thread_scrolling_reasons; SkColor safe_opaque_background_color; - bool in_subtree_of_page_scale_layer; - bool affected_by_outer_viewport_bounds_delta; - bool should_flatten; - bool scroll_tree_parent_created_by_uninheritable_criteria; bool animation_axis_aligned_since_render_target; bool not_axis_aligned_since_last_clip; gfx::Transform compound_transform_since_render_target; bool* subtree_has_rounded_corner; }; -template <typename LayerType> class PropertyTreeBuilderContext { public: - PropertyTreeBuilderContext(LayerType* root_layer, - const LayerType* page_scale_layer, - const LayerType* inner_viewport_scroll_layer, - const LayerType* outer_viewport_scroll_layer, - const ElementId overscroll_elasticity_element_id, - const gfx::Vector2dF& elastic_overscroll, - float page_scale_factor, - const gfx::Transform& device_transform, - MutatorHost* mutator_host, - PropertyTrees* property_trees) - : root_layer_(root_layer), - page_scale_layer_(page_scale_layer), - inner_viewport_scroll_layer_(inner_viewport_scroll_layer), - outer_viewport_scroll_layer_(outer_viewport_scroll_layer), - overscroll_elasticity_element_id_(overscroll_elasticity_element_id), - elastic_overscroll_(elastic_overscroll), - page_scale_factor_(page_scale_factor), - device_transform_(device_transform), - mutator_host_(*mutator_host), - property_trees_(*property_trees), - transform_tree_(property_trees->transform_tree), - clip_tree_(property_trees->clip_tree), - effect_tree_(property_trees->effect_tree), - scroll_tree_(property_trees->scroll_tree) {} - - void BuildPropertyTrees(float device_scale_factor, - const gfx::Rect& viewport, - SkColor root_background_color) const; + explicit PropertyTreeBuilderContext(LayerTreeHost* layer_tree_host) + : layer_tree_host_(layer_tree_host), + root_layer_(layer_tree_host->root_layer()), + mutator_host_(*layer_tree_host->mutator_host()), + property_trees_(*layer_tree_host->property_trees()), + transform_tree_(property_trees_.transform_tree), + clip_tree_(property_trees_.clip_tree), + effect_tree_(property_trees_.effect_tree), + scroll_tree_(property_trees_.scroll_tree) {} + + void BuildPropertyTrees(); private: void BuildPropertyTreesInternal( - LayerType* layer, + Layer* layer, const DataForRecursion& data_from_parent) const; bool AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, bool created_render_surface, DataForRecursion* data_for_children) const; void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, bool created_transform_node, DataForRecursion* data_for_children) const; bool AddEffectNodeIfNeeded(const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, DataForRecursion* data_for_children) const; void AddScrollNodeIfNeeded(const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, DataForRecursion* data_for_children) const; bool UpdateRenderSurfaceIfNeeded(int parent_effect_tree_id, @@ -109,14 +86,8 @@ class PropertyTreeBuilderContext { bool subtree_has_rounded_corner, bool created_transform_node) const; - LayerType* root_layer_; - const LayerType* page_scale_layer_; - const LayerType* inner_viewport_scroll_layer_; - const LayerType* outer_viewport_scroll_layer_; - const ElementId overscroll_elasticity_element_id_; - const gfx::Vector2dF elastic_overscroll_; - float page_scale_factor_; - const gfx::Transform& device_transform_; + LayerTreeHost* layer_tree_host_; + Layer* root_layer_; MutatorHost& mutator_host_; PropertyTrees& property_trees_; TransformTree& transform_tree_; @@ -125,121 +96,47 @@ class PropertyTreeBuilderContext { ScrollTree& scroll_tree_; }; -static LayerImplList& LayerChildren(LayerImpl* layer) { - return layer->test_properties()->children; -} - -static const LayerList& LayerChildren(Layer* layer) { - return layer->children(); -} - -static LayerImpl* LayerChildAt(LayerImpl* layer, int index) { - return layer->test_properties()->children[index]; -} - -static Layer* LayerChildAt(Layer* layer, int index) { - return layer->children()[index].get(); -} - -static bool HasClipRect(Layer* layer) { - return !layer->clip_rect().IsEmpty(); -} - -static bool HasClipRect(LayerImpl* layer) { - return false; -} - -static inline const FilterOperations& Filters(Layer* layer) { - return layer->filters(); -} - -static inline const FilterOperations& Filters(LayerImpl* layer) { - return layer->test_properties()->filters; -} - -static bool IsFastRoundedCorner(Layer* layer) { - return layer->is_fast_rounded_corner(); -} - -static bool IsFastRoundedCorner(LayerImpl* layer) { - return false; -} - -static bool HasRoundedCorner(Layer* layer) { - return layer->HasRoundedCorner(); -} - -static bool HasRoundedCorner(LayerImpl* layer) { - return !layer->test_properties()->rounded_corner_bounds.IsEmpty(); -} - -static PictureLayer* MaskLayer(Layer* layer) { - return layer->mask_layer(); -} - -static LayerImpl* MaskLayer(LayerImpl* layer) { - return layer->test_properties()->mask_layer; -} - -static const gfx::Transform& Transform(Layer* layer) { - return layer->transform(); -} - -static const gfx::Transform& Transform(LayerImpl* layer) { - return layer->test_properties()->transform; -} - -static const gfx::PointF& Position(Layer* layer) { - return layer->position(); -} - -static const gfx::PointF& Position(LayerImpl* layer) { - return layer->test_properties()->position; -} - // Methods to query state from the AnimationHost ---------------------- -template <typename LayerType> -bool OpacityIsAnimating(const MutatorHost& host, LayerType* layer) { +bool OpacityIsAnimating(const MutatorHost& host, Layer* layer) { return host.IsAnimatingOpacityProperty(layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> bool HasPotentiallyRunningOpacityAnimation(const MutatorHost& host, - LayerType* layer) { + Layer* layer) { return host.HasPotentiallyRunningOpacityAnimation( layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> -bool FilterIsAnimating(const MutatorHost& host, LayerType* layer) { +bool HasPotentialOpacityAnimation(const MutatorHost& host, Layer* layer) { + return HasPotentiallyRunningOpacityAnimation(host, layer) || + layer->OpacityCanAnimateOnImplThread(); +} + +bool FilterIsAnimating(const MutatorHost& host, Layer* layer) { return host.IsAnimatingFilterProperty(layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> bool HasPotentiallyRunningFilterAnimation(const MutatorHost& host, - LayerType* layer) { + Layer* layer) { return host.HasPotentiallyRunningFilterAnimation( layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> -bool TransformIsAnimating(const MutatorHost& host, LayerType* layer) { +bool TransformIsAnimating(const MutatorHost& host, Layer* layer) { return host.IsAnimatingTransformProperty(layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> bool HasPotentiallyRunningTransformAnimation(const MutatorHost& host, - LayerType* layer) { + Layer* layer) { return host.HasPotentiallyRunningTransformAnimation( layer->element_id(), layer->GetElementTypeForAnimation()); } -template <typename LayerType> void GetAnimationScales(const MutatorHost& host, - LayerType* layer, + Layer* layer, float* maximum_scale, float* starting_scale) { return host.GetAnimationScales(layer->element_id(), @@ -247,94 +144,46 @@ void GetAnimationScales(const MutatorHost& host, maximum_scale, starting_scale); } -template <typename LayerType> -bool AnimationsPreserveAxisAlignment(const MutatorHost& host, - LayerType* layer) { +bool AnimationsPreserveAxisAlignment(const MutatorHost& host, Layer* layer) { return host.AnimationsPreserveAxisAlignment(layer->element_id()); } -template <typename LayerType> bool HasAnyAnimationTargetingProperty(const MutatorHost& host, - LayerType* layer, + Layer* layer, TargetProperty::Type property) { return host.HasAnyAnimationTargetingProperty(layer->element_id(), property); } // ------------------------------------------------------------------- -template <typename LayerType> -static bool LayerClipsSubtreeToItsBounds(LayerType* layer) { - return layer->masks_to_bounds() || MaskLayer(layer); -} - -template <typename LayerType> -static bool LayerClipsSubtree(LayerType* layer) { - return LayerClipsSubtreeToItsBounds(layer) || HasRoundedCorner(layer) || - HasClipRect(layer); -} - -gfx::RectF EffectiveClipRect(Layer* layer) { - return layer->EffectiveClipRect(); -} - -gfx::RectF EffectiveClipRect(LayerImpl* layer) { - return gfx::RectF(gfx::PointF(), gfx::SizeF(layer->bounds())); -} - -static gfx::RRectF RoundedCornerBounds(Layer* layer) { - return gfx::RRectF(EffectiveClipRect(layer), layer->corner_radii()); -} - -static gfx::RRectF RoundedCornerBounds(LayerImpl* layer) { - return layer->test_properties()->rounded_corner_bounds; -} - -static Layer* LayerParent(Layer* layer) { - return layer->parent(); -} - -static LayerImpl* LayerParent(LayerImpl* layer) { - return layer->test_properties()->parent; -} - -static inline int SortingContextId(Layer* layer) { - return layer->sorting_context_id(); -} - -static inline int SortingContextId(LayerImpl* layer) { - return layer->test_properties()->sorting_context_id; +bool LayerClipsSubtreeToItsBounds(Layer* layer) { + return layer->masks_to_bounds() || layer->IsMaskedByChild(); } -static inline bool Is3dSorted(Layer* layer) { - return layer->sorting_context_id() != 0; +bool LayerClipsSubtree(Layer* layer) { + return LayerClipsSubtreeToItsBounds(layer) || layer->HasRoundedCorner() || + !layer->clip_rect().IsEmpty(); } -static inline bool Is3dSorted(LayerImpl* layer) { - return layer->test_properties()->sorting_context_id != 0; +gfx::RRectF RoundedCornerBounds(Layer* layer) { + return gfx::RRectF(layer->EffectiveClipRect(), layer->corner_radii()); } -static inline void SetHasClipNode(Layer* layer, bool val) { - layer->SetHasClipNode(val); -} - -static inline void SetHasClipNode(LayerImpl* layer, bool val) {} - -template <typename LayerType> -void PropertyTreeBuilderContext<LayerType>::AddClipNodeIfNeeded( +void PropertyTreeBuilderContext::AddClipNodeIfNeeded( const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, bool created_transform_node, DataForRecursion* data_for_children) const { const int parent_id = data_from_ancestor.clip_tree_parent; bool layer_clips_subtree = LayerClipsSubtree(layer); bool requires_node = - layer_clips_subtree || Filters(layer).HasFilterThatMovesPixels(); + layer_clips_subtree || layer->filters().HasFilterThatMovesPixels(); if (!requires_node) { data_for_children->clip_tree_parent = parent_id; } else { ClipNode node; - node.clip = EffectiveClipRect(layer); + node.clip = layer->EffectiveClipRect(); // Move the clip bounds so that it is relative to the transform parent. node.clip += layer->offset_to_transform_parent(); @@ -345,51 +194,23 @@ void PropertyTreeBuilderContext<LayerType>::AddClipNodeIfNeeded( if (layer_clips_subtree) { node.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP; } else { - DCHECK(Filters(layer).HasFilterThatMovesPixels()); + DCHECK(layer->filters().HasFilterThatMovesPixels()); node.clip_type = ClipNode::ClipType::EXPANDS_CLIP; node.clip_expander = ClipExpander(layer->effect_tree_index()); } data_for_children->clip_tree_parent = clip_tree_.Insert(node, parent_id); } - SetHasClipNode(layer, requires_node); + layer->SetHasClipNode(requires_node); layer->SetClipTreeIndex(data_for_children->clip_tree_parent); } -template <typename LayerType> -static inline bool IsAtBoundaryOf3dRenderingContext(LayerType* layer) { - return LayerParent(layer) - ? SortingContextId(LayerParent(layer)) != SortingContextId(layer) - : Is3dSorted(layer); -} - -static inline gfx::Point3F TransformOrigin(Layer* layer) { - return layer->transform_origin(); -} - -static inline gfx::Point3F TransformOrigin(LayerImpl* layer) { - return layer->test_properties()->transform_origin; -} - -static inline bool ShouldFlattenTransform(Layer* layer) { - return layer->should_flatten_transform(); -} - -static inline bool ShouldFlattenTransform(LayerImpl* layer) { - return layer->test_properties()->should_flatten_transform; -} - -template <typename LayerType> -bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded( +bool PropertyTreeBuilderContext::AddTransformNodeIfNeeded( const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, bool created_render_surface, DataForRecursion* data_for_children) const { - const bool is_root = !LayerParent(layer); - const bool is_page_scale_layer = layer == page_scale_layer_; - const bool is_overscroll_elasticity_layer = - overscroll_elasticity_element_id_ && - layer->element_id() == overscroll_elasticity_element_id_; + const bool is_root = !layer->parent(); const bool is_scrollable = layer->scrollable(); // Scrolling a layer should not move it from being pixel-aligned to moving off // the pixel grid and becoming fuzzy. So always snap scrollable things to the @@ -398,7 +219,7 @@ bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded( is_scrollable || layer->IsSnappedToPixelGridInTarget(); const bool has_significant_transform = - !Transform(layer).IsIdentityOr2DTranslation(); + !layer->transform().IsIdentityOr2DTranslation(); const bool has_potentially_animated_transform = HasPotentiallyRunningTransformAnimation(mutator_host_, layer); @@ -412,15 +233,10 @@ bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded( const bool has_surface = created_render_surface; - const bool is_at_boundary_of_3d_rendering_context = - IsAtBoundaryOf3dRenderingContext(layer); - DCHECK(!is_scrollable || is_snapped); bool requires_node = is_root || is_snapped || has_significant_transform || has_any_transform_animation || has_surface || - is_page_scale_layer || is_overscroll_elasticity_layer || - is_at_boundary_of_3d_rendering_context || - HasRoundedCorner(layer); + layer->HasRoundedCorner(); int parent_index = TransformTree::kRootNodeId; gfx::Vector2dF parent_offset; @@ -428,17 +244,14 @@ bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded( parent_index = data_from_ancestor.transform_tree_parent; // Now layer tree mode (IsUsingLayerLists is false) is for ui compositor // only. The transform tree hierarchy is always the same as layer hierarchy. - DCHECK_EQ(parent_index, LayerParent(layer)->transform_tree_index()); - parent_offset = LayerParent(layer)->offset_to_transform_parent(); + DCHECK_EQ(parent_index, layer->parent()->transform_tree_index()); + parent_offset = layer->parent()->offset_to_transform_parent(); } if (!requires_node) { - data_for_children->should_flatten |= ShouldFlattenTransform(layer); - gfx::Vector2dF local_offset = - Position(layer).OffsetFromOrigin() + Transform(layer).To2dTranslation(); + gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + + layer->transform().To2dTranslation(); layer->SetOffsetToTransformParent(parent_offset + local_offset); - layer->SetShouldFlattenScreenSpaceTransformFromPropertyTree( - data_from_ancestor.should_flatten); layer->SetTransformTreeIndex(parent_index); return false; } @@ -458,272 +271,60 @@ bool PropertyTreeBuilderContext<LayerType>::AddTransformNodeIfNeeded( node->scrolls = is_scrollable; node->should_be_snapped = is_snapped; - node->flattens_inherited_transform = data_for_children->should_flatten; - node->sorting_context_id = SortingContextId(layer); - if (is_root || is_page_scale_layer) { + if (is_root) { // Root layer and page scale layer should not have transform or offset. - DCHECK(Position(layer).IsOrigin()); + DCHECK(layer->position().IsOrigin()); DCHECK(parent_offset.IsZero()); - DCHECK(Transform(layer).IsIdentity()); + DCHECK(layer->transform().IsIdentity()); - if (is_root) { - DCHECK(!is_page_scale_layer); - transform_tree_.SetRootScaleAndTransform( - transform_tree_.device_scale_factor(), device_transform_); - } else { - DCHECK(is_page_scale_layer); - transform_tree_.set_page_scale_factor(page_scale_factor_); - node->local.Scale(page_scale_factor_, page_scale_factor_); - data_for_children->in_subtree_of_page_scale_layer = true; - } + transform_tree_.SetRootScaleAndTransform( + transform_tree_.device_scale_factor(), gfx::Transform()); } else { - node->local = Transform(layer); - node->origin = TransformOrigin(layer); - node->post_translation = parent_offset + Position(layer).OffsetFromOrigin(); + node->local = layer->transform(); + node->origin = layer->transform_origin(); + node->post_translation = + parent_offset + layer->position().OffsetFromOrigin(); } - node->in_subtree_of_page_scale_layer = - data_for_children->in_subtree_of_page_scale_layer; - - // Surfaces inherently flatten transforms. - data_for_children->should_flatten = - ShouldFlattenTransform(layer) || has_surface; - node->has_potential_animation = has_potentially_animated_transform; node->is_currently_animating = TransformIsAnimating(mutator_host_, layer); GetAnimationScales(mutator_host_, layer, &node->maximum_animation_scale, &node->starting_animation_scale); - if (is_overscroll_elasticity_layer) { - DCHECK(!is_scrollable); - node->scroll_offset = gfx::ScrollOffset(elastic_overscroll_); - } else { - node->scroll_offset = layer->CurrentScrollOffset(); - } + node->scroll_offset = layer->CurrentScrollOffset(); node->needs_local_transform_update = true; transform_tree_.UpdateTransforms(node->id); layer->SetOffsetToTransformParent(gfx::Vector2dF()); - // Flattening (if needed) will be handled by |node|. - layer->SetShouldFlattenScreenSpaceTransformFromPropertyTree(false); - return true; } -static inline bool HasPotentialOpacityAnimation(const MutatorHost& host, - Layer* layer) { - return HasPotentiallyRunningOpacityAnimation(host, layer) || - layer->OpacityCanAnimateOnImplThread(); -} - -static inline bool HasPotentialOpacityAnimation(const MutatorHost& host, - LayerImpl* layer) { - return HasPotentiallyRunningOpacityAnimation(host, layer) || - layer->test_properties()->opacity_can_animate; -} - -static inline bool DoubleSided(Layer* layer) { - return layer->double_sided(); -} - -static inline bool DoubleSided(LayerImpl* layer) { - return layer->test_properties()->double_sided; -} - -static inline bool TrilinearFiltering(Layer* layer) { - return layer->trilinear_filtering(); -} - -static inline bool TrilinearFiltering(LayerImpl* layer) { - return layer->test_properties()->trilinear_filtering; -} - -static inline bool CacheRenderSurface(Layer* layer) { - return layer->cache_render_surface(); -} - -static inline bool CacheRenderSurface(LayerImpl* layer) { - return layer->test_properties()->cache_render_surface; -} - -static inline bool ForceRenderSurfaceForTesting(Layer* layer) { - return layer->force_render_surface_for_testing(); -} - -static inline bool ForceRenderSurfaceForTesting(LayerImpl* layer) { - return layer->test_properties()->force_render_surface; -} - -template <typename LayerType> -static inline bool LayerIsInExisting3DRenderingContext(LayerType* layer) { - return Is3dSorted(layer) && LayerParent(layer) && - Is3dSorted(LayerParent(layer)) && - (SortingContextId(LayerParent(layer)) == SortingContextId(layer)); -} - -static inline bool IsRootForIsolatedGroup(Layer* layer) { - return layer->is_root_for_isolated_group(); -} - -static inline bool IsRootForIsolatedGroup(LayerImpl* layer) { - return false; -} - -static inline int NumDescendantsThatDrawContent(Layer* layer) { - return layer->NumDescendantsThatDrawContent(); -} - -static inline int NumLayerOrDescendantsThatDrawContentRecursive( - LayerImpl* layer) { - int num = layer->DrawsContent() ? 1 : 0; - for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) { - LayerImpl* child_layer = layer->test_properties()->children[i]; - num += NumLayerOrDescendantsThatDrawContentRecursive(child_layer); - } - return num; -} - -static inline int NumDescendantsThatDrawContent(LayerImpl* layer) { - int num_descendants_that_draw_content = 0; - for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) { - LayerImpl* child_layer = layer->test_properties()->children[i]; - num_descendants_that_draw_content += - NumLayerOrDescendantsThatDrawContentRecursive(child_layer); - } - return num_descendants_that_draw_content; -} - -static inline float EffectiveOpacity(Layer* layer) { - return layer->EffectiveOpacity(); -} - -static inline float EffectiveOpacity(LayerImpl* layer) { - return layer->test_properties()->hide_layer_and_subtree - ? 0.f - : layer->test_properties()->opacity; -} - -static inline float Opacity(Layer* layer) { - return layer->opacity(); -} - -static inline float Opacity(LayerImpl* layer) { - return layer->test_properties()->opacity; -} - -static inline SkBlendMode BlendMode(Layer* layer) { - return layer->blend_mode(); -} - -static inline SkBlendMode BlendMode(LayerImpl* layer) { - return layer->test_properties()->blend_mode; -} - -static inline const gfx::PointF FiltersOrigin(Layer* layer) { - return layer->filters_origin(); -} - -static inline const gfx::PointF FiltersOrigin(LayerImpl* layer) { - return layer->test_properties()->filters_origin; -} - -static inline const FilterOperations& BackdropFilters(Layer* layer) { - return layer->backdrop_filters(); -} - -static inline const FilterOperations& BackdropFilters(LayerImpl* layer) { - return layer->test_properties()->backdrop_filters; -} - -static inline const base::Optional<gfx::RRectF>& BackdropFilterBounds( - Layer* layer) { - return layer->backdrop_filter_bounds(); -} - -static inline const base::Optional<gfx::RRectF>& BackdropFilterBounds( - LayerImpl* layer) { - return layer->test_properties()->backdrop_filter_bounds; -} - -static inline ElementId BackdropMaskElementId(Layer* layer) { - return layer->backdrop_mask_element_id(); -} - -static inline ElementId BackdropMaskElementId(LayerImpl* layer) { - return layer->test_properties()->backdrop_mask_element_id; -} - -static inline float BackdropFilterQuality(Layer* layer) { - return layer->backdrop_filter_quality(); -} - -static inline float BackdropFilterQuality(LayerImpl* layer) { - return layer->test_properties()->backdrop_filter_quality; -} - -static inline bool HideLayerAndSubtree(Layer* layer) { - return layer->hide_layer_and_subtree(); -} - -static inline bool HideLayerAndSubtree(LayerImpl* layer) { - return layer->test_properties()->hide_layer_and_subtree; -} - -static inline bool HasCopyRequest(Layer* layer) { - return layer->HasCopyRequest(); -} - -static inline bool HasCopyRequest(LayerImpl* layer) { - return !layer->test_properties()->copy_requests.empty(); -} - -static inline int MirrorCount(Layer* layer) { - return layer->mirror_count(); -} - -static inline int MirrorCount(LayerImpl* layer) { - return 0; -} - -static inline bool PropertyChanged(Layer* layer) { - return layer->subtree_property_changed(); -} - -static inline bool PropertyChanged(LayerImpl* layer) { - return false; -} - -template <typename LayerType> RenderSurfaceReason ComputeRenderSurfaceReason(const MutatorHost& mutator_host, - LayerType* layer, + Layer* layer, gfx::Transform current_transform, bool animation_axis_aligned) { const bool preserves_2d_axis_alignment = current_transform.Preserves2dAxisAlignment() && animation_axis_aligned; - const bool is_root = !LayerParent(layer); + const bool is_root = !layer->parent(); if (is_root) return RenderSurfaceReason::kRoot; - // If the layer uses a mask. - if (MaskLayer(layer)) { + if (layer->IsMaskedByChild()) { return RenderSurfaceReason::kMask; } - // If the layer uses trilinear filtering. - if (TrilinearFiltering(layer)) { + if (layer->trilinear_filtering()) { return RenderSurfaceReason::kTrilinearFiltering; } - // If the layer uses a CSS filter. - if (!Filters(layer).IsEmpty()) { + if (!layer->filters().IsEmpty()) { return RenderSurfaceReason::kFilter; } - // If the layer uses a CSS backdrop-filter. - if (!BackdropFilters(layer).IsEmpty()) { + if (!layer->backdrop_filters().IsEmpty()) { return RenderSurfaceReason::kBackdropFilter; } @@ -733,16 +334,10 @@ RenderSurfaceReason ComputeRenderSurfaceReason(const MutatorHost& mutator_host, return RenderSurfaceReason::kFilterAnimation; } - int num_descendants_that_draw_content = NumDescendantsThatDrawContent(layer); - - // If the layer flattens its subtree, but it is treated as a 3D object by its - // parent (i.e. parent participates in a 3D rendering context). - if (LayerIsInExisting3DRenderingContext(layer) && - ShouldFlattenTransform(layer) && num_descendants_that_draw_content > 0) { - return RenderSurfaceReason::k3dTransformFlattening; - } + int num_descendants_that_draw_content = + layer->NumDescendantsThatDrawContent(); - if (!IsFastRoundedCorner(layer) && HasRoundedCorner(layer) && + if (!layer->is_fast_rounded_corner() && layer->HasRoundedCorner() && num_descendants_that_draw_content > 1) { return RenderSurfaceReason::kRoundedCorner; } @@ -751,7 +346,7 @@ RenderSurfaceReason ComputeRenderSurfaceReason(const MutatorHost& mutator_host, // TODO(rosca): this is temporary, until blending is implemented for other // types of quads than viz::RenderPassDrawQuad. Layers having descendants that // draw content will still create a separate rendering surface. - if (BlendMode(layer) != SkBlendMode::kSrcOver) { + if (layer->blend_mode() != SkBlendMode::kSrcOver) { return RenderSurfaceReason::kBlendMode; } // If the layer clips its descendants but it is not axis-aligned with respect @@ -772,94 +367,50 @@ RenderSurfaceReason ComputeRenderSurfaceReason(const MutatorHost& mutator_host, (layer->DrawsContent() || num_descendants_that_draw_content > 1); bool may_have_transparency = - EffectiveOpacity(layer) != 1.f || + layer->EffectiveOpacity() != 1.f || HasPotentiallyRunningOpacityAnimation(mutator_host, layer); - if (may_have_transparency && ShouldFlattenTransform(layer) && - at_least_two_layers_in_subtree_draw_content) { + if (may_have_transparency && at_least_two_layers_in_subtree_draw_content) { DCHECK(!is_root); return RenderSurfaceReason::kOpacity; } - // If the layer has isolation. - // TODO(rosca): to be optimized - create separate rendering surface only when - // the blending descendants might have access to the content behind this layer - // (layer has transparent background or descendants overflow). - // https://code.google.com/p/chromium/issues/detail?id=301738 - if (IsRootForIsolatedGroup(layer)) { - return RenderSurfaceReason::kRootOrIsolatedGroup; - } // If we force it. - if (ForceRenderSurfaceForTesting(layer)) + if (layer->force_render_surface_for_testing()) return RenderSurfaceReason::kTest; // If we cache it. - if (CacheRenderSurface(layer)) + if (layer->cache_render_surface()) return RenderSurfaceReason::kCache; // If we'll make a copy of the layer's contents. - if (HasCopyRequest(layer)) + if (layer->HasCopyRequest()) return RenderSurfaceReason::kCopyRequest; // If the layer is mirrored. - if (MirrorCount(layer)) + if (layer->mirror_count()) return RenderSurfaceReason::kMirrored; return RenderSurfaceReason::kNone; } -static void TakeCopyRequests( - Layer* layer, - std::vector<std::unique_ptr<viz::CopyOutputRequest>>* copy_requests) { - layer->TakeCopyRequests(copy_requests); -} - -static void TakeCopyRequests( - LayerImpl* layer, - std::vector<std::unique_ptr<viz::CopyOutputRequest>>* copy_requests) { - for (auto& request : layer->test_properties()->copy_requests) - copy_requests->push_back(std::move(request)); - layer->test_properties()->copy_requests.clear(); -} - -static void SetSubtreeHasCopyRequest(Layer* layer, - bool subtree_has_copy_request) { - layer->SetSubtreeHasCopyRequest(subtree_has_copy_request); -} - -static void SetSubtreeHasCopyRequest(LayerImpl* layer, - bool subtree_has_copy_request) { - layer->test_properties()->subtree_has_copy_request = subtree_has_copy_request; -} - -static bool SubtreeHasCopyRequest(Layer* layer) { - return layer->SubtreeHasCopyRequest(); -} - -static bool SubtreeHasCopyRequest(LayerImpl* layer) { - return layer->test_properties()->subtree_has_copy_request; -} - -template <typename LayerType> -bool UpdateSubtreeHasCopyRequestRecursive(LayerType* layer) { +bool UpdateSubtreeHasCopyRequestRecursive(Layer* layer) { bool subtree_has_copy_request = false; - if (HasCopyRequest(layer)) + if (layer->HasCopyRequest()) subtree_has_copy_request = true; - for (size_t i = 0; i < LayerChildren(layer).size(); ++i) { - LayerType* current_child = LayerChildAt(layer, i); + for (const scoped_refptr<Layer>& child : layer->children()) { subtree_has_copy_request |= - UpdateSubtreeHasCopyRequestRecursive(current_child); + UpdateSubtreeHasCopyRequestRecursive(child.get()); } - SetSubtreeHasCopyRequest(layer, subtree_has_copy_request); + layer->SetSubtreeHasCopyRequest(subtree_has_copy_request); return subtree_has_copy_request; } -template <typename LayerType> -bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( +bool PropertyTreeBuilderContext::AddEffectNodeIfNeeded( const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, DataForRecursion* data_for_children) const { - const bool is_root = !LayerParent(layer); - const bool has_transparency = EffectiveOpacity(layer) != 1.f; + const bool is_root = !layer->parent(); + const bool has_transparency = layer->EffectiveOpacity() != 1.f; const bool has_potential_opacity_animation = HasPotentialOpacityAnimation(mutator_host_, layer); const bool has_potential_filter_animation = @@ -867,7 +418,8 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( data_for_children->animation_axis_aligned_since_render_target &= AnimationsPreserveAxisAlignment(mutator_host_, layer); - data_for_children->compound_transform_since_render_target *= Transform(layer); + data_for_children->compound_transform_since_render_target *= + layer->transform(); auto render_surface_reason = ComputeRenderSurfaceReason( mutator_host_, layer, data_for_children->compound_transform_since_render_target, @@ -879,7 +431,7 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( data_from_ancestor.not_axis_aligned_since_last_clip ? true : !AnimationsPreserveAxisAlignment(mutator_host_, layer) || - !Transform(layer).Preserves2dAxisAlignment(); + !layer->transform().Preserves2dAxisAlignment(); // A non-axis aligned clip may need a render surface. So, we create an effect // node. bool has_non_axis_aligned_clip = @@ -888,7 +440,7 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( bool requires_node = is_root || has_transparency || has_potential_opacity_animation || has_potential_filter_animation || has_non_axis_aligned_clip || - should_create_render_surface || HasRoundedCorner(layer); + should_create_render_surface || layer->HasRoundedCorner(); int parent_id = data_from_ancestor.effect_tree_parent; @@ -902,55 +454,47 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( EffectNode* node = effect_tree_.back(); node->stable_id = layer->id(); - node->opacity = Opacity(layer); - node->blend_mode = BlendMode(layer); - node->unscaled_mask_target_size = layer->bounds(); - node->cache_render_surface = CacheRenderSurface(layer); - node->has_copy_request = HasCopyRequest(layer); - node->filters = Filters(layer); - node->backdrop_filters = BackdropFilters(layer); - node->backdrop_filter_bounds = BackdropFilterBounds(layer); - node->backdrop_filter_quality = BackdropFilterQuality(layer); - node->backdrop_mask_element_id = BackdropMaskElementId(layer); - node->filters_origin = FiltersOrigin(layer); - node->trilinear_filtering = TrilinearFiltering(layer); + node->opacity = layer->opacity(); + node->blend_mode = layer->blend_mode(); + node->cache_render_surface = layer->cache_render_surface(); + node->has_copy_request = layer->HasCopyRequest(); + node->filters = layer->filters(); + node->backdrop_filters = layer->backdrop_filters(); + node->backdrop_filter_bounds = layer->backdrop_filter_bounds(); + node->backdrop_filter_quality = layer->backdrop_filter_quality(); + node->filters_origin = layer->filters_origin(); + node->trilinear_filtering = layer->trilinear_filtering(); node->has_potential_opacity_animation = has_potential_opacity_animation; node->has_potential_filter_animation = has_potential_filter_animation; - node->double_sided = DoubleSided(layer); - node->subtree_hidden = HideLayerAndSubtree(layer); + node->double_sided = layer->double_sided(); + node->subtree_hidden = layer->hide_layer_and_subtree(); node->is_currently_animating_opacity = OpacityIsAnimating(mutator_host_, layer); node->is_currently_animating_filter = FilterIsAnimating(mutator_host_, layer); - node->effect_changed = PropertyChanged(layer); - node->subtree_has_copy_request = SubtreeHasCopyRequest(layer); + node->effect_changed = layer->subtree_property_changed(); + node->subtree_has_copy_request = layer->SubtreeHasCopyRequest(); node->render_surface_reason = render_surface_reason; node->closest_ancestor_with_cached_render_surface_id = - CacheRenderSurface(layer) + layer->cache_render_surface() ? node_id : data_from_ancestor.closest_ancestor_with_cached_render_surface; node->closest_ancestor_with_copy_request_id = - HasCopyRequest(layer) + layer->HasCopyRequest() ? node_id : data_from_ancestor.closest_ancestor_with_copy_request; - if (MaskLayer(layer)) { - node->mask_layer_id = MaskLayer(layer)->id(); - effect_tree_.AddMaskLayerId(node->mask_layer_id); - node->is_masked = true; - } - - if (HasRoundedCorner(layer)) { + if (layer->HasRoundedCorner()) { // This is currently in the local space of the layer and hence in an invalid // space. Once we have the associated transform node for this effect node, // we will update this to the transform node's coordinate space. node->rounded_corner_bounds = RoundedCornerBounds(layer); - node->is_fast_rounded_corner = IsFastRoundedCorner(layer); + node->is_fast_rounded_corner = layer->is_fast_rounded_corner(); } if (!is_root) { // Having a rounded corner or a render surface, both trigger the creation // of a transform node. - if (should_create_render_surface || HasRoundedCorner(layer)) { + if (should_create_render_surface || layer->HasRoundedCorner()) { // In this case, we will create a transform node, so it's safe to use the // next available id from the transform tree as this effect node's // transform id. @@ -958,12 +502,11 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( } node->clip_id = data_from_ancestor.clip_tree_parent; } else { - // The root render surface acts as the unbounded and untransformed - // surface into which content is drawn. The transform node created - // from the root layer (which includes device scale factor) and - // the clip node created from the root layer (which includes - // viewports) apply to the root render surface's content, but not - // to the root render surface itself. + // The root render surface acts as the unbounded and untransformed surface + // into which content is drawn. The transform node created from the root + // layer (which includes device scale factor) and the clip node created from + // the root layer apply to the root render surface's content, but not to the + // root render surface itself. node->transform_id = TransformTree::kRootNodeId; node->clip_id = ClipTree::kViewportNodeId; } @@ -983,7 +526,7 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( } std::vector<std::unique_ptr<viz::CopyOutputRequest>> layer_copy_requests; - TakeCopyRequests(layer, &layer_copy_requests); + layer->TakeCopyRequests(&layer_copy_requests); for (auto& it : layer_copy_requests) { effect_tree_.AddCopyRequest(node_id, std::move(it)); } @@ -997,8 +540,7 @@ bool PropertyTreeBuilderContext<LayerType>::AddEffectNodeIfNeeded( return should_create_render_surface; } -template <typename LayerType> -bool PropertyTreeBuilderContext<LayerType>::UpdateRenderSurfaceIfNeeded( +bool PropertyTreeBuilderContext::UpdateRenderSurfaceIfNeeded( int parent_effect_tree_id, DataForRecursion* data_for_children, bool subtree_has_rounded_corner, @@ -1039,70 +581,19 @@ bool PropertyTreeBuilderContext<LayerType>::UpdateRenderSurfaceIfNeeded( return effect_node->HasRenderSurface(); } -static inline bool UserScrollableHorizontal(Layer* layer) { - return layer->GetUserScrollableHorizontal(); -} - -static inline bool UserScrollableHorizontal(LayerImpl* layer) { - return layer->test_properties()->user_scrollable_horizontal; -} - -static inline bool UserScrollableVertical(Layer* layer) { - return layer->GetUserScrollableVertical(); -} - -static inline bool UserScrollableVertical(LayerImpl* layer) { - return layer->test_properties()->user_scrollable_vertical; -} - -static inline const base::Optional<SnapContainerData>& GetSnapContainerData( - Layer* layer) { - return layer->snap_container_data(); -} - -static inline const base::Optional<SnapContainerData>& GetSnapContainerData( - LayerImpl* layer) { - return layer->test_properties()->snap_container_data; -} - -static inline uint32_t MainThreadScrollingReasons(Layer* layer) { - return layer->GetMainThreadScrollingReasons(); -} - -static inline uint32_t MainThreadScrollingReasons(LayerImpl* layer) { - return layer->test_properties()->main_thread_scrolling_reasons; -} - -template <typename LayerType> -void SetHasTransformNode(LayerType* layer, bool val) { - layer->SetHasTransformNode(val); -} - -template <typename LayerType> -void PropertyTreeBuilderContext<LayerType>::AddScrollNodeIfNeeded( +void PropertyTreeBuilderContext::AddScrollNodeIfNeeded( const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, DataForRecursion* data_for_children) const { int parent_id = data_from_ancestor.scroll_tree_parent; - bool is_root = !LayerParent(layer); + bool is_root = !layer->parent(); bool scrollable = layer->scrollable(); bool contains_non_fast_scrollable_region = !layer->non_fast_scrollable_region().IsEmpty(); - uint32_t main_thread_scrolling_reasons = MainThreadScrollingReasons(layer); - bool scroll_node_uninheritable_criteria = - is_root || scrollable || contains_non_fast_scrollable_region; - bool has_different_main_thread_scrolling_reasons = - main_thread_scrolling_reasons != - data_from_ancestor.main_thread_scrolling_reasons; bool requires_node = - scroll_node_uninheritable_criteria || - (main_thread_scrolling_reasons != - MainThreadScrollingReason::kNotScrollingOnMain && - (has_different_main_thread_scrolling_reasons || - data_from_ancestor - .scroll_tree_parent_created_by_uninheritable_criteria)); + is_root || scrollable || contains_non_fast_scrollable_region; int node_id; if (!requires_node) { @@ -1111,32 +602,17 @@ void PropertyTreeBuilderContext<LayerType>::AddScrollNodeIfNeeded( } else { ScrollNode node; node.scrollable = scrollable; - node.main_thread_scrolling_reasons = main_thread_scrolling_reasons; - node.scrolls_inner_viewport = layer == inner_viewport_scroll_layer_; - node.scrolls_outer_viewport = layer == outer_viewport_scroll_layer_; - - if (node.scrolls_inner_viewport && - data_from_ancestor.in_subtree_of_page_scale_layer) { - node.max_scroll_offset_affected_by_page_scale = true; - } - node.bounds = layer->bounds(); node.container_bounds = layer->scroll_container_bounds(); node.offset_to_transform_parent = layer->offset_to_transform_parent(); - node.should_flatten = - layer->should_flatten_screen_space_transform_from_property_tree(); - node.user_scrollable_horizontal = UserScrollableHorizontal(layer); - node.user_scrollable_vertical = UserScrollableVertical(layer); + node.user_scrollable_horizontal = layer->GetUserScrollableHorizontal(); + node.user_scrollable_vertical = layer->GetUserScrollableVertical(); node.element_id = layer->element_id(); node.transform_id = data_for_children->transform_tree_parent; - node.snap_container_data = GetSnapContainerData(layer); node_id = scroll_tree_.Insert(node, parent_id); data_for_children->scroll_tree_parent = node_id; - data_for_children->main_thread_scrolling_reasons = - node.main_thread_scrolling_reasons; - data_for_children->scroll_tree_parent_created_by_uninheritable_criteria = - scroll_node_uninheritable_criteria; + // For animation subsystem purposes, if this layer has a compositor element // id, we build a map from that id to this scroll node. if (layer->element_id()) { @@ -1153,28 +629,24 @@ void PropertyTreeBuilderContext<LayerType>::AddScrollNodeIfNeeded( layer->SetScrollTreeIndex(node_id); } -template <typename LayerType> -void SetBackfaceVisibilityTransform(LayerType* layer, - bool created_transform_node) { +void SetBackfaceVisibilityTransform(Layer* layer, bool created_transform_node) { if (layer->use_parent_backface_visibility()) { - DCHECK(LayerParent(layer)); - DCHECK(!LayerParent(layer)->use_parent_backface_visibility()); + DCHECK(layer->parent()); + DCHECK(!layer->parent()->use_parent_backface_visibility()); layer->SetShouldCheckBackfaceVisibility( - LayerParent(layer)->should_check_backface_visibility()); + layer->parent()->should_check_backface_visibility()); } else { // A double-sided layer's backface can been shown when its visible. // In addition, we need to check if (1) there might be a local 3D transform // on the layer that might turn it to the backface, or (2) it is not drawn // into a flattened space. - layer->SetShouldCheckBackfaceVisibility( - !DoubleSided(layer) && (created_transform_node || - !ShouldFlattenTransform(LayerParent(layer)))); + layer->SetShouldCheckBackfaceVisibility(!layer->double_sided() && + created_transform_node); } } -template <typename LayerType> void SetSafeOpaqueBackgroundColor(const DataForRecursion& data_from_ancestor, - LayerType* layer, + Layer* layer, DataForRecursion* data_for_children) { SkColor background_color = layer->background_color(); data_for_children->safe_opaque_background_color = @@ -1185,17 +657,8 @@ void SetSafeOpaqueBackgroundColor(const DataForRecursion& data_from_ancestor, data_for_children->safe_opaque_background_color); } -static void SetLayerPropertyChangedForChild(Layer* parent, Layer* child) { - if (parent->subtree_property_changed()) - child->SetSubtreePropertyChanged(); -} - -static void SetLayerPropertyChangedForChild(LayerImpl* parent, - LayerImpl* child) {} - -template <typename LayerType> -void PropertyTreeBuilderContext<LayerType>::BuildPropertyTreesInternal( - LayerType* layer, +void PropertyTreeBuilderContext::BuildPropertyTreesInternal( + Layer* layer, const DataForRecursion& data_from_parent) const { layer->set_property_tree_sequence_number(property_trees_.sequence_number); @@ -1207,7 +670,7 @@ void PropertyTreeBuilderContext<LayerType>::BuildPropertyTreesInternal( bool created_transform_node = AddTransformNodeIfNeeded( data_from_parent, layer, created_render_surface, &data_for_children); - SetHasTransformNode(layer, created_transform_node); + layer->SetHasTransformNode(created_transform_node); AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node, &data_for_children); @@ -1220,78 +683,40 @@ void PropertyTreeBuilderContext<LayerType>::BuildPropertyTreesInternal( data_from_parent.not_axis_aligned_since_last_clip ? true : !AnimationsPreserveAxisAlignment(mutator_host_, layer) || - !Transform(layer).Preserves2dAxisAlignment(); + !layer->transform().Preserves2dAxisAlignment(); bool has_non_axis_aligned_clip = not_axis_aligned_since_last_clip && LayerClipsSubtree(layer); data_for_children.not_axis_aligned_since_last_clip = !has_non_axis_aligned_clip; bool subtree_has_rounded_corner = false; - for (size_t i = 0; i < LayerChildren(layer).size(); ++i) { - LayerType* current_child = LayerChildAt(layer, i); - SetLayerPropertyChangedForChild(layer, current_child); - BuildPropertyTreesInternal(current_child, data_for_children); + for (const scoped_refptr<Layer>& child : layer->children()) { + if (layer->subtree_property_changed()) + child->SetSubtreePropertyChanged(); + BuildPropertyTreesInternal(child.get(), data_for_children); subtree_has_rounded_corner |= *data_for_children.subtree_has_rounded_corner; } created_render_surface = UpdateRenderSurfaceIfNeeded( data_from_parent.effect_tree_parent, &data_for_children, subtree_has_rounded_corner, created_transform_node); - - if (MaskLayer(layer)) { - MaskLayer(layer)->set_property_tree_sequence_number( - property_trees_.sequence_number); - MaskLayer(layer)->SetOffsetToTransformParent( - layer->offset_to_transform_parent()); - MaskLayer(layer)->SetTransformTreeIndex(layer->transform_tree_index()); - MaskLayer(layer)->SetClipTreeIndex(layer->clip_tree_index()); - MaskLayer(layer)->SetEffectTreeIndex(layer->effect_tree_index()); - MaskLayer(layer)->SetScrollTreeIndex(layer->scroll_tree_index()); - } } -} // namespace - -Layer* PropertyTreeBuilder::FindFirstScrollableLayer(Layer* layer) { - if (!layer) - return nullptr; - - if (layer->scrollable()) - return layer; +void PropertyTreeBuilderContext::BuildPropertyTrees() { + property_trees_.is_main_thread = true; + property_trees_.is_active = false; - for (size_t i = 0; i < layer->children().size(); ++i) { - Layer* found = FindFirstScrollableLayer(layer->children()[i].get()); - if (found) - return found; - } - - return nullptr; -} + if (layer_tree_host_->has_copy_request()) + UpdateSubtreeHasCopyRequestRecursive(root_layer_); -template <typename LayerType> -void PropertyTreeBuilderContext<LayerType>::BuildPropertyTrees( - float device_scale_factor, - const gfx::Rect& viewport, - SkColor root_background_color) const { if (!property_trees_.needs_rebuild) { - DCHECK_NE(page_scale_layer_, root_layer_); - if (page_scale_layer_) { - DCHECK_GE(page_scale_layer_->transform_tree_index(), - TransformTree::kRootNodeId); - TransformNode* node = property_trees_.transform_tree.Node( - page_scale_layer_->transform_tree_index()); - draw_property_utils::UpdatePageScaleFactor(&property_trees_, node, - page_scale_factor_); - } - draw_property_utils::UpdateElasticOverscroll( - &property_trees_, overscroll_elasticity_element_id_, - elastic_overscroll_); - clip_tree_.SetViewportClip(gfx::RectF(viewport)); + clip_tree_.SetViewportClip( + gfx::RectF(layer_tree_host_->device_viewport_rect())); // SetRootScaleAndTransform will be incorrect if the root layer has // non-zero position, so ensure it is zero. - DCHECK(Position(root_layer_).IsOrigin()); - transform_tree_.SetRootScaleAndTransform(device_scale_factor, - device_transform_); + DCHECK(root_layer_->position().IsOrigin()); + transform_tree_.SetRootScaleAndTransform( + layer_tree_host_->device_scale_factor(), gfx::Transform()); return; } @@ -1304,23 +729,21 @@ void PropertyTreeBuilderContext<LayerType>::BuildPropertyTrees( EffectTree::kInvalidNodeId; data_for_recursion.closest_ancestor_with_copy_request = EffectTree::kInvalidNodeId; - data_for_recursion.in_subtree_of_page_scale_layer = false; - data_for_recursion.affected_by_outer_viewport_bounds_delta = false; - data_for_recursion.should_flatten = false; - data_for_recursion.main_thread_scrolling_reasons = - MainThreadScrollingReason::kNotScrollingOnMain; - data_for_recursion.scroll_tree_parent_created_by_uninheritable_criteria = - true; data_for_recursion.compound_transform_since_render_target = gfx::Transform(); data_for_recursion.animation_axis_aligned_since_render_target = true; data_for_recursion.not_axis_aligned_since_last_clip = false; + + SkColor root_background_color = layer_tree_host_->background_color(); + if (SkColorGetA(root_background_color) != 255) + root_background_color = SkColorSetA(root_background_color, 255); data_for_recursion.safe_opaque_background_color = root_background_color; property_trees_.clear(); - transform_tree_.set_device_scale_factor(device_scale_factor); + transform_tree_.set_device_scale_factor( + layer_tree_host_->device_scale_factor()); ClipNode root_clip; root_clip.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP; - root_clip.clip = gfx::RectF(viewport); + root_clip.clip = gfx::RectF(layer_tree_host_->device_viewport_rect()); root_clip.transform_id = TransformTree::kRootNodeId; data_for_recursion.clip_tree_parent = clip_tree_.Insert(root_clip, ClipTree::kRootNodeId); @@ -1340,70 +763,17 @@ void PropertyTreeBuilderContext<LayerType>::BuildPropertyTrees( scroll_tree_.set_needs_update(false); } -void PropertyTreeBuilder::BuildPropertyTrees( - Layer* root_layer, - const Layer* page_scale_layer, - const Layer* inner_viewport_scroll_layer, - const Layer* outer_viewport_scroll_layer, - const ElementId overscroll_elasticity_element_id, - const gfx::Vector2dF& elastic_overscroll, - float page_scale_factor, - float device_scale_factor, - const gfx::Rect& viewport, - const gfx::Transform& device_transform, - PropertyTrees* property_trees) { - property_trees->is_main_thread = true; - property_trees->is_active = false; - SkColor color = root_layer->layer_tree_host()->background_color(); - if (SkColorGetA(color) != 255) - color = SkColorSetA(color, 255); - if (root_layer->layer_tree_host()->has_copy_request()) - UpdateSubtreeHasCopyRequestRecursive(root_layer); - PropertyTreeBuilderContext<Layer>( - root_layer, page_scale_layer, inner_viewport_scroll_layer, - outer_viewport_scroll_layer, overscroll_elasticity_element_id, - elastic_overscroll, page_scale_factor, device_transform, - root_layer->layer_tree_host()->mutator_host(), property_trees) - .BuildPropertyTrees(device_scale_factor, viewport, color); - property_trees->ResetCachedData(); +} // namespace + +void PropertyTreeBuilder::BuildPropertyTrees(LayerTreeHost* layer_tree_host) { + PropertyTreeBuilderContext(layer_tree_host).BuildPropertyTrees(); + + layer_tree_host->property_trees()->ResetCachedData(); // During building property trees, all copy requests are moved from layers to // effect tree, which are then pushed at commit to compositor thread and // handled there. LayerTreeHost::has_copy_request is only required to // decide if we want to create a effect node. So, it can be reset now. - root_layer->layer_tree_host()->SetHasCopyRequest(false); -} - -void PropertyTreeBuilder::BuildPropertyTrees( - LayerImpl* root_layer, - const LayerImpl* page_scale_layer, - const LayerImpl* inner_viewport_scroll_layer, - const LayerImpl* outer_viewport_scroll_layer, - const ElementId overscroll_elasticity_element_id, - const gfx::Vector2dF& elastic_overscroll, - float page_scale_factor, - float device_scale_factor, - const gfx::Rect& viewport, - const gfx::Transform& device_transform, - PropertyTrees* property_trees) { - // Preserve render surfaces when rebuilding. - std::vector<std::unique_ptr<RenderSurfaceImpl>> render_surfaces; - property_trees->effect_tree.TakeRenderSurfaces(&render_surfaces); - property_trees->is_main_thread = false; - property_trees->is_active = root_layer->IsActive(); - SkColor color = root_layer->layer_tree_impl()->background_color(); - if (SkColorGetA(color) != 255) - color = SkColorSetA(color, 255); - UpdateSubtreeHasCopyRequestRecursive(root_layer); - - PropertyTreeBuilderContext<LayerImpl>( - root_layer, page_scale_layer, inner_viewport_scroll_layer, - outer_viewport_scroll_layer, overscroll_elasticity_element_id, - elastic_overscroll, page_scale_factor, device_transform, - root_layer->layer_tree_impl()->mutator_host(), property_trees) - .BuildPropertyTrees(device_scale_factor, viewport, color); - property_trees->effect_tree.CreateOrReuseRenderSurfaces( - &render_surfaces, root_layer->layer_tree_impl()); - property_trees->ResetCachedData(); + layer_tree_host->SetHasCopyRequest(false); } } // namespace cc |