Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index 73197741d39ad4229075a9492c8e1bb62121eac8..3a3e1dbaf8682a54815be47e65b07eb614f65381 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -39,6 +39,7 @@ struct DataForRecursion { |
int clip_tree_parent; |
int effect_tree_parent; |
int scroll_tree_parent; |
+ int closest_ancestor_with_copy_request; |
const LayerType* page_scale_layer; |
const LayerType* inner_viewport_scroll_layer; |
const LayerType* outer_viewport_scroll_layer; |
@@ -912,34 +913,40 @@ bool AddEffectNodeIfNeeded( |
return false; |
} |
- EffectNode node; |
- node.owning_layer_id = layer->id(); |
+ EffectTree& effect_tree = data_for_children->property_trees->effect_tree; |
+ int node_id = effect_tree.Insert(EffectNode(), parent_id); |
+ EffectNode* node = effect_tree.back(); |
+ |
+ node->owning_layer_id = layer->id(); |
if (AlwaysUseActiveTreeOpacity(layer)) { |
data_for_children->property_trees->always_use_active_tree_opacity_effect_ids |
- .push_back(node.owning_layer_id); |
+ .push_back(node->owning_layer_id); |
} |
- node.opacity = Opacity(layer); |
- node.blend_mode = BlendMode(layer); |
- node.unscaled_mask_target_size = layer->bounds(); |
- node.has_render_surface = should_create_render_surface; |
- node.has_copy_request = HasCopyRequest(layer); |
- node.filters = Filters(layer); |
- node.background_filters = BackgroundFilters(layer); |
- node.filters_origin = FiltersOrigin(layer); |
- 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.is_currently_animating_opacity = OpacityIsAnimating(layer); |
- node.is_currently_animating_filter = FilterIsAnimating(layer); |
- node.effect_changed = PropertyChanged(layer); |
- node.subtree_has_copy_request = SubtreeHasCopyRequest(layer); |
+ node->opacity = Opacity(layer); |
+ node->blend_mode = BlendMode(layer); |
+ node->unscaled_mask_target_size = layer->bounds(); |
+ node->has_render_surface = should_create_render_surface; |
+ node->has_copy_request = HasCopyRequest(layer); |
+ node->filters = Filters(layer); |
+ node->background_filters = BackgroundFilters(layer); |
+ node->filters_origin = FiltersOrigin(layer); |
+ 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->is_currently_animating_opacity = OpacityIsAnimating(layer); |
+ node->is_currently_animating_filter = FilterIsAnimating(layer); |
+ node->effect_changed = PropertyChanged(layer); |
+ node->subtree_has_copy_request = SubtreeHasCopyRequest(layer); |
+ node->closest_ancestor_with_copy_request_id = |
+ HasCopyRequest(layer) |
+ ? node_id |
+ : data_from_ancestor.closest_ancestor_with_copy_request; |
- EffectTree& effect_tree = data_for_children->property_trees->effect_tree; |
if (MaskLayer(layer)) { |
- node.mask_layer_id = MaskLayer(layer)->id(); |
- effect_tree.AddMaskLayerId(node.mask_layer_id); |
+ node->mask_layer_id = MaskLayer(layer)->id(); |
+ effect_tree.AddMaskLayerId(node->mask_layer_id); |
} |
if (!is_root) { |
@@ -950,19 +957,21 @@ bool AddEffectNodeIfNeeded( |
// 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. |
- node.transform_id = |
+ node->transform_id = |
data_from_ancestor.property_trees->transform_tree.next_available_id(); |
} |
- node.clip_id = data_from_ancestor.clip_tree_parent; |
+ node->clip_id = data_from_ancestor.clip_tree_parent; |
} else { |
// Root render surface acts the unbounded and untransformed to draw content |
// into. Transform node created from root layer (includes device scale |
// factor) and clip node created from root layer (include viewports) applies |
// to root render surface's content, but not root render surface itself. |
- node.transform_id = TransformTree::kRootNodeId; |
- node.clip_id = ClipTree::kViewportNodeId; |
+ node->transform_id = TransformTree::kRootNodeId; |
+ node->clip_id = ClipTree::kViewportNodeId; |
} |
- int node_id = effect_tree.Insert(node, parent_id); |
jaydasika
2017/05/03 21:14:33
I realized while writing this CL that any updates
|
+ |
+ data_for_children->closest_ancestor_with_copy_request = |
+ node->closest_ancestor_with_copy_request_id; |
data_for_children->effect_tree_parent = node_id; |
layer->SetEffectTreeIndex(node_id); |
data_for_children->property_trees->effect_tree.SetOwningLayerIdForNode( |
@@ -1255,6 +1264,8 @@ void BuildPropertyTreesTopLevelInternal( |
data_for_recursion.clip_tree_parent = ClipTree::kRootNodeId; |
data_for_recursion.effect_tree_parent = EffectTree::kInvalidNodeId; |
data_for_recursion.scroll_tree_parent = ScrollTree::kRootNodeId; |
+ data_for_recursion.closest_ancestor_with_copy_request = |
+ EffectTree::kInvalidNodeId; |
data_for_recursion.page_scale_layer = page_scale_layer; |
data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |