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 |