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

Unified Diff: cc/trees/property_tree.cc

Issue 1811423002: SubtreeShouldBeSkipped uses information from property trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolve comments Created 4 years, 9 months 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
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() {

Powered by Google App Engine
This is Rietveld 408576698