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

Side by Side 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, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 data.layers_are_clipped_when_surfaces_disabled(); 431 data.layers_are_clipped_when_surfaces_disabled();
432 resets_clip = data.resets_clip(); 432 resets_clip = data.resets_clip();
433 } 433 }
434 434
435 EffectNodeData::EffectNodeData() 435 EffectNodeData::EffectNodeData()
436 : opacity(1.f), 436 : opacity(1.f),
437 screen_space_opacity(1.f), 437 screen_space_opacity(1.f),
438 has_render_surface(false), 438 has_render_surface(false),
439 has_copy_request(false), 439 has_copy_request(false),
440 has_background_filters(false), 440 has_background_filters(false),
441 node_or_ancestor_has_background_filters(false),
442 to_screen_opacity_is_animated(false),
443 node_or_ancestor_has_backface_visible_surface(false),
444 double_sided(false),
441 is_drawn(true), 445 is_drawn(true),
442 has_animated_opacity(false), 446 has_animated_opacity(false),
443 effect_changed(false), 447 effect_changed(false),
444 num_copy_requests_in_subtree(0), 448 num_copy_requests_in_subtree(0),
445 transform_id(0), 449 transform_id(0),
446 clip_id(0) {} 450 clip_id(0) {}
447 451
448 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; 452 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default;
449 453
450 bool EffectNodeData::operator==(const EffectNodeData& other) const { 454 bool EffectNodeData::operator==(const EffectNodeData& other) const {
451 return opacity == other.opacity && 455 return opacity == other.opacity &&
452 screen_space_opacity == other.screen_space_opacity && 456 screen_space_opacity == other.screen_space_opacity &&
453 has_render_surface == other.has_render_surface && 457 has_render_surface == other.has_render_surface &&
454 has_copy_request == other.has_copy_request && 458 has_copy_request == other.has_copy_request &&
455 has_background_filters == other.has_background_filters && 459 has_background_filters == other.has_background_filters &&
456 is_drawn == other.is_drawn && 460 node_or_ancestor_has_background_filters ==
461 other.node_or_ancestor_has_background_filters &&
462 to_screen_opacity_is_animated == other.to_screen_opacity_is_animated &&
463 node_or_ancestor_has_backface_visible_surface ==
464 other.node_or_ancestor_has_backface_visible_surface &&
465 double_sided == other.double_sided && is_drawn == other.is_drawn &&
457 has_animated_opacity == other.has_animated_opacity && 466 has_animated_opacity == other.has_animated_opacity &&
458 effect_changed == other.effect_changed && 467 effect_changed == other.effect_changed &&
459 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && 468 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree &&
460 transform_id == other.transform_id && clip_id == other.clip_id; 469 transform_id == other.transform_id && clip_id == other.clip_id;
461 } 470 }
462 471
463 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { 472 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const {
464 DCHECK(!proto->has_effect_node_data()); 473 DCHECK(!proto->has_effect_node_data());
465 proto::EffectNodeData* data = proto->mutable_effect_node_data(); 474 proto::EffectNodeData* data = proto->mutable_effect_node_data();
466 data->set_opacity(opacity); 475 data->set_opacity(opacity);
467 data->set_screen_space_opacity(screen_space_opacity); 476 data->set_screen_space_opacity(screen_space_opacity);
468 data->set_has_render_surface(has_render_surface); 477 data->set_has_render_surface(has_render_surface);
469 data->set_has_copy_request(has_copy_request); 478 data->set_has_copy_request(has_copy_request);
470 data->set_has_background_filters(has_background_filters); 479 data->set_has_background_filters(has_background_filters);
480 data->set_node_or_ancestor_has_background_filters(
481 node_or_ancestor_has_background_filters);
482 data->set_to_screen_opacity_is_animated(to_screen_opacity_is_animated);
483 data->set_node_or_ancestor_has_backface_visible_surface(
484 node_or_ancestor_has_backface_visible_surface);
485 data->set_double_sided(double_sided);
471 data->set_is_drawn(is_drawn); 486 data->set_is_drawn(is_drawn);
472 data->set_has_animated_opacity(has_animated_opacity); 487 data->set_has_animated_opacity(has_animated_opacity);
473 data->set_effect_changed(effect_changed); 488 data->set_effect_changed(effect_changed);
474 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); 489 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree);
475 data->set_transform_id(transform_id); 490 data->set_transform_id(transform_id);
476 data->set_clip_id(clip_id); 491 data->set_clip_id(clip_id);
477 } 492 }
478 493
479 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { 494 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) {
480 DCHECK(proto.has_effect_node_data()); 495 DCHECK(proto.has_effect_node_data());
481 const proto::EffectNodeData& data = proto.effect_node_data(); 496 const proto::EffectNodeData& data = proto.effect_node_data();
482 497
483 opacity = data.opacity(); 498 opacity = data.opacity();
484 screen_space_opacity = data.screen_space_opacity(); 499 screen_space_opacity = data.screen_space_opacity();
485 has_render_surface = data.has_render_surface(); 500 has_render_surface = data.has_render_surface();
486 has_copy_request = data.has_copy_request(); 501 has_copy_request = data.has_copy_request();
487 has_background_filters = data.has_background_filters(); 502 has_background_filters = data.has_background_filters();
503 node_or_ancestor_has_background_filters =
504 data.node_or_ancestor_has_background_filters();
505 to_screen_opacity_is_animated = data.to_screen_opacity_is_animated();
506 node_or_ancestor_has_backface_visible_surface =
507 data.node_or_ancestor_has_backface_visible_surface();
508 double_sided = data.double_sided();
488 is_drawn = data.is_drawn(); 509 is_drawn = data.is_drawn();
489 has_animated_opacity = data.has_animated_opacity(); 510 has_animated_opacity = data.has_animated_opacity();
490 effect_changed = data.effect_changed(); 511 effect_changed = data.effect_changed();
491 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); 512 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree();
492 transform_id = data.transform_id(); 513 transform_id = data.transform_id();
493 clip_id = data.clip_id(); 514 clip_id = data.clip_id();
494 } 515 }
495 516
496 ScrollNodeData::ScrollNodeData() 517 ScrollNodeData::ScrollNodeData()
497 : scrollable(false), 518 : scrollable(false),
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 node->data.is_drawn = true; 1219 node->data.is_drawn = true;
1199 } 1220 }
1200 1221
1201 void EffectTree::UpdateEffectChanged(EffectNode* node, 1222 void EffectTree::UpdateEffectChanged(EffectNode* node,
1202 EffectNode* parent_node) { 1223 EffectNode* parent_node) {
1203 if (parent_node && parent_node->data.effect_changed) { 1224 if (parent_node && parent_node->data.effect_changed) {
1204 node->data.effect_changed = true; 1225 node->data.effect_changed = true;
1205 } 1226 }
1206 } 1227 }
1207 1228
1229 void EffectTree::UpdateBackfaceVisibility(EffectNode* node,
1230 EffectNode* parent_node) {
1231 if (node->owner_id == -1) {
1232 node->data.node_or_ancestor_has_backface_visible_surface = false;
1233 return;
1234 }
1235 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.
1236 parent_node->data.node_or_ancestor_has_backface_visible_surface) {
1237 node->data.node_or_ancestor_has_backface_visible_surface = true;
1238 return;
1239 }
1240
1241 TransformTree& transform_tree = property_trees()->transform_tree;
1242 if (node->data.has_render_surface) {
1243 TransformNode* transform_node =
1244 transform_tree.Node(node->data.transform_id);
1245 if (transform_node->data.is_invertible &&
1246 transform_node->data.ancestors_are_invertible) {
1247 if (transform_node->data.sorting_context_id) {
1248 const TransformNode* parent_transform_node =
1249 transform_tree.parent(transform_node);
1250 if (parent_transform_node &&
1251 parent_transform_node->data.sorting_context_id ==
1252 transform_node->data.sorting_context_id) {
1253 gfx::Transform surface_draw_transform;
1254 transform_tree.ComputeTransform(transform_node->id,
1255 transform_node->data.target_id,
1256 &surface_draw_transform);
1257 node->data.node_or_ancestor_has_backface_visible_surface =
1258 surface_draw_transform.IsBackFaceVisible();
1259 } else {
1260 node->data.node_or_ancestor_has_backface_visible_surface =
1261 transform_node->data.local.IsBackFaceVisible();
1262 }
1263 return;
1264 }
1265 }
1266 }
1267 node->data.node_or_ancestor_has_backface_visible_surface = false;
1268 }
1269
1208 void EffectTree::UpdateEffects(int id) { 1270 void EffectTree::UpdateEffects(int id) {
1209 EffectNode* node = Node(id); 1271 EffectNode* node = Node(id);
1210 EffectNode* parent_node = parent(node); 1272 EffectNode* parent_node = parent(node);
1211 1273
1212 UpdateOpacities(node, parent_node); 1274 UpdateOpacities(node, parent_node);
1213 UpdateIsDrawn(node, parent_node); 1275 UpdateIsDrawn(node, parent_node);
1214 UpdateEffectChanged(node, parent_node); 1276 UpdateEffectChanged(node, parent_node);
1277 UpdateBackfaceVisibility(node, parent_node);
1215 } 1278 }
1216 1279
1217 void EffectTree::ClearCopyRequests() { 1280 void EffectTree::ClearCopyRequests() {
1218 for (auto& node : nodes()) { 1281 for (auto& node : nodes()) {
1219 node.data.num_copy_requests_in_subtree = 0; 1282 node.data.num_copy_requests_in_subtree = 0;
1220 node.data.has_copy_request = false; 1283 node.data.has_copy_request = false;
1221 } 1284 }
1222 set_needs_update(true); 1285 set_needs_update(true);
1223 } 1286 }
1224 1287
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
1850 break; 1913 break;
1851 case ALL_TREES: 1914 case ALL_TREES:
1852 transform_tree.ResetChangeTracking(); 1915 transform_tree.ResetChangeTracking();
1853 effect_tree.ResetChangeTracking(); 1916 effect_tree.ResetChangeTracking();
1854 } 1917 }
1855 changed = false; 1918 changed = false;
1856 full_tree_damaged = false; 1919 full_tree_damaged = false;
1857 } 1920 }
1858 1921
1859 } // namespace cc 1922 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698