Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1197)

Unified Diff: cc/trees/property_tree_builder.cc

Issue 2554833002: [NOT FOR REVIEW] cc : New clip tree
Patch Set: comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/property_tree_builder.cc
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index d99262f84e268156ac925bafd5a8b9ef5092d462..8d42ab09bce1e9e23234d2a23e12ebd0fac77439 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -456,6 +456,81 @@ void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor,
}
template <typename LayerType>
+void AddClipNodeOnlyIfLayerClipsSubtree(
+ const DataForRecursion<LayerType>& data_from_ancestor,
+ LayerType* layer,
+ bool created_render_surface,
+ bool created_transform_node,
+ DataForRecursion<LayerType>* data_for_children) {
+ const bool inherits_clip = !ClipParent(layer);
+ const int parent_id = inherits_clip ? data_from_ancestor.clip_tree_parent
+ : ClipParent(layer)->clip_tree_index();
+ ClipNode* parent =
+ data_from_ancestor.property_trees->clip_tree.Node(parent_id);
+
+ bool apply_ancestor_clip = false;
+ if (inherits_clip) {
+ apply_ancestor_clip = data_from_ancestor.apply_ancestor_clip;
+ } else {
+ const EffectNode* parent_effect_node =
+ data_from_ancestor.property_trees->effect_tree.Node(
+ ClipParent(layer)->effect_tree_parent());
+ if (parent_effect_node->clip_id == parent->id) {
+ if (parent_effect_node->surface_is_clipped) {
+ // In this case, there is no clipping layer between the clip parent and
+ // its target and the target has applied the clip.
+ apply_ancestor_clip = false;
+ } else {
+ // In this case, there is no clipping layer between the clip parent and
+ // its target and the target has not applied the clip. There are two
+ // cases when a target doesn't apply clip. First, there is no ancestor
+ // clip to apply, in this case apply_ancestor_clip should be false.
+ // Second, there is a clip to apply but there are unclipped descendants,
+ // so the target cannot apply the clip. In this case,
+ // apply_ancestor_clip should be true.
+ apply_ancestor_clip = parent_effect_node->has_unclipped_descendants;
+ }
+ } else {
+ // In this case, there is a clipping layer between the clip parent and
+ // its target.
+ apply_ancestor_clip = true;
+ }
+ }
+ if (created_render_surface)
+ SetSurfaceIsClipped(data_for_children, apply_ancestor_clip, layer);
+
+ bool layer_clips_subtree = LayerClipsSubtree(layer);
+ if (layer_clips_subtree) {
+ data_for_children->apply_ancestor_clip = true;
+ }
+
+ if (!layer_clips_subtree) {
+ data_for_children->clip_tree_parent = parent_id;
+ } else {
+ LayerType* transform_parent = data_for_children->transform_tree_parent;
+ if (PositionConstraint(layer).is_fixed_position() &&
+ !created_transform_node) {
+ transform_parent = data_for_children->transform_fixed_parent;
+ }
+ ClipNode node;
+ node.clip = gfx::RectF(gfx::PointF() + layer->offset_to_transform_parent(),
+ gfx::SizeF(layer->bounds()));
+ node.transform_id = transform_parent->transform_tree_index();
+ node.owner_id = layer->id();
+ if (layer_clips_subtree)
+ node.clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP;
+ else
+ node.clip_type = ClipNode::ClipType::NONE;
+ data_for_children->clip_tree_parent =
+ data_for_children->property_trees->clip_tree.Insert(node, parent_id);
+ data_for_children->property_trees->clip_id_to_index_map[layer->id()] =
+ data_for_children->clip_tree_parent;
+ }
+
+ layer->SetClipTreeIndex(data_for_children->clip_tree_parent);
+}
+
+template <typename LayerType>
static inline bool IsAtBoundaryOf3dRenderingContext(LayerType* layer) {
return Parent(layer)
? Parent(layer)->sorting_context_id() !=
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698