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_host_->property_trees(); | 474 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
475 auto effect_id_to_index = | 475 if (EffectNode* node = |
476 property_trees->layer_id_to_effect_node_index.find(id()); | 476 property_trees->effect_tree.FindNodeFromOwningLayerId(id())) { |
477 if (effect_id_to_index != | |
478 property_trees->layer_id_to_effect_node_index.end()) { | |
479 EffectNode* node = | |
480 property_trees->effect_tree.Node(effect_id_to_index->second); | |
481 node->opacity = opacity; | 477 node->opacity = opacity; |
482 node->effect_changed = true; | 478 node->effect_changed = true; |
483 property_trees->effect_tree.set_needs_update(true); | 479 property_trees->effect_tree.set_needs_update(true); |
484 SetNeedsCommitNoRebuild(); | 480 SetNeedsCommitNoRebuild(); |
485 return; | 481 return; |
486 } | 482 } |
487 } | 483 } |
488 SetNeedsCommit(); | 484 SetNeedsCommit(); |
489 } | 485 } |
490 | 486 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 DCHECK(IsPropertyChangeAllowed()); | 568 DCHECK(IsPropertyChangeAllowed()); |
573 if (inputs_.position == position) | 569 if (inputs_.position == position) |
574 return; | 570 return; |
575 inputs_.position = position; | 571 inputs_.position = position; |
576 | 572 |
577 if (!layer_tree_host_) | 573 if (!layer_tree_host_) |
578 return; | 574 return; |
579 | 575 |
580 SetSubtreePropertyChanged(); | 576 SetSubtreePropertyChanged(); |
581 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 577 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
582 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 578 if (TransformNode* transform_node = |
583 id())) { | 579 property_trees->transform_tree.FindNodeFromOwningLayerId(id())) { |
584 DCHECK_EQ(transform_tree_index(), | 580 DCHECK_EQ(transform_tree_index(), transform_node->id); |
585 property_trees->layer_id_to_transform_node_index[id()]); | |
586 TransformNode* transform_node = | |
587 property_trees->transform_tree.Node(transform_tree_index()); | |
588 transform_node->update_post_local_transform(position, transform_origin()); | 581 transform_node->update_post_local_transform(position, transform_origin()); |
589 if (transform_node->sticky_position_constraint_id >= 0) { | 582 if (transform_node->sticky_position_constraint_id >= 0) { |
590 StickyPositionNodeData* sticky_data = | 583 StickyPositionNodeData* sticky_data = |
591 property_trees->transform_tree.StickyPositionData( | 584 property_trees->transform_tree.StickyPositionData( |
592 transform_tree_index()); | 585 transform_tree_index()); |
593 sticky_data->main_thread_offset = | 586 sticky_data->main_thread_offset = |
594 position.OffsetFromOrigin() - | 587 position.OffsetFromOrigin() - |
595 sticky_data->constraints.parent_relative_sticky_box_offset | 588 sticky_data->constraints.parent_relative_sticky_box_offset |
596 .OffsetFromOrigin(); | 589 .OffsetFromOrigin(); |
597 } | 590 } |
(...skipping 27 matching lines...) Expand all Loading... |
625 } | 618 } |
626 | 619 |
627 void Layer::SetTransform(const gfx::Transform& transform) { | 620 void Layer::SetTransform(const gfx::Transform& transform) { |
628 DCHECK(IsPropertyChangeAllowed()); | 621 DCHECK(IsPropertyChangeAllowed()); |
629 if (inputs_.transform == transform) | 622 if (inputs_.transform == transform) |
630 return; | 623 return; |
631 | 624 |
632 SetSubtreePropertyChanged(); | 625 SetSubtreePropertyChanged(); |
633 if (layer_tree_host_) { | 626 if (layer_tree_host_) { |
634 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 627 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
635 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 628 if (TransformNode* transform_node = |
636 id())) { | 629 property_trees->transform_tree.FindNodeFromOwningLayerId(id())) { |
637 // We need to trigger a rebuild if we could have affected 2d axis | 630 // We need to trigger a rebuild if we could have affected 2d axis |
638 // alignment. We'll check to see if transform and inputs_.transform | 631 // alignment. We'll check to see if transform and inputs_.transform are |
639 // are axis | 632 // axis align with respect to one another. |
640 // align with respect to one another. | 633 DCHECK_EQ(transform_tree_index(), transform_node->id); |
641 DCHECK_EQ(transform_tree_index(), | |
642 property_trees->layer_id_to_transform_node_index[id()]); | |
643 TransformNode* transform_node = | |
644 property_trees->transform_tree.Node(transform_tree_index()); | |
645 bool preserves_2d_axis_alignment = | 634 bool preserves_2d_axis_alignment = |
646 Are2dAxisAligned(inputs_.transform, transform); | 635 Are2dAxisAligned(inputs_.transform, transform); |
647 transform_node->local = transform; | 636 transform_node->local = transform; |
648 transform_node->needs_local_transform_update = true; | 637 transform_node->needs_local_transform_update = true; |
649 transform_node->transform_changed = true; | 638 transform_node->transform_changed = true; |
650 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); | 639 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); |
651 if (preserves_2d_axis_alignment) | 640 if (preserves_2d_axis_alignment) |
652 SetNeedsCommitNoRebuild(); | 641 SetNeedsCommitNoRebuild(); |
653 else | 642 else |
654 SetNeedsCommit(); | 643 SetNeedsCommit(); |
(...skipping 11 matching lines...) Expand all Loading... |
666 DCHECK(IsPropertyChangeAllowed()); | 655 DCHECK(IsPropertyChangeAllowed()); |
667 if (inputs_.transform_origin == transform_origin) | 656 if (inputs_.transform_origin == transform_origin) |
668 return; | 657 return; |
669 inputs_.transform_origin = transform_origin; | 658 inputs_.transform_origin = transform_origin; |
670 | 659 |
671 if (!layer_tree_host_) | 660 if (!layer_tree_host_) |
672 return; | 661 return; |
673 | 662 |
674 SetSubtreePropertyChanged(); | 663 SetSubtreePropertyChanged(); |
675 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 664 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
676 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 665 if (TransformNode* transform_node = |
677 id())) { | 666 property_trees->transform_tree.FindNodeFromOwningLayerId(id())) { |
678 DCHECK_EQ(transform_tree_index(), | 667 DCHECK_EQ(transform_tree_index(), transform_node->id); |
679 property_trees->layer_id_to_transform_node_index[id()]); | |
680 TransformNode* transform_node = | |
681 property_trees->transform_tree.Node(transform_tree_index()); | |
682 transform_node->update_pre_local_transform(transform_origin); | 668 transform_node->update_pre_local_transform(transform_origin); |
683 transform_node->update_post_local_transform(position(), transform_origin); | 669 transform_node->update_post_local_transform(position(), transform_origin); |
684 transform_node->needs_local_transform_update = true; | 670 transform_node->needs_local_transform_update = true; |
685 transform_node->transform_changed = true; | 671 transform_node->transform_changed = true; |
686 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); | 672 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); |
687 SetNeedsCommitNoRebuild(); | 673 SetNeedsCommitNoRebuild(); |
688 return; | 674 return; |
689 } | 675 } |
690 | 676 |
691 SetNeedsCommit(); | 677 SetNeedsCommit(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 return; | 755 return; |
770 inputs_.scroll_offset = scroll_offset; | 756 inputs_.scroll_offset = scroll_offset; |
771 | 757 |
772 if (!layer_tree_host_) | 758 if (!layer_tree_host_) |
773 return; | 759 return; |
774 | 760 |
775 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 761 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
776 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) | 762 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
777 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); | 763 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
778 | 764 |
779 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 765 if (TransformNode* transform_node = |
780 id())) { | 766 property_trees->transform_tree.FindNodeFromOwningLayerId(id())) { |
781 DCHECK_EQ(transform_tree_index(), | 767 DCHECK_EQ(transform_tree_index(), transform_node->id); |
782 property_trees->layer_id_to_transform_node_index[id()]); | |
783 TransformNode* transform_node = | |
784 property_trees->transform_tree.Node(transform_tree_index()); | |
785 transform_node->scroll_offset = CurrentScrollOffset(); | 768 transform_node->scroll_offset = CurrentScrollOffset(); |
786 transform_node->needs_local_transform_update = true; | 769 transform_node->needs_local_transform_update = true; |
787 property_trees->transform_tree.set_needs_update(true); | 770 property_trees->transform_tree.set_needs_update(true); |
788 SetNeedsCommitNoRebuild(); | 771 SetNeedsCommitNoRebuild(); |
789 return; | 772 return; |
790 } | 773 } |
791 | 774 |
792 SetNeedsCommit(); | 775 SetNeedsCommit(); |
793 } | 776 } |
794 | 777 |
795 void Layer::SetScrollOffsetFromImplSide( | 778 void Layer::SetScrollOffsetFromImplSide( |
796 const gfx::ScrollOffset& scroll_offset) { | 779 const gfx::ScrollOffset& scroll_offset) { |
797 DCHECK(IsPropertyChangeAllowed()); | 780 DCHECK(IsPropertyChangeAllowed()); |
798 // This function only gets called during a BeginMainFrame, so there | 781 // This function only gets called during a BeginMainFrame, so there |
799 // is no need to call SetNeedsUpdate here. | 782 // is no need to call SetNeedsUpdate here. |
800 DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested()); | 783 DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested()); |
801 if (inputs_.scroll_offset == scroll_offset) | 784 if (inputs_.scroll_offset == scroll_offset) |
802 return; | 785 return; |
803 inputs_.scroll_offset = scroll_offset; | 786 inputs_.scroll_offset = scroll_offset; |
804 SetNeedsPushProperties(); | 787 SetNeedsPushProperties(); |
805 | 788 |
806 bool needs_rebuild = true; | 789 bool needs_rebuild = true; |
807 | 790 |
808 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 791 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
809 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) | 792 if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
810 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); | 793 property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
811 | 794 |
812 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 795 if (TransformNode* transform_node = |
813 id())) { | 796 property_trees->transform_tree.FindNodeFromOwningLayerId(id())) { |
814 DCHECK_EQ(transform_tree_index(), | 797 DCHECK_EQ(transform_tree_index(), transform_node->id); |
815 property_trees->layer_id_to_transform_node_index[id()]); | |
816 TransformNode* transform_node = | |
817 property_trees->transform_tree.Node(transform_tree_index()); | |
818 transform_node->scroll_offset = CurrentScrollOffset(); | 798 transform_node->scroll_offset = CurrentScrollOffset(); |
819 transform_node->needs_local_transform_update = true; | 799 transform_node->needs_local_transform_update = true; |
820 property_trees->transform_tree.set_needs_update(true); | 800 property_trees->transform_tree.set_needs_update(true); |
821 needs_rebuild = false; | 801 needs_rebuild = false; |
822 } | 802 } |
823 | 803 |
824 if (needs_rebuild) | 804 if (needs_rebuild) |
825 property_trees->needs_rebuild = true; | 805 property_trees->needs_rebuild = true; |
826 | 806 |
827 if (!inputs_.did_scroll_callback.is_null()) | 807 if (!inputs_.did_scroll_callback.is_null()) |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1340 // Do nothing. Scroll deltas will be sent from the compositor thread back | 1320 // Do nothing. Scroll deltas will be sent from the compositor thread back |
1341 // to the main thread in the same manner as during non-animated | 1321 // to the main thread in the same manner as during non-animated |
1342 // compositor-driven scrolling. | 1322 // compositor-driven scrolling. |
1343 } | 1323 } |
1344 | 1324 |
1345 void Layer::OnIsAnimatingChanged(const PropertyAnimationState& mask, | 1325 void Layer::OnIsAnimatingChanged(const PropertyAnimationState& mask, |
1346 const PropertyAnimationState& state) { | 1326 const PropertyAnimationState& state) { |
1347 DCHECK(layer_tree_host_); | 1327 DCHECK(layer_tree_host_); |
1348 PropertyTrees* property_trees = layer_tree_host_->property_trees(); | 1328 PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
1349 | 1329 |
1350 TransformNode* transform_node = nullptr; | 1330 TransformNode* transform_node = |
1351 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM, | 1331 property_trees->transform_tree.FindNodeFromOwningLayerId(id()); |
1352 id())) { | 1332 DCHECK(!transform_node || transform_node->id == transform_tree_index()); |
1353 DCHECK_EQ(transform_tree_index(), | |
1354 property_trees->layer_id_to_transform_node_index[id()]); | |
1355 transform_node = | |
1356 property_trees->transform_tree.Node(transform_tree_index()); | |
1357 } | |
1358 | 1333 |
1359 EffectNode* effect_node = nullptr; | 1334 EffectNode* effect_node = |
1360 if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT, id())) { | 1335 property_trees->effect_tree.FindNodeFromOwningLayerId(id()); |
1361 DCHECK_EQ(effect_tree_index(), | 1336 DCHECK(!effect_node || effect_node->id == effect_tree_index()); |
1362 property_trees->layer_id_to_effect_node_index[id()]); | |
1363 effect_node = property_trees->effect_tree.Node(effect_tree_index()); | |
1364 } | |
1365 | 1337 |
1366 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; | 1338 for (int property = TargetProperty::FIRST_TARGET_PROPERTY; |
1367 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { | 1339 property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) { |
1368 switch (property) { | 1340 switch (property) { |
1369 case TargetProperty::TRANSFORM: | 1341 case TargetProperty::TRANSFORM: |
1370 if (transform_node) { | 1342 if (transform_node) { |
1371 if (mask.currently_running[property]) | 1343 if (mask.currently_running[property]) |
1372 transform_node->is_currently_animating = | 1344 transform_node->is_currently_animating = |
1373 state.currently_running[property]; | 1345 state.currently_running[property]; |
1374 if (mask.potentially_animating[property]) { | 1346 if (mask.potentially_animating[property]) { |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1530 ->num_copy_requests_in_subtree; | 1502 ->num_copy_requests_in_subtree; |
1531 } | 1503 } |
1532 | 1504 |
1533 gfx::Transform Layer::screen_space_transform() const { | 1505 gfx::Transform Layer::screen_space_transform() const { |
1534 DCHECK_NE(transform_tree_index_, TransformTree::kInvalidNodeId); | 1506 DCHECK_NE(transform_tree_index_, TransformTree::kInvalidNodeId); |
1535 return draw_property_utils::ScreenSpaceTransform( | 1507 return draw_property_utils::ScreenSpaceTransform( |
1536 this, layer_tree_host_->property_trees()->transform_tree); | 1508 this, layer_tree_host_->property_trees()->transform_tree); |
1537 } | 1509 } |
1538 | 1510 |
1539 } // namespace cc | 1511 } // namespace cc |
OLD | NEW |