OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/animation/element_animations.h" | 5 #include "cc/animation/element_animations.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 OnScrollOffsetAnimated(ElementListType::ACTIVE, scroll_offset); | 493 OnScrollOffsetAnimated(ElementListType::ACTIVE, scroll_offset); |
494 if (notify_pending_elements && has_element_in_pending_list()) | 494 if (notify_pending_elements && has_element_in_pending_list()) |
495 OnScrollOffsetAnimated(ElementListType::PENDING, scroll_offset); | 495 OnScrollOffsetAnimated(ElementListType::PENDING, scroll_offset); |
496 } | 496 } |
497 | 497 |
498 void ElementAnimations::NotifyClientAnimationChanged( | 498 void ElementAnimations::NotifyClientAnimationChanged( |
499 TargetProperty::Type property, | 499 TargetProperty::Type property, |
500 ElementListType list_type, | 500 ElementListType list_type, |
501 bool notify_elements_about_potential_animation, | 501 bool notify_elements_about_potential_animation, |
502 bool notify_elements_about_running_animation) { | 502 bool notify_elements_about_running_animation) { |
503 struct PropertyAnimationState* animation_state = nullptr; | 503 PropertyAnimationState* animation_state = nullptr; |
504 switch (property) { | 504 switch (property) { |
505 case TargetProperty::OPACITY: | 505 case TargetProperty::OPACITY: |
506 animation_state = &opacity_animation_state_; | 506 animation_state = &opacity_animation_state_; |
507 break; | 507 break; |
508 case TargetProperty::TRANSFORM: | 508 case TargetProperty::TRANSFORM: |
509 animation_state = &transform_animation_state_; | 509 animation_state = &transform_animation_state_; |
510 break; | 510 break; |
511 case TargetProperty::FILTER: | 511 case TargetProperty::FILTER: |
512 animation_state = &filter_animation_state_; | 512 animation_state = &filter_animation_state_; |
513 break; | 513 break; |
(...skipping 26 matching lines...) Expand all Loading... |
540 bool currently_animating = | 540 bool currently_animating = |
541 active ? animation_state->currently_running_for_active_elements | 541 active ? animation_state->currently_running_for_active_elements |
542 : animation_state->currently_running_for_pending_elements; | 542 : animation_state->currently_running_for_pending_elements; |
543 IsAnimatingChanged(list_type, property, AnimationChangeType::RUNNING, | 543 IsAnimatingChanged(list_type, property, AnimationChangeType::RUNNING, |
544 currently_animating); | 544 currently_animating); |
545 } | 545 } |
546 } | 546 } |
547 | 547 |
548 void ElementAnimations::UpdateClientAnimationStateInternal( | 548 void ElementAnimations::UpdateClientAnimationStateInternal( |
549 TargetProperty::Type property) { | 549 TargetProperty::Type property) { |
550 struct PropertyAnimationState* animation_state = nullptr; | 550 PropertyAnimationState* animation_state = nullptr; |
551 switch (property) { | 551 switch (property) { |
552 case TargetProperty::OPACITY: | 552 case TargetProperty::OPACITY: |
553 animation_state = &opacity_animation_state_; | 553 animation_state = &opacity_animation_state_; |
554 break; | 554 break; |
555 case TargetProperty::TRANSFORM: | 555 case TargetProperty::TRANSFORM: |
556 animation_state = &transform_animation_state_; | 556 animation_state = &transform_animation_state_; |
557 break; | 557 break; |
558 case TargetProperty::FILTER: | 558 case TargetProperty::FILTER: |
559 animation_state = &filter_animation_state_; | 559 animation_state = &filter_animation_state_; |
560 break; | 560 break; |
561 default: | 561 default: |
562 NOTREACHED(); | 562 NOTREACHED(); |
563 break; | 563 break; |
564 } | 564 } |
565 bool was_currently_running_animation_for_active_elements = | |
566 animation_state->currently_running_for_active_elements; | |
567 bool was_currently_running_animation_for_pending_elements = | |
568 animation_state->currently_running_for_pending_elements; | |
569 bool was_potentially_animating_for_active_elements = | |
570 animation_state->potentially_animating_for_active_elements; | |
571 bool was_potentially_animating_for_pending_elements = | |
572 animation_state->potentially_animating_for_pending_elements; | |
573 | 565 |
| 566 PropertyAnimationState previous_state = *animation_state; |
574 animation_state->Clear(); | 567 animation_state->Clear(); |
575 DCHECK(was_potentially_animating_for_active_elements || | 568 DCHECK(previous_state.IsValid()); |
576 !was_currently_running_animation_for_active_elements); | |
577 DCHECK(was_potentially_animating_for_pending_elements || | |
578 !was_currently_running_animation_for_pending_elements); | |
579 | 569 |
580 for (auto& player : players_list_) { | 570 for (auto& player : players_list_) { |
581 for (const auto& animation : player.animations()) { | 571 PropertyAnimationState player_state; |
582 if (!animation->is_finished() && | 572 player.GetPropertyAnimationStateFor(property, &player_state); |
583 animation->target_property() == property) { | 573 *animation_state |= player_state; |
584 animation_state->potentially_animating_for_active_elements |= | |
585 animation->affects_active_elements(); | |
586 animation_state->potentially_animating_for_pending_elements |= | |
587 animation->affects_pending_elements(); | |
588 animation_state->currently_running_for_active_elements |= | |
589 animation->affects_active_elements() && | |
590 animation->InEffect(last_tick_time_); | |
591 animation_state->currently_running_for_pending_elements |= | |
592 animation->affects_pending_elements() && | |
593 animation->InEffect(last_tick_time_); | |
594 } | |
595 } | |
596 } | 574 } |
597 | 575 |
598 bool potentially_animating_changed_for_active_elements = | 576 if (*animation_state == previous_state) |
599 was_potentially_animating_for_active_elements != | |
600 animation_state->potentially_animating_for_active_elements; | |
601 bool potentially_animating_changed_for_pending_elements = | |
602 was_potentially_animating_for_pending_elements != | |
603 animation_state->potentially_animating_for_pending_elements; | |
604 bool currently_running_animation_changed_for_active_elements = | |
605 was_currently_running_animation_for_active_elements != | |
606 animation_state->currently_running_for_active_elements; | |
607 bool currently_running_animation_changed_for_pending_elements = | |
608 was_currently_running_animation_for_pending_elements != | |
609 animation_state->currently_running_for_pending_elements; | |
610 if (!potentially_animating_changed_for_active_elements && | |
611 !potentially_animating_changed_for_pending_elements && | |
612 !currently_running_animation_changed_for_active_elements && | |
613 !currently_running_animation_changed_for_pending_elements) | |
614 return; | 577 return; |
| 578 |
| 579 PropertyAnimationState diff_state = previous_state ^ *animation_state; |
| 580 |
615 if (has_element_in_active_list()) | 581 if (has_element_in_active_list()) |
616 NotifyClientAnimationChanged( | 582 NotifyClientAnimationChanged( |
617 property, ElementListType::ACTIVE, | 583 property, ElementListType::ACTIVE, |
618 potentially_animating_changed_for_active_elements, | 584 diff_state.potentially_animating_for_active_elements, |
619 currently_running_animation_changed_for_active_elements); | 585 diff_state.currently_running_for_active_elements); |
620 if (has_element_in_pending_list()) | 586 if (has_element_in_pending_list()) |
621 NotifyClientAnimationChanged( | 587 NotifyClientAnimationChanged( |
622 property, ElementListType::PENDING, | 588 property, ElementListType::PENDING, |
623 potentially_animating_changed_for_pending_elements, | 589 diff_state.potentially_animating_for_pending_elements, |
624 currently_running_animation_changed_for_pending_elements); | 590 diff_state.currently_running_for_pending_elements); |
625 } | 591 } |
626 | 592 |
627 bool ElementAnimations::HasActiveAnimation() const { | 593 bool ElementAnimations::HasActiveAnimation() const { |
628 for (auto& player : players_list_) { | 594 for (auto& player : players_list_) { |
629 if (player.HasActiveAnimation()) | 595 if (player.HasActiveAnimation()) |
630 return true; | 596 return true; |
631 } | 597 } |
632 | 598 |
633 return false; | 599 return false; |
634 } | 600 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 if (animation_host()) { | 757 if (animation_host()) { |
792 DCHECK(animation_host()->mutator_host_client()); | 758 DCHECK(animation_host()->mutator_host_client()); |
793 return animation_host()->mutator_host_client()->GetScrollOffsetForAnimation( | 759 return animation_host()->mutator_host_client()->GetScrollOffsetForAnimation( |
794 element_id()); | 760 element_id()); |
795 } | 761 } |
796 | 762 |
797 return gfx::ScrollOffset(); | 763 return gfx::ScrollOffset(); |
798 } | 764 } |
799 | 765 |
800 } // namespace cc | 766 } // namespace cc |
OLD | NEW |