| OLD | NEW |
| 1 // Copyright 2010 The Chromium Authors. All rights reserved. | 1 // Copyright 2010 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 "cc/layers/layer.h" | 5 #include "cc/layers/layer.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 | 465 |
| 466 if (inputs_.opacity == opacity) | 466 if (inputs_.opacity == opacity) |
| 467 return; | 467 return; |
| 468 // We need to force a property tree rebuild when opacity changes from 1 to a | 468 // We need to force a property tree rebuild when opacity changes from 1 to a |
| 469 // non-1 value or vice-versa as render surfaces can change. | 469 // non-1 value or vice-versa as render surfaces can change. |
| 470 bool force_rebuild = opacity == 1.f || inputs_.opacity == 1.f; | 470 bool force_rebuild = opacity == 1.f || inputs_.opacity == 1.f; |
| 471 inputs_.opacity = opacity; | 471 inputs_.opacity = opacity; |
| 472 SetSubtreePropertyChanged(); | 472 SetSubtreePropertyChanged(); |
| 473 if (layer_tree_host_ && !force_rebuild) { | 473 if (layer_tree_host_ && !force_rebuild) { |
| 474 PropertyTrees* property_trees = layer_tree_->property_trees(); | 474 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 475 auto effect_id_to_index = property_trees->effect_id_to_index_map.find(id()); | 475 auto effect_id_to_index = |
| 476 if (effect_id_to_index != property_trees->effect_id_to_index_map.end()) { | 476 property_trees->layer_id_to_effect_node_index.find(id()); |
| 477 if (effect_id_to_index != |
| 478 property_trees->layer_id_to_effect_node_index.end()) { |
| 477 EffectNode* node = | 479 EffectNode* node = |
| 478 property_trees->effect_tree.Node(effect_id_to_index->second); | 480 property_trees->effect_tree.Node(effect_id_to_index->second); |
| 479 node->opacity = opacity; | 481 node->opacity = opacity; |
| 480 node->effect_changed = true; | 482 node->effect_changed = true; |
| 481 property_trees->effect_tree.set_needs_update(true); | 483 property_trees->effect_tree.set_needs_update(true); |
| 482 SetNeedsCommitNoRebuild(); | 484 SetNeedsCommitNoRebuild(); |
| 483 return; | 485 return; |
| 484 } | 486 } |
| 485 } | 487 } |
| 486 SetNeedsCommit(); | 488 SetNeedsCommit(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 inputs_.position = position; | 574 inputs_.position = position; |
| 573 | 575 |
| 574 if (!layer_tree_host_) | 576 if (!layer_tree_host_) |
| 575 return; | 577 return; |
| 576 | 578 |
| 577 SetSubtreePropertyChanged(); | 579 SetSubtreePropertyChanged(); |
| 578 PropertyTrees* property_trees = layer_tree_->property_trees(); | 580 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 579 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 581 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 580 id())) { | 582 id())) { |
| 581 DCHECK_EQ(transform_tree_index(), | 583 DCHECK_EQ(transform_tree_index(), |
| 582 property_trees->transform_id_to_index_map[id()]); | 584 property_trees->layer_id_to_transform_node_index[id()]); |
| 583 TransformNode* transform_node = | 585 TransformNode* transform_node = |
| 584 property_trees->transform_tree.Node(transform_tree_index()); | 586 property_trees->transform_tree.Node(transform_tree_index()); |
| 585 transform_node->update_post_local_transform(position, transform_origin()); | 587 transform_node->update_post_local_transform(position, transform_origin()); |
| 586 if (transform_node->sticky_position_constraint_id >= 0) { | 588 if (transform_node->sticky_position_constraint_id >= 0) { |
| 587 StickyPositionNodeData* sticky_data = | 589 StickyPositionNodeData* sticky_data = |
| 588 property_trees->transform_tree.StickyPositionData( | 590 property_trees->transform_tree.StickyPositionData( |
| 589 transform_tree_index()); | 591 transform_tree_index()); |
| 590 sticky_data->main_thread_offset = | 592 sticky_data->main_thread_offset = |
| 591 position.OffsetFromOrigin() - | 593 position.OffsetFromOrigin() - |
| 592 sticky_data->constraints.parent_relative_sticky_box_offset | 594 sticky_data->constraints.parent_relative_sticky_box_offset |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 633 SetSubtreePropertyChanged(); | 635 SetSubtreePropertyChanged(); |
| 634 if (layer_tree_host_) { | 636 if (layer_tree_host_) { |
| 635 PropertyTrees* property_trees = layer_tree_->property_trees(); | 637 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 636 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 638 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 637 id())) { | 639 id())) { |
| 638 // We need to trigger a rebuild if we could have affected 2d axis | 640 // We need to trigger a rebuild if we could have affected 2d axis |
| 639 // alignment. We'll check to see if transform and inputs_.transform | 641 // alignment. We'll check to see if transform and inputs_.transform |
| 640 // are axis | 642 // are axis |
| 641 // align with respect to one another. | 643 // align with respect to one another. |
| 642 DCHECK_EQ(transform_tree_index(), | 644 DCHECK_EQ(transform_tree_index(), |
| 643 property_trees->transform_id_to_index_map[id()]); | 645 property_trees->layer_id_to_transform_node_index[id()]); |
| 644 TransformNode* transform_node = | 646 TransformNode* transform_node = |
| 645 property_trees->transform_tree.Node(transform_tree_index()); | 647 property_trees->transform_tree.Node(transform_tree_index()); |
| 646 bool preserves_2d_axis_alignment = | 648 bool preserves_2d_axis_alignment = |
| 647 Are2dAxisAligned(inputs_.transform, transform); | 649 Are2dAxisAligned(inputs_.transform, transform); |
| 648 transform_node->local = transform; | 650 transform_node->local = transform; |
| 649 transform_node->needs_local_transform_update = true; | 651 transform_node->needs_local_transform_update = true; |
| 650 transform_node->transform_changed = true; | 652 transform_node->transform_changed = true; |
| 651 layer_tree_->property_trees()->transform_tree.set_needs_update(true); | 653 layer_tree_->property_trees()->transform_tree.set_needs_update(true); |
| 652 if (preserves_2d_axis_alignment) | 654 if (preserves_2d_axis_alignment) |
| 653 SetNeedsCommitNoRebuild(); | 655 SetNeedsCommitNoRebuild(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 670 inputs_.transform_origin = transform_origin; | 672 inputs_.transform_origin = transform_origin; |
| 671 | 673 |
| 672 if (!layer_tree_host_) | 674 if (!layer_tree_host_) |
| 673 return; | 675 return; |
| 674 | 676 |
| 675 SetSubtreePropertyChanged(); | 677 SetSubtreePropertyChanged(); |
| 676 PropertyTrees* property_trees = layer_tree_->property_trees(); | 678 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 677 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 679 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 678 id())) { | 680 id())) { |
| 679 DCHECK_EQ(transform_tree_index(), | 681 DCHECK_EQ(transform_tree_index(), |
| 680 property_trees->transform_id_to_index_map[id()]); | 682 property_trees->layer_id_to_transform_node_index[id()]); |
| 681 TransformNode* transform_node = | 683 TransformNode* transform_node = |
| 682 property_trees->transform_tree.Node(transform_tree_index()); | 684 property_trees->transform_tree.Node(transform_tree_index()); |
| 683 transform_node->update_pre_local_transform(transform_origin); | 685 transform_node->update_pre_local_transform(transform_origin); |
| 684 transform_node->update_post_local_transform(position(), transform_origin); | 686 transform_node->update_post_local_transform(position(), transform_origin); |
| 685 transform_node->needs_local_transform_update = true; | 687 transform_node->needs_local_transform_update = true; |
| 686 transform_node->transform_changed = true; | 688 transform_node->transform_changed = true; |
| 687 layer_tree_->property_trees()->transform_tree.set_needs_update(true); | 689 layer_tree_->property_trees()->transform_tree.set_needs_update(true); |
| 688 SetNeedsCommitNoRebuild(); | 690 SetNeedsCommitNoRebuild(); |
| 689 return; | 691 return; |
| 690 } | 692 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 if (!layer_tree_host_) | 775 if (!layer_tree_host_) |
| 774 return; | 776 return; |
| 775 | 777 |
| 776 PropertyTrees* property_trees = layer_tree_->property_trees(); | 778 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 777 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) | 779 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
| 778 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); | 780 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
| 779 | 781 |
| 780 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 782 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 781 id())) { | 783 id())) { |
| 782 DCHECK_EQ(transform_tree_index(), | 784 DCHECK_EQ(transform_tree_index(), |
| 783 property_trees->transform_id_to_index_map[id()]); | 785 property_trees->layer_id_to_transform_node_index[id()]); |
| 784 TransformNode* transform_node = | 786 TransformNode* transform_node = |
| 785 property_trees->transform_tree.Node(transform_tree_index()); | 787 property_trees->transform_tree.Node(transform_tree_index()); |
| 786 transform_node->scroll_offset = CurrentScrollOffset(); | 788 transform_node->scroll_offset = CurrentScrollOffset(); |
| 787 transform_node->needs_local_transform_update = true; | 789 transform_node->needs_local_transform_update = true; |
| 788 property_trees->transform_tree.set_needs_update(true); | 790 property_trees->transform_tree.set_needs_update(true); |
| 789 SetNeedsCommitNoRebuild(); | 791 SetNeedsCommitNoRebuild(); |
| 790 return; | 792 return; |
| 791 } | 793 } |
| 792 | 794 |
| 793 SetNeedsCommit(); | 795 SetNeedsCommit(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 806 | 808 |
| 807 bool needs_rebuild = true; | 809 bool needs_rebuild = true; |
| 808 | 810 |
| 809 PropertyTrees* property_trees = layer_tree_->property_trees(); | 811 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 810 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) | 812 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
| 811 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); | 813 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
| 812 | 814 |
| 813 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 815 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 814 id())) { | 816 id())) { |
| 815 DCHECK_EQ(transform_tree_index(), | 817 DCHECK_EQ(transform_tree_index(), |
| 816 property_trees->transform_id_to_index_map[id()]); | 818 property_trees->layer_id_to_transform_node_index[id()]); |
| 817 TransformNode* transform_node = | 819 TransformNode* transform_node = |
| 818 property_trees->transform_tree.Node(transform_tree_index()); | 820 property_trees->transform_tree.Node(transform_tree_index()); |
| 819 transform_node->scroll_offset = CurrentScrollOffset(); | 821 transform_node->scroll_offset = CurrentScrollOffset(); |
| 820 transform_node->needs_local_transform_update = true; | 822 transform_node->needs_local_transform_update = true; |
| 821 property_trees->transform_tree.set_needs_update(true); | 823 property_trees->transform_tree.set_needs_update(true); |
| 822 needs_rebuild = false; | 824 needs_rebuild = false; |
| 823 } | 825 } |
| 824 | 826 |
| 825 if (needs_rebuild) | 827 if (needs_rebuild) |
| 826 property_trees->needs_rebuild = true; | 828 property_trees->needs_rebuild = true; |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1415 return; | 1417 return; |
| 1416 inputs_.opacity = opacity; | 1418 inputs_.opacity = opacity; |
| 1417 // Changing the opacity may make a previously hidden layer visible, so a new | 1419 // Changing the opacity may make a previously hidden layer visible, so a new |
| 1418 // recording may be needed. | 1420 // recording may be needed. |
| 1419 SetNeedsUpdate(); | 1421 SetNeedsUpdate(); |
| 1420 if (layer_tree_host_) { | 1422 if (layer_tree_host_) { |
| 1421 PropertyTrees* property_trees = layer_tree_->property_trees(); | 1423 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 1422 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, | 1424 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, |
| 1423 id())) { | 1425 id())) { |
| 1424 DCHECK_EQ(effect_tree_index(), | 1426 DCHECK_EQ(effect_tree_index(), |
| 1425 property_trees->effect_id_to_index_map[id()]); | 1427 property_trees->layer_id_to_effect_node_index[id()]); |
| 1426 EffectNode* node = property_trees->effect_tree.Node(effect_tree_index()); | 1428 EffectNode* node = property_trees->effect_tree.Node(effect_tree_index()); |
| 1427 node->opacity = opacity; | 1429 node->opacity = opacity; |
| 1428 property_trees->effect_tree.set_needs_update(true); | 1430 property_trees->effect_tree.set_needs_update(true); |
| 1429 } | 1431 } |
| 1430 } | 1432 } |
| 1431 } | 1433 } |
| 1432 | 1434 |
| 1433 void Layer::OnTransformAnimated(const gfx::Transform& transform) { | 1435 void Layer::OnTransformAnimated(const gfx::Transform& transform) { |
| 1434 if (inputs_.transform == transform) | 1436 if (inputs_.transform == transform) |
| 1435 return; | 1437 return; |
| 1436 inputs_.transform = transform; | 1438 inputs_.transform = transform; |
| 1437 // Changing the transform may change the visible part of this layer, so a new | 1439 // Changing the transform may change the visible part of this layer, so a new |
| 1438 // recording may be needed. | 1440 // recording may be needed. |
| 1439 SetNeedsUpdate(); | 1441 SetNeedsUpdate(); |
| 1440 if (layer_tree_host_) { | 1442 if (layer_tree_host_) { |
| 1441 PropertyTrees* property_trees = layer_tree_->property_trees(); | 1443 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 1442 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 1444 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 1443 id())) { | 1445 id())) { |
| 1444 DCHECK_EQ(transform_tree_index(), | 1446 DCHECK_EQ(transform_tree_index(), |
| 1445 property_trees->transform_id_to_index_map[id()]); | 1447 property_trees->layer_id_to_transform_node_index[id()]); |
| 1446 TransformNode* node = | 1448 TransformNode* node = |
| 1447 property_trees->transform_tree.Node(transform_tree_index()); | 1449 property_trees->transform_tree.Node(transform_tree_index()); |
| 1448 node->local = transform; | 1450 node->local = transform; |
| 1449 node->needs_local_transform_update = true; | 1451 node->needs_local_transform_update = true; |
| 1450 node->has_potential_animation = true; | 1452 node->has_potential_animation = true; |
| 1451 property_trees->transform_tree.set_needs_update(true); | 1453 property_trees->transform_tree.set_needs_update(true); |
| 1452 } | 1454 } |
| 1453 } | 1455 } |
| 1454 } | 1456 } |
| 1455 | 1457 |
| 1456 void Layer::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) { | 1458 void Layer::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) { |
| 1457 // Do nothing. Scroll deltas will be sent from the compositor thread back | 1459 // Do nothing. Scroll deltas will be sent from the compositor thread back |
| 1458 // to the main thread in the same manner as during non-animated | 1460 // to the main thread in the same manner as during non-animated |
| 1459 // compositor-driven scrolling. | 1461 // compositor-driven scrolling. |
| 1460 } | 1462 } |
| 1461 | 1463 |
| 1462 void Layer::OnIsAnimatingChanged(const PropertyAnimationState& mask, | 1464 void Layer::OnIsAnimatingChanged(const PropertyAnimationState& mask, |
| 1463 const PropertyAnimationState& state) { | 1465 const PropertyAnimationState& state) { |
| 1464 DCHECK(layer_tree_host_); | 1466 DCHECK(layer_tree_host_); |
| 1465 PropertyTrees* property_trees = layer_tree_->property_trees(); | 1467 PropertyTrees* property_trees = layer_tree_->property_trees(); |
| 1466 | 1468 |
| 1467 TransformNode* transform_node = nullptr; | 1469 TransformNode* transform_node = nullptr; |
| 1468 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 1470 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, |
| 1469 id())) { | 1471 id())) { |
| 1470 DCHECK_EQ(transform_tree_index(), | 1472 DCHECK_EQ(transform_tree_index(), |
| 1471 property_trees->transform_id_to_index_map[id()]); | 1473 property_trees->layer_id_to_transform_node_index[id()]); |
| 1472 transform_node = | 1474 transform_node = |
| 1473 property_trees->transform_tree.Node(transform_tree_index()); | 1475 property_trees->transform_tree.Node(transform_tree_index()); |
| 1474 } | 1476 } |
| 1475 | 1477 |
| 1476 EffectNode* effect_node = nullptr; | 1478 EffectNode* effect_node = nullptr; |
| 1477 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) { | 1479 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) { |
| 1478 DCHECK_EQ(effect_tree_index(), | 1480 DCHECK_EQ(effect_tree_index(), |
| 1479 property_trees->effect_id_to_index_map[id()]); | 1481 property_trees->layer_id_to_effect_node_index[id()]); |
| 1480 effect_node = property_trees->effect_tree.Node(effect_tree_index()); | 1482 effect_node = property_trees->effect_tree.Node(effect_tree_index()); |
| 1481 } | 1483 } |
| 1482 | 1484 |
| 1483 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; | 1485 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; |
| 1484 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { | 1486 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { |
| 1485 switch (property) { | 1487 switch (property) { |
| 1486 case TargetProperty::TRANSFORM: | 1488 case TargetProperty::TRANSFORM: |
| 1487 if (transform_node) { | 1489 if (transform_node) { |
| 1488 if (mask.currently_running[property]) | 1490 if (mask.currently_running[property]) |
| 1489 transform_node->is_currently_animating = | 1491 transform_node->is_currently_animating = |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1663 | 1665 |
| 1664 LayerTree* Layer::GetLayerTree() const { | 1666 LayerTree* Layer::GetLayerTree() const { |
| 1665 return layer_tree_; | 1667 return layer_tree_; |
| 1666 } | 1668 } |
| 1667 | 1669 |
| 1668 void Layer::SetLayerIdForTesting(int id) { | 1670 void Layer::SetLayerIdForTesting(int id) { |
| 1669 inputs_.layer_id = id; | 1671 inputs_.layer_id = id; |
| 1670 } | 1672 } |
| 1671 | 1673 |
| 1672 } // namespace cc | 1674 } // namespace cc |
| OLD | NEW |