Chromium Code Reviews| Index: cc/trees/property_tree_builder.cc |
| diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
| index 7fe0494aec17d07fe26edcf6db8547b0be1cc3b3..f80f324affab5b77a29fe9c9c87fc41bb1130704 100644 |
| --- a/cc/trees/property_tree_builder.cc |
| +++ b/cc/trees/property_tree_builder.cc |
| @@ -21,10 +21,12 @@ namespace { |
| struct DataForRecursion { |
| TransformTree* transform_tree; |
| ClipTree* clip_tree; |
| + OpacityTree* opacity_tree; |
| Layer* transform_tree_parent; |
| Layer* transform_fixed_parent; |
| Layer* render_target; |
| int clip_tree_parent; |
| + int opacity_tree_parent; |
| gfx::Vector2dF offset_to_transform_tree_parent; |
| gfx::Vector2dF offset_to_transform_fixed_parent; |
| const Layer* page_scale_layer; |
| @@ -223,6 +225,31 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
| layer->set_offset_to_transform_parent(gfx::Vector2dF()); |
| } |
| +void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
| + Layer* layer, |
| + DataForRecursion* data_for_children) { |
| + const bool is_root = !layer->parent(); |
| + const bool has_transparency = layer->opacity() != 1.f; |
| + const bool has_animated_opacity = |
| + layer->layer_animation_controller()->IsAnimatingProperty( |
| + Animation::OPACITY); |
|
Ian Vollick
2015/02/24 21:25:36
Does this capture impl-only opacity animations? Th
ajuma
2015/02/24 21:30:38
Afaik, PZ scrollbars no longer use impl-only anima
ajuma
2015/02/24 21:53:29
Updated to also create nodes for layers that can a
|
| + bool requires_node = is_root || has_transparency || has_animated_opacity; |
| + |
| + int parent_id = data_from_ancestor.opacity_tree_parent; |
| + |
| + if (!requires_node) { |
| + layer->set_opacity_tree_index(parent_id); |
| + data_for_children->opacity_tree_parent = parent_id; |
| + return; |
| + } |
| + |
| + OpacityNode node; |
| + node.data = layer->opacity(); |
| + data_for_children->opacity_tree_parent = |
| + data_for_children->opacity_tree->Insert(node, parent_id); |
| + layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); |
| +} |
| + |
| void BuildPropertyTreesInternal(Layer* layer, |
| const DataForRecursion& data_from_parent) { |
| DataForRecursion data_for_children(data_from_parent); |
| @@ -231,6 +258,7 @@ void BuildPropertyTreesInternal(Layer* layer, |
| AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| + AddOpacityNodeIfNeeded(data_from_parent, layer, &data_for_children); |
| if (layer == data_from_parent.page_scale_layer) |
| data_for_children.in_subtree_of_page_scale_application_layer = true; |
| @@ -260,14 +288,17 @@ void PropertyTreeBuilder::BuildPropertyTrees( |
| const gfx::Rect& viewport, |
| const gfx::Transform& device_transform, |
| TransformTree* transform_tree, |
| - ClipTree* clip_tree) { |
| + ClipTree* clip_tree, |
| + OpacityTree* opacity_tree) { |
| DataForRecursion data_for_recursion; |
| data_for_recursion.transform_tree = transform_tree; |
| data_for_recursion.clip_tree = clip_tree; |
| + data_for_recursion.opacity_tree = opacity_tree; |
| data_for_recursion.transform_tree_parent = nullptr; |
| data_for_recursion.transform_fixed_parent = nullptr; |
| data_for_recursion.render_target = root_layer; |
| data_for_recursion.clip_tree_parent = 0; |
| + data_for_recursion.opacity_tree_parent = -1; |
| data_for_recursion.page_scale_layer = page_scale_layer; |
| data_for_recursion.page_scale_factor = page_scale_factor; |
| data_for_recursion.device_scale_factor = device_scale_factor; |