| Index: cc/trees/property_tree.cc
|
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
|
| index 281c72f1561a3e3bf12772a9896a11d515066096..bc019dcd8a5dc4ef7990fd65159cf96017629669 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),
|
| + hidden_by_backface_visibility(false),
|
| + double_sided(false),
|
| is_drawn(true),
|
| has_animated_opacity(false),
|
| effect_changed(false),
|
| @@ -454,7 +458,11 @@ 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 &&
|
| + hidden_by_backface_visibility == other.hidden_by_backface_visibility &&
|
| + 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 &&
|
| @@ -470,6 +478,11 @@ 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_hidden_by_backface_visibility(hidden_by_backface_visibility);
|
| + 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);
|
| @@ -488,6 +501,11 @@ 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();
|
| + hidden_by_backface_visibility = data.hidden_by_backface_visibility();
|
| + double_sided = data.double_sided();
|
| is_drawn = data.is_drawn();
|
| has_animated_opacity = data.has_animated_opacity();
|
| effect_changed = data.effect_changed();
|
| @@ -1209,6 +1227,46 @@ void EffectTree::UpdateEffectChanged(EffectNode* node,
|
| }
|
| }
|
|
|
| +void EffectTree::UpdateBackfaceVisibility(EffectNode* node,
|
| + EffectNode* parent_node) {
|
| + if (!parent_node) {
|
| + node->data.hidden_by_backface_visibility = false;
|
| + return;
|
| + }
|
| + if (parent_node->data.hidden_by_backface_visibility) {
|
| + node->data.hidden_by_backface_visibility = true;
|
| + return;
|
| + }
|
| +
|
| + TransformTree& transform_tree = property_trees()->transform_tree;
|
| + if (node->data.has_render_surface && !node->data.double_sided) {
|
| + 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.hidden_by_backface_visibility =
|
| + surface_draw_transform.IsBackFaceVisible();
|
| + } else {
|
| + node->data.hidden_by_backface_visibility =
|
| + transform_node->data.local.IsBackFaceVisible();
|
| + }
|
| + return;
|
| + }
|
| + }
|
| + }
|
| + node->data.hidden_by_backface_visibility = false;
|
| +}
|
| +
|
| void EffectTree::UpdateEffects(int id) {
|
| EffectNode* node = Node(id);
|
| EffectNode* parent_node = parent(node);
|
| @@ -1216,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() {
|
|
|