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