| Index: cc/trees/draw_property_utils.cc
|
| diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
|
| index 85d73a5e71de2778a62e119f9a56501d08c80a60..0677b6088fba2ae22f7ebffee0db820f10ee9572 100644
|
| --- a/cc/trees/draw_property_utils.cc
|
| +++ b/cc/trees/draw_property_utils.cc
|
| @@ -35,6 +35,18 @@ static bool IsRootLayer(const LayerImpl* layer) {
|
| return layer->layer_tree_impl()->IsRootLayer(layer);
|
| }
|
|
|
| +static void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
|
| + gfx::Transform* transform) {
|
| + if (!effect_node) {
|
| + // This can happen when PaintArtifactCompositor builds property trees as it
|
| + // doesn't set effect ids on clip nodes.
|
| + return;
|
| + }
|
| + DCHECK(effect_node->has_render_surface);
|
| + transform->matrix().postScale(effect_node->surface_contents_scale.x(),
|
| + effect_node->surface_contents_scale.y(), 1.f);
|
| +}
|
| +
|
| static bool ConvertRectBetweenSurfaceSpaces(const PropertyTrees* property_trees,
|
| int source_effect_id,
|
| int dest_effect_id,
|
| @@ -404,10 +416,6 @@ static bool LayerNeedsUpdateInternal(LayerType* layer,
|
| return true;
|
| }
|
|
|
| -
|
| -
|
| -} // namespace
|
| -
|
| template <typename LayerType>
|
| static inline bool LayerShouldBeSkippedInternal(
|
| LayerType* layer,
|
| @@ -428,182 +436,173 @@ static inline bool LayerShouldBeSkippedInternal(
|
| effect_node->hidden_by_backface_visibility || !effect_node->is_drawn;
|
| }
|
|
|
| -bool LayerShouldBeSkipped(LayerImpl* layer,
|
| - const TransformTree& transform_tree,
|
| - const EffectTree& effect_tree) {
|
| - return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
|
| +template <typename LayerType>
|
| +static void UpdateElasticOverscrollInternal(
|
| + PropertyTrees* property_trees,
|
| + const LayerType* overscroll_elasticity_layer,
|
| + const gfx::Vector2dF& elastic_overscroll) {
|
| + if (!overscroll_elasticity_layer) {
|
| + DCHECK(elastic_overscroll.IsZero());
|
| + return;
|
| + }
|
| +
|
| + TransformNode* node = property_trees->transform_tree.Node(
|
| + overscroll_elasticity_layer->transform_tree_index());
|
| + if (node->scroll_offset == gfx::ScrollOffset(elastic_overscroll))
|
| + return;
|
| +
|
| + node->scroll_offset = gfx::ScrollOffset(elastic_overscroll);
|
| + node->needs_local_transform_update = true;
|
| + property_trees->transform_tree.set_needs_update(true);
|
| }
|
|
|
| -bool LayerShouldBeSkipped(Layer* layer,
|
| - const TransformTree& transform_tree,
|
| - const EffectTree& effect_tree) {
|
| - return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
|
| +#if DCHECK_IS_ON()
|
| +static void ValidatePageScaleLayer(const Layer* page_scale_layer) {
|
| + DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString());
|
| + DCHECK_EQ(page_scale_layer->transform_origin().ToString(),
|
| + gfx::Point3F().ToString());
|
| }
|
|
|
| -void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
|
| - const PropertyTrees* property_trees,
|
| - LayerList* update_layer_list) {
|
| - const TransformTree& transform_tree = property_trees->transform_tree;
|
| - const EffectTree& effect_tree = property_trees->effect_tree;
|
| - for (auto* layer : *layer_tree_host) {
|
| - if (!IsRootLayer(layer) &&
|
| - LayerShouldBeSkipped(layer, transform_tree, effect_tree))
|
| - continue;
|
| +static void ValidatePageScaleLayer(const LayerImpl* page_scale_layer) {}
|
| +#endif
|
|
|
| - bool layer_is_drawn =
|
| - effect_tree.Node(layer->effect_tree_index())->is_drawn;
|
| +template <typename LayerType>
|
| +static void UpdatePageScaleFactorInternal(PropertyTrees* property_trees,
|
| + const LayerType* page_scale_layer,
|
| + float page_scale_factor,
|
| + float device_scale_factor,
|
| + gfx::Transform device_transform) {
|
| + if (property_trees->transform_tree.page_scale_factor() == page_scale_factor)
|
| + return;
|
|
|
| - if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) {
|
| - update_layer_list->push_back(layer);
|
| - }
|
| + property_trees->transform_tree.set_page_scale_factor(page_scale_factor);
|
| + DCHECK(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());
|
| +// TODO(enne): property trees can't ask the layer these things, but
|
| +// the page scale layer should *just* be the page scale.
|
| +#if DCHECK_IS_ON()
|
| + ValidatePageScaleLayer(page_scale_layer);
|
| +#endif
|
|
|
| - // Append mask layers to the update layer list. They don't have valid
|
| - // visible rects, so need to get added after the above calculation.
|
| - if (Layer* mask_layer = layer->mask_layer())
|
| - update_layer_list->push_back(mask_layer);
|
| + if (IsRootLayer(page_scale_layer)) {
|
| + // When the page scale layer is also the root layer, the node should also
|
| + // store the combined scale factor and not just the page scale factor.
|
| + float post_local_scale_factor = page_scale_factor * device_scale_factor;
|
| + node->post_local_scale_factor = post_local_scale_factor;
|
| + node->post_local = device_transform;
|
| + node->post_local.Scale(post_local_scale_factor, post_local_scale_factor);
|
| + } else {
|
| + node->post_local_scale_factor = page_scale_factor;
|
| + node->update_post_local_transform(gfx::PointF(), gfx::Point3F());
|
| }
|
| + node->needs_local_transform_update = true;
|
| + property_trees->transform_tree.set_needs_update(true);
|
| }
|
|
|
| -void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
|
| - const PropertyTrees* property_trees,
|
| - std::vector<LayerImpl*>* visible_layer_list) {
|
| - const TransformTree& transform_tree = property_trees->transform_tree;
|
| - const EffectTree& effect_tree = property_trees->effect_tree;
|
| -
|
| - for (auto* layer_impl : *layer_tree_impl) {
|
| - if (!IsRootLayer(layer_impl) &&
|
| - LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree))
|
| - continue;
|
| +static gfx::Rect LayerDrawableContentRect(
|
| + const LayerImpl* layer,
|
| + const gfx::Rect& layer_bounds_in_target_space,
|
| + const gfx::Rect& clip_rect) {
|
| + if (layer->is_clipped())
|
| + return IntersectRects(layer_bounds_in_target_space, clip_rect);
|
|
|
| - bool layer_is_drawn =
|
| - effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
|
| + return layer_bounds_in_target_space;
|
| +}
|
|
|
| - if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
|
| - visible_layer_list->push_back(layer_impl);
|
| +static void SetSurfaceDrawOpacity(const EffectTree& tree,
|
| + RenderSurfaceImpl* render_surface) {
|
| + // Draw opacity of a surface is the product of opacities between the surface
|
| + // (included) and its target surface (excluded).
|
| + const EffectNode* node = tree.Node(render_surface->EffectTreeIndex());
|
| + float draw_opacity = tree.EffectiveOpacity(node);
|
| + for (node = tree.parent(node); node && !node->has_render_surface;
|
| + node = tree.parent(node)) {
|
| + draw_opacity *= tree.EffectiveOpacity(node);
|
| }
|
| + render_surface->SetDrawOpacity(draw_opacity);
|
| }
|
|
|
| -void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
|
| - gfx::Transform* transform) {
|
| - if (!effect_node) {
|
| - // This can happen when PaintArtifactCompositor builds property trees as it
|
| - // doesn't set effect ids on clip nodes.
|
| - return;
|
| +static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) {
|
| + if (!layer->render_target())
|
| + return 0.f;
|
| +
|
| + const EffectNode* target_node =
|
| + tree.Node(layer->render_target()->EffectTreeIndex());
|
| + const EffectNode* node = tree.Node(layer->effect_tree_index());
|
| + if (node == target_node)
|
| + return 1.f;
|
| +
|
| + float draw_opacity = 1.f;
|
| + while (node != target_node) {
|
| + draw_opacity *= tree.EffectiveOpacity(node);
|
| + node = tree.parent(node);
|
| }
|
| - DCHECK(effect_node->has_render_surface);
|
| - transform->matrix().postScale(effect_node->surface_contents_scale.x(),
|
| - effect_node->surface_contents_scale.y(), 1.f);
|
| + return draw_opacity;
|
| }
|
|
|
| -void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
|
| - gfx::Transform* transform) {
|
| - DCHECK(effect_node->has_render_surface);
|
| - if (effect_node->surface_contents_scale.x() != 0.0 &&
|
| - effect_node->surface_contents_scale.y() != 0.0)
|
| - transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
|
| - 1.0 / effect_node->surface_contents_scale.y());
|
| +template <typename LayerType>
|
| +static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
|
| + const TransformTree& tree) {
|
| + gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
|
| + layer->offset_to_transform_parent().y());
|
| + gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
|
| + xform.ConcatTransform(ssxform);
|
| + if (layer->should_flatten_transform_from_property_tree())
|
| + xform.FlattenTo2d();
|
| + return xform;
|
| }
|
|
|
| -void UpdateScrollTree(ScrollTree* scroll_tree,
|
| - const LayerTreeHost* layer_tree_host) {
|
| - if (!scroll_tree->needs_update())
|
| +static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
|
| + PropertyTrees* property_trees,
|
| + RenderSurfaceImpl* render_surface) {
|
| + if (!render_surface->is_clipped()) {
|
| + render_surface->SetClipRect(gfx::Rect());
|
| return;
|
| + }
|
|
|
| - for (int i = ScrollTree::kRootNodeId;
|
| - i < static_cast<int>(scroll_tree->size()); ++i) {
|
| - ScrollNode* scroll_node = scroll_tree->Node(i);
|
| - if (Layer* scroll_layer =
|
| - layer_tree_host->LayerById(scroll_node->owning_layer_id)) {
|
| - if (Layer* scroll_clip_layer = scroll_layer->scroll_clip_layer()) {
|
| - scroll_node->scroll_clip_layer_bounds = scroll_clip_layer->bounds();
|
| - }
|
| - }
|
| + const EffectTree& effect_tree = property_trees->effect_tree;
|
| + const ClipTree& clip_tree = property_trees->clip_tree;
|
| + const EffectNode* effect_node =
|
| + effect_tree.Node(render_surface->EffectTreeIndex());
|
| + const EffectNode* target_node = effect_tree.Node(effect_node->target_id);
|
| + bool include_expanding_clips = false;
|
| + if (render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId) {
|
| + render_surface->SetClipRect(
|
| + gfx::ToEnclosingRect(clip_tree.Node(effect_node->clip_id)->clip));
|
| + } else {
|
| + ConditionalClip accumulated_clip_rect =
|
| + ComputeAccumulatedClip(property_trees, include_expanding_clips,
|
| + effect_node->clip_id, target_node->id);
|
| + render_surface->SetClipRect(
|
| + gfx::ToEnclosingRect(accumulated_clip_rect.clip_rect));
|
| }
|
| }
|
|
|
| -void ComputeTransforms(TransformTree* transform_tree) {
|
| - if (!transform_tree->needs_update())
|
| +static void SetSurfaceDrawTransform(const PropertyTrees* property_trees,
|
| + RenderSurfaceImpl* render_surface) {
|
| + const TransformTree& transform_tree = property_trees->transform_tree;
|
| + const EffectTree& effect_tree = property_trees->effect_tree;
|
| + const TransformNode* transform_node =
|
| + transform_tree.Node(render_surface->TransformTreeIndex());
|
| + const EffectNode* effect_node =
|
| + effect_tree.Node(render_surface->EffectTreeIndex());
|
| + // The draw transform of root render surface is identity tranform.
|
| + if (transform_node->id == TransformTree::kRootNodeId) {
|
| + render_surface->SetDrawTransform(gfx::Transform());
|
| return;
|
| - for (int i = TransformTree::kContentsRootNodeId;
|
| - i < static_cast<int>(transform_tree->size()); ++i)
|
| - transform_tree->UpdateTransforms(i);
|
| - transform_tree->set_needs_update(false);
|
| -}
|
| -
|
| -void UpdateRenderTarget(EffectTree* effect_tree,
|
| - bool can_render_to_separate_surface) {
|
| - for (int i = EffectTree::kContentsRootNodeId;
|
| - i < static_cast<int>(effect_tree->size()); ++i) {
|
| - EffectNode* node = effect_tree->Node(i);
|
| - if (i == EffectTree::kContentsRootNodeId) {
|
| - // Render target of the node corresponding to root is itself.
|
| - node->target_id = EffectTree::kContentsRootNodeId;
|
| - } else if (!can_render_to_separate_surface) {
|
| - node->target_id = EffectTree::kContentsRootNodeId;
|
| - } else if (effect_tree->parent(node)->has_render_surface) {
|
| - node->target_id = node->parent_id;
|
| - } else {
|
| - node->target_id = effect_tree->parent(node)->target_id;
|
| - }
|
| }
|
| -}
|
|
|
| -void ComputeEffects(EffectTree* effect_tree) {
|
| - if (!effect_tree->needs_update())
|
| - return;
|
| - for (int i = EffectTree::kContentsRootNodeId;
|
| - i < static_cast<int>(effect_tree->size()); ++i)
|
| - effect_tree->UpdateEffects(i);
|
| - effect_tree->set_needs_update(false);
|
| -}
|
| -
|
| -void ComputeClips(PropertyTrees* property_trees) {
|
| - DCHECK(!property_trees->transform_tree.needs_update());
|
| - ClipTree* clip_tree = &property_trees->clip_tree;
|
| - if (!clip_tree->needs_update())
|
| - return;
|
| - const int target_effect_id = EffectTree::kContentsRootNodeId;
|
| - const int target_transform_id = TransformTree::kRootNodeId;
|
| - const bool include_expanding_clips = true;
|
| - for (int i = ClipTree::kViewportNodeId;
|
| - i < static_cast<int>(clip_tree->size()); ++i) {
|
| - ClipNode* clip_node = clip_tree->Node(i);
|
| - // Clear the clip rect cache
|
| - clip_node->cached_clip_rects = std::vector<ClipRectData>(1);
|
| - if (clip_node->id == ClipTree::kViewportNodeId) {
|
| - clip_node->cached_accumulated_rect_in_screen_space = clip_node->clip;
|
| - continue;
|
| - }
|
| - ClipNode* parent_clip_node = clip_tree->parent(clip_node);
|
| - DCHECK(parent_clip_node);
|
| - gfx::RectF accumulated_clip =
|
| - parent_clip_node->cached_accumulated_rect_in_screen_space;
|
| - bool success = ApplyClipNodeToAccumulatedClip(
|
| - property_trees, include_expanding_clips, target_effect_id,
|
| - target_transform_id, clip_node, &accumulated_clip);
|
| - DCHECK(success);
|
| - clip_node->cached_accumulated_rect_in_screen_space = accumulated_clip;
|
| - }
|
| - clip_tree->set_needs_update(false);
|
| -}
|
| -
|
| -static ConditionalClip LayerClipRect(PropertyTrees* property_trees,
|
| - LayerImpl* layer) {
|
| - const EffectTree* effect_tree = &property_trees->effect_tree;
|
| - const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
|
| - const EffectNode* target_node =
|
| - effect_node->has_render_surface
|
| - ? effect_node
|
| - : effect_tree->Node(effect_node->target_id);
|
| - // TODO(weiliangc): When effect node has up to date render surface info on
|
| - // compositor thread, no need to check for resourceless draw mode
|
| - if (!property_trees->non_root_surfaces_enabled) {
|
| - target_node = effect_tree->Node(1);
|
| - }
|
| -
|
| - bool include_expanding_clips = false;
|
| - return ComputeAccumulatedClip(property_trees, include_expanding_clips,
|
| - layer->clip_tree_index(), target_node->id);
|
| + gfx::Transform render_surface_transform;
|
| + const EffectNode* target_effect_node =
|
| + effect_tree.Node(effect_node->target_id);
|
| + property_trees->GetToTarget(transform_node->id, target_effect_node->id,
|
| + &render_surface_transform);
|
| +
|
| + ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
|
| + render_surface->SetDrawTransform(render_surface_transform);
|
| }
|
|
|
| static gfx::Rect LayerVisibleRect(PropertyTrees* property_trees,
|
| @@ -658,6 +657,174 @@ static gfx::Rect LayerVisibleRect(PropertyTrees* property_trees,
|
| return visible_rect;
|
| }
|
|
|
| +static ConditionalClip LayerClipRect(PropertyTrees* property_trees,
|
| + LayerImpl* layer) {
|
| + const EffectTree* effect_tree = &property_trees->effect_tree;
|
| + const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
|
| + const EffectNode* target_node =
|
| + effect_node->has_render_surface
|
| + ? effect_node
|
| + : effect_tree->Node(effect_node->target_id);
|
| + // TODO(weiliangc): When effect node has up to date render surface info on
|
| + // compositor thread, no need to check for resourceless draw mode
|
| + if (!property_trees->non_root_surfaces_enabled) {
|
| + target_node = effect_tree->Node(1);
|
| + }
|
| +
|
| + bool include_expanding_clips = false;
|
| + return ComputeAccumulatedClip(property_trees, include_expanding_clips,
|
| + layer->clip_tree_index(), target_node->id);
|
| +}
|
| +
|
| +static void UpdateRenderTarget(EffectTree* effect_tree,
|
| + bool can_render_to_separate_surface) {
|
| + for (int i = EffectTree::kContentsRootNodeId;
|
| + i < static_cast<int>(effect_tree->size()); ++i) {
|
| + EffectNode* node = effect_tree->Node(i);
|
| + if (i == EffectTree::kContentsRootNodeId) {
|
| + // Render target of the node corresponding to root is itself.
|
| + node->target_id = EffectTree::kContentsRootNodeId;
|
| + } else if (!can_render_to_separate_surface) {
|
| + node->target_id = EffectTree::kContentsRootNodeId;
|
| + } else if (effect_tree->parent(node)->has_render_surface) {
|
| + node->target_id = node->parent_id;
|
| + } else {
|
| + node->target_id = effect_tree->parent(node)->target_id;
|
| + }
|
| + }
|
| +}
|
| +
|
| +static void UpdateScrollTree(ScrollTree* scroll_tree,
|
| + const LayerTreeHost* layer_tree_host) {
|
| + if (!scroll_tree->needs_update())
|
| + return;
|
| +
|
| + for (int i = ScrollTree::kRootNodeId;
|
| + i < static_cast<int>(scroll_tree->size()); ++i) {
|
| + ScrollNode* scroll_node = scroll_tree->Node(i);
|
| + if (Layer* scroll_layer =
|
| + layer_tree_host->LayerById(scroll_node->owning_layer_id)) {
|
| + if (Layer* scroll_clip_layer = scroll_layer->scroll_clip_layer()) {
|
| + scroll_node->scroll_clip_layer_bounds = scroll_clip_layer->bounds();
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +static void ComputeClips(PropertyTrees* property_trees) {
|
| + DCHECK(!property_trees->transform_tree.needs_update());
|
| + ClipTree* clip_tree = &property_trees->clip_tree;
|
| + if (!clip_tree->needs_update())
|
| + return;
|
| + const int target_effect_id = EffectTree::kContentsRootNodeId;
|
| + const int target_transform_id = TransformTree::kRootNodeId;
|
| + const bool include_expanding_clips = true;
|
| + for (int i = ClipTree::kViewportNodeId;
|
| + i < static_cast<int>(clip_tree->size()); ++i) {
|
| + ClipNode* clip_node = clip_tree->Node(i);
|
| + // Clear the clip rect cache
|
| + clip_node->cached_clip_rects = std::vector<ClipRectData>(1);
|
| + if (clip_node->id == ClipTree::kViewportNodeId) {
|
| + clip_node->cached_accumulated_rect_in_screen_space = clip_node->clip;
|
| + continue;
|
| + }
|
| + ClipNode* parent_clip_node = clip_tree->parent(clip_node);
|
| + DCHECK(parent_clip_node);
|
| + gfx::RectF accumulated_clip =
|
| + parent_clip_node->cached_accumulated_rect_in_screen_space;
|
| + bool success = ApplyClipNodeToAccumulatedClip(
|
| + property_trees, include_expanding_clips, target_effect_id,
|
| + target_transform_id, clip_node, &accumulated_clip);
|
| + DCHECK(success);
|
| + clip_node->cached_accumulated_rect_in_screen_space = accumulated_clip;
|
| + }
|
| + clip_tree->set_needs_update(false);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
|
| + gfx::Transform* transform) {
|
| + DCHECK(effect_node->has_render_surface);
|
| + if (effect_node->surface_contents_scale.x() != 0.0 &&
|
| + effect_node->surface_contents_scale.y() != 0.0)
|
| + transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
|
| + 1.0 / effect_node->surface_contents_scale.y());
|
| +}
|
| +
|
| +bool LayerShouldBeSkipped(LayerImpl* layer,
|
| + const TransformTree& transform_tree,
|
| + const EffectTree& effect_tree) {
|
| + return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
|
| +}
|
| +
|
| +bool LayerShouldBeSkipped(Layer* layer,
|
| + const TransformTree& transform_tree,
|
| + const EffectTree& effect_tree) {
|
| + return LayerShouldBeSkippedInternal(layer, transform_tree, effect_tree);
|
| +}
|
| +
|
| +void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
|
| + const PropertyTrees* property_trees,
|
| + LayerList* update_layer_list) {
|
| + const TransformTree& transform_tree = property_trees->transform_tree;
|
| + const EffectTree& effect_tree = property_trees->effect_tree;
|
| + for (auto* layer : *layer_tree_host) {
|
| + if (!IsRootLayer(layer) &&
|
| + LayerShouldBeSkipped(layer, transform_tree, effect_tree))
|
| + continue;
|
| +
|
| + bool layer_is_drawn =
|
| + effect_tree.Node(layer->effect_tree_index())->is_drawn;
|
| +
|
| + if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) {
|
| + update_layer_list->push_back(layer);
|
| + }
|
| +
|
| + // Append mask layers to the update layer list. They don't have valid
|
| + // visible rects, so need to get added after the above calculation.
|
| + if (Layer* mask_layer = layer->mask_layer())
|
| + update_layer_list->push_back(mask_layer);
|
| + }
|
| +}
|
| +
|
| +void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
|
| + const PropertyTrees* property_trees,
|
| + std::vector<LayerImpl*>* visible_layer_list) {
|
| + const TransformTree& transform_tree = property_trees->transform_tree;
|
| + const EffectTree& effect_tree = property_trees->effect_tree;
|
| +
|
| + for (auto* layer_impl : *layer_tree_impl) {
|
| + if (!IsRootLayer(layer_impl) &&
|
| + LayerShouldBeSkipped(layer_impl, transform_tree, effect_tree))
|
| + continue;
|
| +
|
| + bool layer_is_drawn =
|
| + effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
|
| +
|
| + if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees))
|
| + visible_layer_list->push_back(layer_impl);
|
| + }
|
| +}
|
| +
|
| +void ComputeTransforms(TransformTree* transform_tree) {
|
| + if (!transform_tree->needs_update())
|
| + return;
|
| + for (int i = TransformTree::kContentsRootNodeId;
|
| + i < static_cast<int>(transform_tree->size()); ++i)
|
| + transform_tree->UpdateTransforms(i);
|
| + transform_tree->set_needs_update(false);
|
| +}
|
| +
|
| +void ComputeEffects(EffectTree* effect_tree) {
|
| + if (!effect_tree->needs_update())
|
| + return;
|
| + for (int i = EffectTree::kContentsRootNodeId;
|
| + i < static_cast<int>(effect_tree->size()); ++i)
|
| + effect_tree->UpdateEffects(i);
|
| + effect_tree->set_needs_update(false);
|
| +}
|
| +
|
| void UpdatePropertyTrees(LayerTreeHost* layer_tree_host,
|
| PropertyTrees* property_trees,
|
| bool can_render_to_separate_surface) {
|
| @@ -742,68 +909,6 @@ gfx::Transform DrawTransform(const LayerImpl* layer,
|
| return xform;
|
| }
|
|
|
| -static void SetSurfaceDrawTransform(const PropertyTrees* property_trees,
|
| - RenderSurfaceImpl* render_surface) {
|
| - const TransformTree& transform_tree = property_trees->transform_tree;
|
| - const EffectTree& effect_tree = property_trees->effect_tree;
|
| - const TransformNode* transform_node =
|
| - transform_tree.Node(render_surface->TransformTreeIndex());
|
| - const EffectNode* effect_node =
|
| - effect_tree.Node(render_surface->EffectTreeIndex());
|
| - // The draw transform of root render surface is identity tranform.
|
| - if (transform_node->id == TransformTree::kRootNodeId) {
|
| - render_surface->SetDrawTransform(gfx::Transform());
|
| - return;
|
| - }
|
| -
|
| - gfx::Transform render_surface_transform;
|
| - const EffectNode* target_effect_node =
|
| - effect_tree.Node(effect_node->target_id);
|
| - property_trees->GetToTarget(transform_node->id, target_effect_node->id,
|
| - &render_surface_transform);
|
| -
|
| - ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
|
| - render_surface->SetDrawTransform(render_surface_transform);
|
| -}
|
| -
|
| -static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
|
| - PropertyTrees* property_trees,
|
| - RenderSurfaceImpl* render_surface) {
|
| - if (!render_surface->is_clipped()) {
|
| - render_surface->SetClipRect(gfx::Rect());
|
| - return;
|
| - }
|
| -
|
| - const EffectTree& effect_tree = property_trees->effect_tree;
|
| - const ClipTree& clip_tree = property_trees->clip_tree;
|
| - const EffectNode* effect_node =
|
| - effect_tree.Node(render_surface->EffectTreeIndex());
|
| - const EffectNode* target_node = effect_tree.Node(effect_node->target_id);
|
| - bool include_expanding_clips = false;
|
| - if (render_surface->EffectTreeIndex() == EffectTree::kContentsRootNodeId) {
|
| - render_surface->SetClipRect(
|
| - gfx::ToEnclosingRect(clip_tree.Node(effect_node->clip_id)->clip));
|
| - } else {
|
| - ConditionalClip accumulated_clip_rect =
|
| - ComputeAccumulatedClip(property_trees, include_expanding_clips,
|
| - effect_node->clip_id, target_node->id);
|
| - render_surface->SetClipRect(
|
| - gfx::ToEnclosingRect(accumulated_clip_rect.clip_rect));
|
| - }
|
| -}
|
| -
|
| -template <typename LayerType>
|
| -static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
|
| - const TransformTree& tree) {
|
| - gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
|
| - layer->offset_to_transform_parent().y());
|
| - gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
|
| - xform.ConcatTransform(ssxform);
|
| - if (layer->should_flatten_transform_from_property_tree())
|
| - xform.FlattenTo2d();
|
| - return xform;
|
| -}
|
| -
|
| gfx::Transform ScreenSpaceTransform(const Layer* layer,
|
| const TransformTree& tree) {
|
| return ScreenSpaceTransformInternal(layer, tree);
|
| @@ -814,47 +919,6 @@ gfx::Transform ScreenSpaceTransform(const LayerImpl* layer,
|
| return ScreenSpaceTransformInternal(layer, tree);
|
| }
|
|
|
| -static float LayerDrawOpacity(const LayerImpl* layer, const EffectTree& tree) {
|
| - if (!layer->render_target())
|
| - return 0.f;
|
| -
|
| - const EffectNode* target_node =
|
| - tree.Node(layer->render_target()->EffectTreeIndex());
|
| - const EffectNode* node = tree.Node(layer->effect_tree_index());
|
| - if (node == target_node)
|
| - return 1.f;
|
| -
|
| - float draw_opacity = 1.f;
|
| - while (node != target_node) {
|
| - draw_opacity *= tree.EffectiveOpacity(node);
|
| - node = tree.parent(node);
|
| - }
|
| - return draw_opacity;
|
| -}
|
| -
|
| -static void SetSurfaceDrawOpacity(const EffectTree& tree,
|
| - RenderSurfaceImpl* render_surface) {
|
| - // Draw opacity of a surface is the product of opacities between the surface
|
| - // (included) and its target surface (excluded).
|
| - const EffectNode* node = tree.Node(render_surface->EffectTreeIndex());
|
| - float draw_opacity = tree.EffectiveOpacity(node);
|
| - for (node = tree.parent(node); node && !node->has_render_surface;
|
| - node = tree.parent(node)) {
|
| - draw_opacity *= tree.EffectiveOpacity(node);
|
| - }
|
| - render_surface->SetDrawOpacity(draw_opacity);
|
| -}
|
| -
|
| -static gfx::Rect LayerDrawableContentRect(
|
| - const LayerImpl* layer,
|
| - const gfx::Rect& layer_bounds_in_target_space,
|
| - const gfx::Rect& clip_rect) {
|
| - if (layer->is_clipped())
|
| - return IntersectRects(layer_bounds_in_target_space, clip_rect);
|
| -
|
| - return layer_bounds_in_target_space;
|
| -}
|
| -
|
| void ComputeDrawPropertiesOfVisibleLayers(const LayerImplList* layer_list,
|
| PropertyTrees* property_trees) {
|
| // Compute transforms
|
| @@ -936,52 +1000,6 @@ void ComputeSurfaceDrawProperties(PropertyTrees* property_trees,
|
| SetSurfaceClipRect(clip_node, property_trees, render_surface);
|
| }
|
|
|
| -#if DCHECK_IS_ON()
|
| -static void ValidatePageScaleLayer(const Layer* page_scale_layer) {
|
| - DCHECK_EQ(page_scale_layer->position().ToString(), gfx::PointF().ToString());
|
| - DCHECK_EQ(page_scale_layer->transform_origin().ToString(),
|
| - gfx::Point3F().ToString());
|
| -}
|
| -
|
| -static void ValidatePageScaleLayer(const LayerImpl* page_scale_layer) {}
|
| -#endif
|
| -
|
| -template <typename LayerType>
|
| -static void UpdatePageScaleFactorInternal(PropertyTrees* property_trees,
|
| - const LayerType* page_scale_layer,
|
| - float page_scale_factor,
|
| - float device_scale_factor,
|
| - gfx::Transform device_transform) {
|
| - if (property_trees->transform_tree.page_scale_factor() == page_scale_factor)
|
| - return;
|
| -
|
| - property_trees->transform_tree.set_page_scale_factor(page_scale_factor);
|
| - DCHECK(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());
|
| - // TODO(enne): property trees can't ask the layer these things, but
|
| - // the page scale layer should *just* be the page scale.
|
| -#if DCHECK_IS_ON()
|
| - ValidatePageScaleLayer(page_scale_layer);
|
| -#endif
|
| -
|
| - if (IsRootLayer(page_scale_layer)) {
|
| - // When the page scale layer is also the root layer, the node should also
|
| - // store the combined scale factor and not just the page scale factor.
|
| - float post_local_scale_factor = page_scale_factor * device_scale_factor;
|
| - node->post_local_scale_factor = post_local_scale_factor;
|
| - node->post_local = device_transform;
|
| - node->post_local.Scale(post_local_scale_factor, post_local_scale_factor);
|
| - } else {
|
| - node->post_local_scale_factor = page_scale_factor;
|
| - node->update_post_local_transform(gfx::PointF(), gfx::Point3F());
|
| - }
|
| - node->needs_local_transform_update = true;
|
| - property_trees->transform_tree.set_needs_update(true);
|
| -}
|
| -
|
| void UpdatePageScaleFactor(PropertyTrees* property_trees,
|
| const LayerImpl* page_scale_layer,
|
| float page_scale_factor,
|
| @@ -1002,26 +1020,6 @@ void UpdatePageScaleFactor(PropertyTrees* property_trees,
|
| device_transform);
|
| }
|
|
|
| -template <typename LayerType>
|
| -static void UpdateElasticOverscrollInternal(
|
| - PropertyTrees* property_trees,
|
| - const LayerType* overscroll_elasticity_layer,
|
| - const gfx::Vector2dF& elastic_overscroll) {
|
| - if (!overscroll_elasticity_layer) {
|
| - DCHECK(elastic_overscroll.IsZero());
|
| - return;
|
| - }
|
| -
|
| - TransformNode* node = property_trees->transform_tree.Node(
|
| - overscroll_elasticity_layer->transform_tree_index());
|
| - if (node->scroll_offset == gfx::ScrollOffset(elastic_overscroll))
|
| - return;
|
| -
|
| - node->scroll_offset = gfx::ScrollOffset(elastic_overscroll);
|
| - node->needs_local_transform_update = true;
|
| - property_trees->transform_tree.set_needs_update(true);
|
| -}
|
| -
|
| void UpdateElasticOverscroll(PropertyTrees* property_trees,
|
| const LayerImpl* overscroll_elasticity_layer,
|
| const gfx::Vector2dF& elastic_overscroll) {
|
|
|