OLD | NEW |
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 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 } | 428 } |
429 | 429 |
430 EffectNodeData::EffectNodeData() | 430 EffectNodeData::EffectNodeData() |
431 : opacity(1.f), | 431 : opacity(1.f), |
432 screen_space_opacity(1.f), | 432 screen_space_opacity(1.f), |
433 has_render_surface(false), | 433 has_render_surface(false), |
434 has_copy_request(false), | 434 has_copy_request(false), |
435 has_background_filters(false), | 435 has_background_filters(false), |
436 is_drawn(true), | 436 is_drawn(true), |
437 has_animated_opacity(false), | 437 has_animated_opacity(false), |
438 opacity_changed(false), | 438 effect_changed(false), |
439 num_copy_requests_in_subtree(0), | 439 num_copy_requests_in_subtree(0), |
440 transform_id(0), | 440 transform_id(0), |
441 clip_id(0) {} | 441 clip_id(0) {} |
442 | 442 |
443 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; | 443 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; |
444 | 444 |
445 bool EffectNodeData::operator==(const EffectNodeData& other) const { | 445 bool EffectNodeData::operator==(const EffectNodeData& other) const { |
446 return opacity == other.opacity && | 446 return opacity == other.opacity && |
447 screen_space_opacity == other.screen_space_opacity && | 447 screen_space_opacity == other.screen_space_opacity && |
448 has_render_surface == other.has_render_surface && | 448 has_render_surface == other.has_render_surface && |
449 has_copy_request == other.has_copy_request && | 449 has_copy_request == other.has_copy_request && |
450 has_background_filters == other.has_background_filters && | 450 has_background_filters == other.has_background_filters && |
451 is_drawn == other.is_drawn && | 451 is_drawn == other.is_drawn && |
452 has_animated_opacity == other.has_animated_opacity && | 452 has_animated_opacity == other.has_animated_opacity && |
453 opacity_changed == other.opacity_changed && | 453 effect_changed == other.effect_changed && |
454 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && | 454 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && |
455 transform_id == other.transform_id && clip_id == other.clip_id; | 455 transform_id == other.transform_id && clip_id == other.clip_id; |
456 } | 456 } |
457 | 457 |
458 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { | 458 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { |
459 DCHECK(!proto->has_effect_node_data()); | 459 DCHECK(!proto->has_effect_node_data()); |
460 proto::EffectNodeData* data = proto->mutable_effect_node_data(); | 460 proto::EffectNodeData* data = proto->mutable_effect_node_data(); |
461 data->set_opacity(opacity); | 461 data->set_opacity(opacity); |
462 data->set_screen_space_opacity(screen_space_opacity); | 462 data->set_screen_space_opacity(screen_space_opacity); |
463 data->set_has_render_surface(has_render_surface); | 463 data->set_has_render_surface(has_render_surface); |
464 data->set_has_copy_request(has_copy_request); | 464 data->set_has_copy_request(has_copy_request); |
465 data->set_has_background_filters(has_background_filters); | 465 data->set_has_background_filters(has_background_filters); |
466 data->set_is_drawn(is_drawn); | 466 data->set_is_drawn(is_drawn); |
467 data->set_has_animated_opacity(has_animated_opacity); | 467 data->set_has_animated_opacity(has_animated_opacity); |
468 data->set_opacity_changed(opacity_changed); | 468 data->set_effect_changed(effect_changed); |
469 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); | 469 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); |
470 data->set_transform_id(transform_id); | 470 data->set_transform_id(transform_id); |
471 data->set_clip_id(clip_id); | 471 data->set_clip_id(clip_id); |
472 } | 472 } |
473 | 473 |
474 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { | 474 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { |
475 DCHECK(proto.has_effect_node_data()); | 475 DCHECK(proto.has_effect_node_data()); |
476 const proto::EffectNodeData& data = proto.effect_node_data(); | 476 const proto::EffectNodeData& data = proto.effect_node_data(); |
477 | 477 |
478 opacity = data.opacity(); | 478 opacity = data.opacity(); |
479 screen_space_opacity = data.screen_space_opacity(); | 479 screen_space_opacity = data.screen_space_opacity(); |
480 has_render_surface = data.has_render_surface(); | 480 has_render_surface = data.has_render_surface(); |
481 has_copy_request = data.has_copy_request(); | 481 has_copy_request = data.has_copy_request(); |
482 has_background_filters = data.has_background_filters(); | 482 has_background_filters = data.has_background_filters(); |
483 is_drawn = data.is_drawn(); | 483 is_drawn = data.is_drawn(); |
484 has_animated_opacity = data.has_animated_opacity(); | 484 has_animated_opacity = data.has_animated_opacity(); |
485 opacity_changed = data.opacity_changed(); | 485 effect_changed = data.effect_changed(); |
486 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); | 486 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); |
487 transform_id = data.transform_id(); | 487 transform_id = data.transform_id(); |
488 clip_id = data.clip_id(); | 488 clip_id = data.clip_id(); |
489 } | 489 } |
490 | 490 |
491 ScrollNodeData::ScrollNodeData() | 491 ScrollNodeData::ScrollNodeData() |
492 : scrollable(false), | 492 : scrollable(false), |
493 main_thread_scrolling_reasons( | 493 main_thread_scrolling_reasons( |
494 MainThreadScrollingReason::kNotScrollingOnMain), | 494 MainThreadScrollingReason::kNotScrollingOnMain), |
495 contains_non_fast_scrollable_region(false), | 495 contains_non_fast_scrollable_region(false), |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1171 if (node->data.has_copy_request || node->data.has_background_filters) | 1171 if (node->data.has_copy_request || node->data.has_background_filters) |
1172 node->data.is_drawn = true; | 1172 node->data.is_drawn = true; |
1173 else if (node->data.opacity == 0.f && !node->data.has_animated_opacity) | 1173 else if (node->data.opacity == 0.f && !node->data.has_animated_opacity) |
1174 node->data.is_drawn = false; | 1174 node->data.is_drawn = false; |
1175 else if (parent_node) | 1175 else if (parent_node) |
1176 node->data.is_drawn = parent_node->data.is_drawn; | 1176 node->data.is_drawn = parent_node->data.is_drawn; |
1177 else | 1177 else |
1178 node->data.is_drawn = true; | 1178 node->data.is_drawn = true; |
1179 } | 1179 } |
1180 | 1180 |
1181 void EffectTree::UpdateOpacityChanged(EffectNode* node, | 1181 void EffectTree::UpdateEffectChanged(EffectNode* node, |
1182 EffectNode* parent_node) { | 1182 EffectNode* parent_node) { |
1183 if (parent_node && parent_node->data.opacity_changed) { | 1183 if (parent_node && parent_node->data.effect_changed) { |
1184 node->data.opacity_changed = true; | 1184 node->data.effect_changed = true; |
1185 } | 1185 } |
1186 } | 1186 } |
1187 | 1187 |
1188 void EffectTree::UpdateEffects(int id) { | 1188 void EffectTree::UpdateEffects(int id) { |
1189 EffectNode* node = Node(id); | 1189 EffectNode* node = Node(id); |
1190 EffectNode* parent_node = parent(node); | 1190 EffectNode* parent_node = parent(node); |
1191 | 1191 |
1192 UpdateOpacities(node, parent_node); | 1192 UpdateOpacities(node, parent_node); |
1193 UpdateIsDrawn(node, parent_node); | 1193 UpdateIsDrawn(node, parent_node); |
1194 UpdateOpacityChanged(node, parent_node); | 1194 UpdateEffectChanged(node, parent_node); |
1195 } | 1195 } |
1196 | 1196 |
1197 void EffectTree::ClearCopyRequests() { | 1197 void EffectTree::ClearCopyRequests() { |
1198 for (auto& node : nodes()) { | 1198 for (auto& node : nodes()) { |
1199 node.data.num_copy_requests_in_subtree = 0; | 1199 node.data.num_copy_requests_in_subtree = 0; |
1200 node.data.has_copy_request = false; | 1200 node.data.has_copy_request = false; |
1201 } | 1201 } |
1202 set_needs_update(true); | 1202 set_needs_update(true); |
1203 } | 1203 } |
1204 | 1204 |
1205 bool EffectTree::ContributesToDrawnSurface(int id) { | 1205 bool EffectTree::ContributesToDrawnSurface(int id) { |
1206 // All drawn nodes contribute to drawn surface. | 1206 // All drawn nodes contribute to drawn surface. |
1207 // Exception : Nodes that are hidden and are drawn only for the sake of | 1207 // Exception : Nodes that are hidden and are drawn only for the sake of |
1208 // copy requests. | 1208 // copy requests. |
1209 EffectNode* node = Node(id); | 1209 EffectNode* node = Node(id); |
1210 EffectNode* parent_node = parent(node); | 1210 EffectNode* parent_node = parent(node); |
1211 bool contributes_to_drawn_surface = | 1211 bool contributes_to_drawn_surface = |
1212 node->data.is_drawn && | 1212 node->data.is_drawn && |
1213 (node->data.opacity != 0.f || node->data.has_animated_opacity || | 1213 (node->data.opacity != 0.f || node->data.has_animated_opacity || |
1214 node->data.has_background_filters); | 1214 node->data.has_background_filters); |
1215 if (parent_node && !parent_node->data.is_drawn) | 1215 if (parent_node && !parent_node->data.is_drawn) |
1216 contributes_to_drawn_surface = false; | 1216 contributes_to_drawn_surface = false; |
1217 return contributes_to_drawn_surface; | 1217 return contributes_to_drawn_surface; |
1218 } | 1218 } |
1219 | 1219 |
1220 void EffectTree::ResetChangeTracking() { | 1220 void EffectTree::ResetChangeTracking() { |
1221 for (int id = 1; id < static_cast<int>(size()); ++id) { | 1221 for (int id = 1; id < static_cast<int>(size()); ++id) { |
1222 EffectNode* node = Node(id); | 1222 EffectNode* node = Node(id); |
1223 node->data.opacity_changed = false; | 1223 node->data.effect_changed = false; |
1224 } | 1224 } |
1225 } | 1225 } |
1226 | 1226 |
1227 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( | 1227 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( |
1228 TransformNode* node, | 1228 TransformNode* node, |
1229 TransformNode* parent_node) { | 1229 TransformNode* parent_node) { |
1230 node->data.node_and_ancestors_have_only_integer_translation = | 1230 node->data.node_and_ancestors_have_only_integer_translation = |
1231 node->data.to_parent.IsIdentityOrIntegerTranslation(); | 1231 node->data.to_parent.IsIdentityOrIntegerTranslation(); |
1232 if (parent_node) | 1232 if (parent_node) |
1233 node->data.node_and_ancestors_have_only_integer_translation = | 1233 node->data.node_and_ancestors_have_only_integer_translation = |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1396 screen_space_transform.ConcatTransform(transform_node->data.to_screen); | 1396 screen_space_transform.ConcatTransform(transform_node->data.to_screen); |
1397 if (scroll_node->data.should_flatten) | 1397 if (scroll_node->data.should_flatten) |
1398 screen_space_transform.FlattenTo2d(); | 1398 screen_space_transform.FlattenTo2d(); |
1399 return screen_space_transform; | 1399 return screen_space_transform; |
1400 } | 1400 } |
1401 | 1401 |
1402 PropertyTrees::PropertyTrees() | 1402 PropertyTrees::PropertyTrees() |
1403 : needs_rebuild(true), | 1403 : needs_rebuild(true), |
1404 non_root_surfaces_enabled(true), | 1404 non_root_surfaces_enabled(true), |
1405 changed(false), | 1405 changed(false), |
| 1406 full_tree_damaged(false), |
1406 sequence_number(0) { | 1407 sequence_number(0) { |
1407 transform_tree.SetPropertyTrees(this); | 1408 transform_tree.SetPropertyTrees(this); |
1408 effect_tree.SetPropertyTrees(this); | 1409 effect_tree.SetPropertyTrees(this); |
1409 clip_tree.SetPropertyTrees(this); | 1410 clip_tree.SetPropertyTrees(this); |
1410 scroll_tree.SetPropertyTrees(this); | 1411 scroll_tree.SetPropertyTrees(this); |
1411 } | 1412 } |
1412 | 1413 |
1413 PropertyTrees::~PropertyTrees() {} | 1414 PropertyTrees::~PropertyTrees() {} |
1414 | 1415 |
1415 bool PropertyTrees::operator==(const PropertyTrees& other) const { | 1416 bool PropertyTrees::operator==(const PropertyTrees& other) const { |
1416 return transform_tree == other.transform_tree && | 1417 return transform_tree == other.transform_tree && |
1417 effect_tree == other.effect_tree && clip_tree == other.clip_tree && | 1418 effect_tree == other.effect_tree && clip_tree == other.clip_tree && |
1418 scroll_tree == other.scroll_tree && | 1419 scroll_tree == other.scroll_tree && |
1419 needs_rebuild == other.needs_rebuild && changed == other.changed && | 1420 needs_rebuild == other.needs_rebuild && changed == other.changed && |
| 1421 full_tree_damaged == other.full_tree_damaged && |
1420 non_root_surfaces_enabled == other.non_root_surfaces_enabled && | 1422 non_root_surfaces_enabled == other.non_root_surfaces_enabled && |
1421 sequence_number == other.sequence_number; | 1423 sequence_number == other.sequence_number; |
1422 } | 1424 } |
1423 | 1425 |
1424 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) { | 1426 PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) { |
1425 transform_tree = from.transform_tree; | 1427 transform_tree = from.transform_tree; |
1426 effect_tree = from.effect_tree; | 1428 effect_tree = from.effect_tree; |
1427 clip_tree = from.clip_tree; | 1429 clip_tree = from.clip_tree; |
1428 scroll_tree = from.scroll_tree; | 1430 scroll_tree = from.scroll_tree; |
1429 needs_rebuild = from.needs_rebuild; | 1431 needs_rebuild = from.needs_rebuild; |
1430 changed = from.changed; | 1432 changed = from.changed; |
| 1433 full_tree_damaged = from.full_tree_damaged; |
1431 non_root_surfaces_enabled = from.non_root_surfaces_enabled; | 1434 non_root_surfaces_enabled = from.non_root_surfaces_enabled; |
1432 sequence_number = from.sequence_number; | 1435 sequence_number = from.sequence_number; |
1433 inner_viewport_container_bounds_delta_ = | 1436 inner_viewport_container_bounds_delta_ = |
1434 from.inner_viewport_container_bounds_delta(); | 1437 from.inner_viewport_container_bounds_delta(); |
1435 outer_viewport_container_bounds_delta_ = | 1438 outer_viewport_container_bounds_delta_ = |
1436 from.outer_viewport_container_bounds_delta(); | 1439 from.outer_viewport_container_bounds_delta(); |
1437 inner_viewport_scroll_bounds_delta_ = | 1440 inner_viewport_scroll_bounds_delta_ = |
1438 from.inner_viewport_scroll_bounds_delta(); | 1441 from.inner_viewport_scroll_bounds_delta(); |
1439 transform_tree.SetPropertyTrees(this); | 1442 transform_tree.SetPropertyTrees(this); |
1440 effect_tree.SetPropertyTrees(this); | 1443 effect_tree.SetPropertyTrees(this); |
1441 clip_tree.SetPropertyTrees(this); | 1444 clip_tree.SetPropertyTrees(this); |
1442 scroll_tree.SetPropertyTrees(this); | 1445 scroll_tree.SetPropertyTrees(this); |
1443 return *this; | 1446 return *this; |
1444 } | 1447 } |
1445 | 1448 |
1446 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { | 1449 void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { |
1447 // TODO(khushalsagar): Add support for sending diffs when serializaing | 1450 // TODO(khushalsagar): Add support for sending diffs when serializaing |
1448 // property trees. See crbug/555370. | 1451 // property trees. See crbug/555370. |
1449 transform_tree.ToProtobuf(proto->mutable_transform_tree()); | 1452 transform_tree.ToProtobuf(proto->mutable_transform_tree()); |
1450 effect_tree.ToProtobuf(proto->mutable_effect_tree()); | 1453 effect_tree.ToProtobuf(proto->mutable_effect_tree()); |
1451 clip_tree.ToProtobuf(proto->mutable_clip_tree()); | 1454 clip_tree.ToProtobuf(proto->mutable_clip_tree()); |
1452 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); | 1455 scroll_tree.ToProtobuf(proto->mutable_scroll_tree()); |
1453 proto->set_needs_rebuild(needs_rebuild); | 1456 proto->set_needs_rebuild(needs_rebuild); |
1454 proto->set_changed(changed); | 1457 proto->set_changed(changed); |
| 1458 proto->set_full_tree_damaged(full_tree_damaged); |
1455 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); | 1459 proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); |
1456 | 1460 |
1457 // TODO(khushalsagar): Consider using the sequence number to decide if | 1461 // TODO(khushalsagar): Consider using the sequence number to decide if |
1458 // property trees need to be serialized again for a commit. See crbug/555370. | 1462 // property trees need to be serialized again for a commit. See crbug/555370. |
1459 proto->set_sequence_number(sequence_number); | 1463 proto->set_sequence_number(sequence_number); |
1460 } | 1464 } |
1461 | 1465 |
1462 // static | 1466 // static |
1463 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { | 1467 void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) { |
1464 transform_tree.FromProtobuf(proto.transform_tree()); | 1468 transform_tree.FromProtobuf(proto.transform_tree()); |
1465 effect_tree.FromProtobuf(proto.effect_tree()); | 1469 effect_tree.FromProtobuf(proto.effect_tree()); |
1466 clip_tree.FromProtobuf(proto.clip_tree()); | 1470 clip_tree.FromProtobuf(proto.clip_tree()); |
1467 scroll_tree.FromProtobuf(proto.scroll_tree()); | 1471 scroll_tree.FromProtobuf(proto.scroll_tree()); |
1468 | 1472 |
1469 needs_rebuild = proto.needs_rebuild(); | 1473 needs_rebuild = proto.needs_rebuild(); |
1470 changed = proto.changed(); | 1474 changed = proto.changed(); |
| 1475 full_tree_damaged = proto.full_tree_damaged(); |
1471 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); | 1476 non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); |
1472 sequence_number = proto.sequence_number(); | 1477 sequence_number = proto.sequence_number(); |
1473 | 1478 |
1474 transform_tree.SetPropertyTrees(this); | 1479 transform_tree.SetPropertyTrees(this); |
1475 effect_tree.SetPropertyTrees(this); | 1480 effect_tree.SetPropertyTrees(this); |
1476 clip_tree.SetPropertyTrees(this); | 1481 clip_tree.SetPropertyTrees(this); |
1477 scroll_tree.SetPropertyTrees(this); | 1482 scroll_tree.SetPropertyTrees(this); |
1478 } | 1483 } |
1479 | 1484 |
1480 void PropertyTrees::SetInnerViewportContainerBoundsDelta( | 1485 void PropertyTrees::SetInnerViewportContainerBoundsDelta( |
(...skipping 15 matching lines...) Expand all Loading... |
1496 } | 1501 } |
1497 | 1502 |
1498 void PropertyTrees::SetInnerViewportScrollBoundsDelta( | 1503 void PropertyTrees::SetInnerViewportScrollBoundsDelta( |
1499 gfx::Vector2dF bounds_delta) { | 1504 gfx::Vector2dF bounds_delta) { |
1500 inner_viewport_scroll_bounds_delta_ = bounds_delta; | 1505 inner_viewport_scroll_bounds_delta_ = bounds_delta; |
1501 } | 1506 } |
1502 | 1507 |
1503 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { | 1508 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { |
1504 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 1509 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { |
1505 EffectNode* node = effect_tree.Node(id); | 1510 EffectNode* node = effect_tree.Node(id); |
1506 if (node->data.opacity_changed) { | 1511 if (node->data.effect_changed) { |
1507 EffectNode* target_node = tree->effect_tree.Node(node->id); | 1512 EffectNode* target_node = tree->effect_tree.Node(node->id); |
1508 target_node->data.opacity_changed = true; | 1513 target_node->data.effect_changed = true; |
1509 } | 1514 } |
1510 } | 1515 } |
1511 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { | 1516 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { |
1512 TransformNode* node = transform_tree.Node(id); | 1517 TransformNode* node = transform_tree.Node(id); |
1513 if (node->data.transform_changed) { | 1518 if (node->data.transform_changed) { |
1514 TransformNode* target_node = tree->transform_tree.Node(node->id); | 1519 TransformNode* target_node = tree->transform_tree.Node(node->id); |
1515 target_node->data.transform_changed = true; | 1520 target_node->data.transform_changed = true; |
1516 } | 1521 } |
1517 } | 1522 } |
| 1523 tree->full_tree_damaged = full_tree_damaged; |
| 1524 } |
| 1525 |
| 1526 void PropertyTrees::ResetAllChangeTracking(ResetFlags flag) { |
| 1527 switch (flag) { |
| 1528 case EFFECT_TREE: |
| 1529 effect_tree.ResetChangeTracking(); |
| 1530 break; |
| 1531 case TRANSFORM_TREE: |
| 1532 transform_tree.ResetChangeTracking(); |
| 1533 break; |
| 1534 case ALL_TREES: |
| 1535 transform_tree.ResetChangeTracking(); |
| 1536 effect_tree.ResetChangeTracking(); |
| 1537 } |
| 1538 changed = false; |
| 1539 full_tree_damaged = false; |
1518 } | 1540 } |
1519 | 1541 |
1520 } // namespace cc | 1542 } // namespace cc |
OLD | NEW |