Chromium Code Reviews| Index: cc/trees/property_tree.cc |
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
| index 7eea35e1152329e819f1dcfafa0ca08607e98d1b..9a0d884b1201dd54396b58df991a46693a0fb861 100644 |
| --- a/cc/trees/property_tree.cc |
| +++ b/cc/trees/property_tree.cc |
| @@ -438,6 +438,10 @@ EffectNodeData::EffectNodeData() |
| has_render_surface(false), |
| has_copy_request(false), |
| has_background_filters(false), |
| + node_or_ancestor_has_background_filters(false), |
| + to_screen_opacity_is_animated(false), |
| + node_or_ancestor_has_backface_visible_surface(false), |
| + double_sided(false), |
| is_drawn(true), |
| has_animated_opacity(false), |
| effect_changed(false), |
| @@ -453,7 +457,12 @@ bool EffectNodeData::operator==(const EffectNodeData& other) const { |
| has_render_surface == other.has_render_surface && |
| has_copy_request == other.has_copy_request && |
| has_background_filters == other.has_background_filters && |
| - is_drawn == other.is_drawn && |
| + node_or_ancestor_has_background_filters == |
| + other.node_or_ancestor_has_background_filters && |
| + to_screen_opacity_is_animated == other.to_screen_opacity_is_animated && |
| + node_or_ancestor_has_backface_visible_surface == |
| + other.node_or_ancestor_has_backface_visible_surface && |
| + double_sided == other.double_sided && is_drawn == other.is_drawn && |
| has_animated_opacity == other.has_animated_opacity && |
| effect_changed == other.effect_changed && |
| num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && |
| @@ -468,6 +477,12 @@ void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { |
| data->set_has_render_surface(has_render_surface); |
| data->set_has_copy_request(has_copy_request); |
| data->set_has_background_filters(has_background_filters); |
| + data->set_node_or_ancestor_has_background_filters( |
| + node_or_ancestor_has_background_filters); |
| + data->set_to_screen_opacity_is_animated(to_screen_opacity_is_animated); |
| + data->set_node_or_ancestor_has_backface_visible_surface( |
| + node_or_ancestor_has_backface_visible_surface); |
| + data->set_double_sided(double_sided); |
| data->set_is_drawn(is_drawn); |
| data->set_has_animated_opacity(has_animated_opacity); |
| data->set_effect_changed(effect_changed); |
| @@ -485,6 +500,12 @@ void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { |
| has_render_surface = data.has_render_surface(); |
| has_copy_request = data.has_copy_request(); |
| has_background_filters = data.has_background_filters(); |
| + node_or_ancestor_has_background_filters = |
| + data.node_or_ancestor_has_background_filters(); |
| + to_screen_opacity_is_animated = data.to_screen_opacity_is_animated(); |
| + node_or_ancestor_has_backface_visible_surface = |
| + data.node_or_ancestor_has_backface_visible_surface(); |
| + double_sided = data.double_sided(); |
| is_drawn = data.is_drawn(); |
| has_animated_opacity = data.has_animated_opacity(); |
| effect_changed = data.effect_changed(); |
| @@ -1205,6 +1226,47 @@ void EffectTree::UpdateEffectChanged(EffectNode* node, |
| } |
| } |
| +void EffectTree::UpdateBackfaceVisibility(EffectNode* node, |
| + EffectNode* parent_node) { |
| + if (node->owner_id == -1) { |
| + node->data.node_or_ancestor_has_backface_visible_surface = false; |
| + return; |
| + } |
| + if (parent_node && parent_node->data.double_sided && |
|
ajuma
2016/03/30 17:10:11
I think that double-sidedness needs to be taken in
sunxd
2016/03/31 16:55:57
Done.
|
| + parent_node->data.node_or_ancestor_has_backface_visible_surface) { |
| + node->data.node_or_ancestor_has_backface_visible_surface = true; |
| + return; |
| + } |
| + |
| + TransformTree& transform_tree = property_trees()->transform_tree; |
| + if (node->data.has_render_surface) { |
| + TransformNode* transform_node = |
| + transform_tree.Node(node->data.transform_id); |
| + if (transform_node->data.is_invertible && |
| + transform_node->data.ancestors_are_invertible) { |
| + if (transform_node->data.sorting_context_id) { |
| + const TransformNode* parent_transform_node = |
| + transform_tree.parent(transform_node); |
| + if (parent_transform_node && |
| + parent_transform_node->data.sorting_context_id == |
| + transform_node->data.sorting_context_id) { |
| + gfx::Transform surface_draw_transform; |
| + transform_tree.ComputeTransform(transform_node->id, |
| + transform_node->data.target_id, |
| + &surface_draw_transform); |
| + node->data.node_or_ancestor_has_backface_visible_surface = |
| + surface_draw_transform.IsBackFaceVisible(); |
| + } else { |
| + node->data.node_or_ancestor_has_backface_visible_surface = |
| + transform_node->data.local.IsBackFaceVisible(); |
| + } |
| + return; |
| + } |
| + } |
| + } |
| + node->data.node_or_ancestor_has_backface_visible_surface = false; |
| +} |
| + |
| void EffectTree::UpdateEffects(int id) { |
| EffectNode* node = Node(id); |
| EffectNode* parent_node = parent(node); |
| @@ -1212,6 +1274,7 @@ void EffectTree::UpdateEffects(int id) { |
| UpdateOpacities(node, parent_node); |
| UpdateIsDrawn(node, parent_node); |
| UpdateEffectChanged(node, parent_node); |
| + UpdateBackfaceVisibility(node, parent_node); |
| } |
| void EffectTree::ClearCopyRequests() { |