Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1088)

Unified Diff: cc/layer_animation_controller.cc

Issue 12822004: Part 3 of cc/ directory shuffles: animation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layer_animation_controller.h ('k') | cc/layer_animation_controller_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layer_animation_controller.cc
diff --git a/cc/layer_animation_controller.cc b/cc/layer_animation_controller.cc
deleted file mode 100644
index 7dec464901abbfec23c331b8b36dd1b80949ca0f..0000000000000000000000000000000000000000
--- a/cc/layer_animation_controller.cc
+++ /dev/null
@@ -1,628 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/layer_animation_controller.h"
-
-#include <algorithm>
-
-#include "cc/animation.h"
-#include "cc/animation_registrar.h"
-#include "cc/base/scoped_ptr_algorithm.h"
-#include "cc/keyframed_animation_curve.h"
-#include "cc/layer_animation_value_observer.h"
-#include "ui/gfx/transform.h"
-
-namespace cc {
-
-LayerAnimationController::LayerAnimationController(int id)
- : force_sync_(false),
- registrar_(0),
- id_(id),
- is_active_(false),
- last_tick_time_(0) {}
-
-LayerAnimationController::~LayerAnimationController() {
- if (registrar_)
- registrar_->UnregisterAnimationController(this);
-}
-
-scoped_refptr<LayerAnimationController> LayerAnimationController::Create(
- int id) {
- return make_scoped_refptr(new LayerAnimationController(id));
-}
-
-void LayerAnimationController::PauseAnimation(int animation_id,
- double time_offset) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->id() == animation_id) {
- active_animations_[i]->SetRunState(
- Animation::Paused, time_offset + active_animations_[i]->start_time());
- }
- }
-}
-
-struct HasAnimationId {
- HasAnimationId(int id) : id_(id) {}
- bool operator()(Animation* animation) const {
- return animation->id() == id_;
- }
-
- private:
- int id_;
-};
-
-void LayerAnimationController::RemoveAnimation(int animation_id) {
- ScopedPtrVector<Animation>& animations = active_animations_;
- animations.erase(cc::remove_if(animations,
- animations.begin(),
- animations.end(),
- HasAnimationId(animation_id)),
- animations.end());
- UpdateActivation(NormalActivation);
-}
-
-struct HasAnimationIdAndProperty {
- HasAnimationIdAndProperty(int id, Animation::TargetProperty target_property)
- : id_(id), target_property_(target_property) {}
- bool operator()(Animation* animation) const {
- return animation->id() == id_ &&
- animation->target_property() == target_property_;
- }
-
- private:
- int id_;
- Animation::TargetProperty target_property_;
-};
-
-void LayerAnimationController::RemoveAnimation(
- int animation_id,
- Animation::TargetProperty target_property) {
- ScopedPtrVector<Animation>& animations = active_animations_;
- animations.erase(cc::remove_if(animations,
- animations.begin(),
- animations.end(),
- HasAnimationIdAndProperty(animation_id,
- target_property)),
- animations.end());
- UpdateActivation(NormalActivation);
-}
-
-// According to render layer backing, these are for testing only.
-void LayerAnimationController::SuspendAnimations(double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (!active_animations_[i]->is_finished())
- active_animations_[i]->SetRunState(Animation::Paused, monotonic_time);
- }
-}
-
-// Looking at GraphicsLayerCA, this appears to be the analog to
-// suspendAnimations, which is for testing.
-void LayerAnimationController::ResumeAnimations(double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::Paused)
- active_animations_[i]->SetRunState(Animation::Running, monotonic_time);
- }
-}
-
-// Ensures that the list of active animations on the main thread and the impl
-// thread are kept in sync.
-void LayerAnimationController::PushAnimationUpdatesTo(
- LayerAnimationController* controller_impl) {
- if (force_sync_) {
- ReplaceImplThreadAnimations(controller_impl);
- force_sync_ = false;
- } else {
- PurgeAnimationsMarkedForDeletion();
- PushNewAnimationsToImplThread(controller_impl);
-
- // Remove finished impl side animations only after pushing,
- // and only after the animations are deleted on the main thread
- // this insures we will never push an animation twice.
- RemoveAnimationsCompletedOnMainThread(controller_impl);
-
- PushPropertiesToImplThread(controller_impl);
- }
- controller_impl->UpdateActivation(NormalActivation);
- UpdateActivation(NormalActivation);
-}
-
-void LayerAnimationController::Animate(double monotonic_time) {
- if (!HasActiveObserver())
- return;
-
- StartAnimationsWaitingForNextTick(monotonic_time);
- StartAnimationsWaitingForStartTime(monotonic_time);
- StartAnimationsWaitingForTargetAvailability(monotonic_time);
- ResolveConflicts(monotonic_time);
- TickAnimations(monotonic_time);
- last_tick_time_ = monotonic_time;
-}
-
-void LayerAnimationController::AccumulatePropertyUpdates(
- double monotonic_time,
- AnimationEventsVector* events) {
- if (!events)
- return;
-
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- Animation* animation = active_animations_[i];
- if (!animation->is_impl_only())
- continue;
-
- if (animation->target_property() == Animation::Opacity) {
- AnimationEvent event(AnimationEvent::PropertyUpdate,
- id_,
- animation->group(),
- Animation::Opacity,
- monotonic_time);
- event.opacity = animation->curve()->ToFloatAnimationCurve()->GetValue(
- monotonic_time);
-
- events->push_back(event);
- }
- else if (animation->target_property() == Animation::Transform) {
- AnimationEvent event(AnimationEvent::PropertyUpdate,
- id_,
- animation->group(),
- Animation::Transform,
- monotonic_time);
- event.transform =
- animation->curve()->ToTransformAnimationCurve()->GetValue(
- monotonic_time);
- events->push_back(event);
- }
- }
-}
-
-void LayerAnimationController::UpdateState(AnimationEventsVector* events) {
- if (!HasActiveObserver())
- return;
-
- PromoteStartedAnimations(last_tick_time_, events);
- MarkFinishedAnimations(last_tick_time_);
- MarkAnimationsForDeletion(last_tick_time_, events);
- StartAnimationsWaitingForTargetAvailability(last_tick_time_);
- PromoteStartedAnimations(last_tick_time_, events);
-
- AccumulatePropertyUpdates(last_tick_time_, events);
-
- UpdateActivation(NormalActivation);
-}
-
-void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) {
- active_animations_.push_back(animation.Pass());
- UpdateActivation(NormalActivation);
-}
-
-Animation* LayerAnimationController::GetAnimation(
- int group_id,
- Animation::TargetProperty target_property) const {
- for (size_t i = 0; i < active_animations_.size(); ++i)
- if (active_animations_[i]->group() == group_id &&
- active_animations_[i]->target_property() == target_property)
- return active_animations_[i];
- return 0;
-}
-
-Animation* LayerAnimationController::GetAnimation(
- Animation::TargetProperty target_property) const {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- size_t index = active_animations_.size() - i - 1;
- if (active_animations_[index]->target_property() == target_property)
- return active_animations_[index];
- }
- return 0;
-}
-
-bool LayerAnimationController::HasActiveAnimation() const {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (!active_animations_[i]->is_finished())
- return true;
- }
- return false;
-}
-
-bool LayerAnimationController::IsAnimatingProperty(
- Animation::TargetProperty target_property) const {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() != Animation::Finished &&
- active_animations_[i]->run_state() != Animation::Aborted &&
- active_animations_[i]->target_property() == target_property)
- return true;
- }
- return false;
-}
-
-void LayerAnimationController::OnAnimationStarted(
- const AnimationEvent& event) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->group() == event.group_id &&
- active_animations_[i]->target_property() == event.target_property &&
- active_animations_[i]->needs_synchronized_start_time()) {
- active_animations_[i]->set_needs_synchronized_start_time(false);
- active_animations_[i]->set_start_time(event.monotonic_time);
- return;
- }
- }
-}
-
-void LayerAnimationController::SetAnimationRegistrar(
- AnimationRegistrar* registrar) {
- if (registrar_ == registrar)
- return;
-
- if (registrar_)
- registrar_->UnregisterAnimationController(this);
-
- registrar_ = registrar;
- if (registrar_)
- registrar_->RegisterAnimationController(this);
-
- UpdateActivation(ForceActivation);
-}
-
-void LayerAnimationController::AddObserver(
- LayerAnimationValueObserver* observer) {
- if (!observers_.HasObserver(observer))
- observers_.AddObserver(observer);
-}
-
-void LayerAnimationController::RemoveObserver(
- LayerAnimationValueObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-void LayerAnimationController::PushNewAnimationsToImplThread(
- LayerAnimationController* controller_impl) const {
- // Any new animations owned by the main thread's controller are cloned and
- // add to the impl thread's controller.
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- // If the animation is already running on the impl thread, there is no
- // need to copy it over.
- if (controller_impl->GetAnimation(active_animations_[i]->group(),
- active_animations_[i]->target_property()))
- continue;
-
- // If the animation is not running on the impl thread, it does not
- // necessarily mean that it needs to be copied over and started; it may
- // have already finished. In this case, the impl thread animation will
- // have already notified that it has started and the main thread animation
- // will no longer need
- // a synchronized start time.
- if (!active_animations_[i]->needs_synchronized_start_time())
- continue;
-
- // The new animation should be set to run as soon as possible.
- Animation::RunState initial_run_state =
- Animation::WaitingForTargetAvailability;
- double start_time = 0;
- scoped_ptr<Animation> to_add(active_animations_[i]->CloneAndInitialize(
- Animation::ControllingInstance, initial_run_state, start_time));
- DCHECK(!to_add->needs_synchronized_start_time());
- controller_impl->AddAnimation(to_add.Pass());
- }
-}
-
-struct IsCompleted {
- IsCompleted(const LayerAnimationController& main_thread_controller)
- : main_thread_controller_(main_thread_controller) {}
- bool operator()(Animation* animation) const {
- if (animation->is_impl_only())
- return false;
- return !main_thread_controller_.GetAnimation(animation->group(),
- animation->target_property());
- }
-
- private:
- const LayerAnimationController& main_thread_controller_;
-};
-
-void LayerAnimationController::RemoveAnimationsCompletedOnMainThread(
- LayerAnimationController* controller_impl) const {
- // Delete all impl thread animations for which there is no corresponding
- // main thread animation. Each iteration,
- // controller->active_animations_.size() is decremented or i is incremented
- // guaranteeing progress towards loop termination.
- ScopedPtrVector<Animation>& animations =
- controller_impl->active_animations_;
- animations.erase(cc::remove_if(animations,
- animations.begin(),
- animations.end(),
- IsCompleted(*this)),
- animations.end());
-}
-
-void LayerAnimationController::PushPropertiesToImplThread(
- LayerAnimationController* controller_impl) const {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- Animation* current_impl =
- controller_impl->GetAnimation(
- active_animations_[i]->group(),
- active_animations_[i]->target_property());
- if (current_impl)
- active_animations_[i]->PushPropertiesTo(current_impl);
- }
-}
-
-void LayerAnimationController::StartAnimationsWaitingForNextTick(
- double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::WaitingForNextTick)
- active_animations_[i]->SetRunState(Animation::Starting, monotonic_time);
- }
-}
-
-void LayerAnimationController::StartAnimationsWaitingForStartTime(
- double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::WaitingForStartTime &&
- active_animations_[i]->start_time() <= monotonic_time)
- active_animations_[i]->SetRunState(Animation::Starting, monotonic_time);
- }
-}
-
-void LayerAnimationController::StartAnimationsWaitingForTargetAvailability(
- double monotonic_time) {
- // First collect running properties.
- TargetProperties blocked_properties;
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::Starting ||
- active_animations_[i]->run_state() == Animation::Running ||
- active_animations_[i]->run_state() == Animation::Finished)
- blocked_properties.insert(active_animations_[i]->target_property());
- }
-
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() ==
- Animation::WaitingForTargetAvailability) {
- // Collect all properties for animations with the same group id (they
- // should all also be in the list of animations).
- TargetProperties enqueued_properties;
- enqueued_properties.insert(active_animations_[i]->target_property());
- for (size_t j = i + 1; j < active_animations_.size(); ++j) {
- if (active_animations_[i]->group() == active_animations_[j]->group())
- enqueued_properties.insert(active_animations_[j]->target_property());
- }
-
- // Check to see if intersection of the list of properties affected by
- // the group and the list of currently blocked properties is null. In
- // any case, the group's target properties need to be added to the list
- // of blocked properties.
- bool null_intersection = true;
- for (TargetProperties::iterator p_iter = enqueued_properties.begin();
- p_iter != enqueued_properties.end();
- ++p_iter) {
- if (!blocked_properties.insert(*p_iter).second)
- null_intersection = false;
- }
-
- // If the intersection is null, then we are free to start the animations
- // in the group.
- if (null_intersection) {
- active_animations_[i]->SetRunState(
- Animation::Starting, monotonic_time);
- for (size_t j = i + 1; j < active_animations_.size(); ++j) {
- if (active_animations_[i]->group() ==
- active_animations_[j]->group()) {
- active_animations_[j]->SetRunState(
- Animation::Starting, monotonic_time);
- }
- }
- }
- }
- }
-}
-
-void LayerAnimationController::PromoteStartedAnimations(
- double monotonic_time,
- AnimationEventsVector* events) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::Starting) {
- active_animations_[i]->SetRunState(Animation::Running, monotonic_time);
- if (!active_animations_[i]->has_set_start_time())
- active_animations_[i]->set_start_time(monotonic_time);
- if (events) {
- events->push_back(AnimationEvent(
- AnimationEvent::Started,
- id_,
- active_animations_[i]->group(),
- active_animations_[i]->target_property(),
- monotonic_time));
- }
- }
- }
-}
-
-void LayerAnimationController::MarkFinishedAnimations(double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->IsFinishedAt(monotonic_time))
- active_animations_[i]->SetRunState(Animation::Finished, monotonic_time);
- }
-}
-
-void LayerAnimationController::ResolveConflicts(double monotonic_time) {
- // Find any animations that are animating the same property and resolve the
- // confict. We could eventually blend, but for now we'll just abort the
- // previous animation (where 'previous' means: (1) has a prior start time or
- // (2) has an equal start time, but was added to the queue earlier, i.e.,
- // has a lower index in active_animations_).
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::Starting ||
- active_animations_[i]->run_state() == Animation::Running) {
- for (size_t j = i + 1; j < active_animations_.size(); ++j) {
- if ((active_animations_[j]->run_state() == Animation::Starting ||
- active_animations_[j]->run_state() == Animation::Running) &&
- active_animations_[i]->target_property() ==
- active_animations_[j]->target_property()) {
- if (active_animations_[i]->start_time() >
- active_animations_[j]->start_time()) {
- active_animations_[j]->SetRunState(Animation::Aborted,
- monotonic_time);
- } else {
- active_animations_[i]->SetRunState(Animation::Aborted,
- monotonic_time);
- }
- }
- }
- }
- }
-}
-
-void LayerAnimationController::MarkAnimationsForDeletion(
- double monotonic_time, AnimationEventsVector* events) {
- for (size_t i = 0; i < active_animations_.size(); i++) {
- int group_id = active_animations_[i]->group();
- bool all_anims_with_same_id_are_finished = false;
- // If an animation is finished, and not already marked for deletion,
- // Find out if all other animations in the same group are also finished.
- if (active_animations_[i]->is_finished() &&
- active_animations_[i]->run_state() != Animation::WaitingForDeletion) {
- all_anims_with_same_id_are_finished = true;
- for (size_t j = 0; j < active_animations_.size(); ++j) {
- if (group_id == active_animations_[j]->group() &&
- !active_animations_[j]->is_finished()) {
- all_anims_with_same_id_are_finished = false;
- break;
- }
- }
- }
- if (all_anims_with_same_id_are_finished) {
- // We now need to remove all animations with the same group id as
- // group_id (and send along animation finished notifications, if
- // necessary).
- for (size_t j = i; j < active_animations_.size(); j++) {
- if (group_id == active_animations_[j]->group()) {
- if (events) {
- events->push_back(AnimationEvent(
- AnimationEvent::Finished,
- id_,
- active_animations_[j]->group(),
- active_animations_[j]->target_property(),
- monotonic_time));
- }
- active_animations_[j]->SetRunState(Animation::WaitingForDeletion,
- monotonic_time);
- }
- }
- }
- }
-}
-
-static bool IsWaitingForDeletion(Animation* animation) {
- return animation->run_state() == Animation::WaitingForDeletion;
-}
-
-void LayerAnimationController::PurgeAnimationsMarkedForDeletion() {
- ScopedPtrVector<Animation>& animations = active_animations_;
- animations.erase(cc::remove_if(animations,
- animations.begin(),
- animations.end(),
- IsWaitingForDeletion),
- animations.end());
-}
-
-void LayerAnimationController::ReplaceImplThreadAnimations(
- LayerAnimationController* controller_impl) const {
- controller_impl->active_animations_.clear();
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- scoped_ptr<Animation> to_add;
- if (active_animations_[i]->needs_synchronized_start_time()) {
- // We haven't received an animation started notification yet, so it
- // is important that we add it in a 'waiting' and not 'running' state.
- Animation::RunState initial_run_state =
- Animation::WaitingForTargetAvailability;
- double start_time = 0;
- to_add = active_animations_[i]->CloneAndInitialize(
- Animation::ControllingInstance,
- initial_run_state, start_time).Pass();
- } else {
- to_add = active_animations_[i]->Clone(
- Animation::ControllingInstance).Pass();
- }
-
- controller_impl->AddAnimation(to_add.Pass());
- }
-}
-
-void LayerAnimationController::TickAnimations(double monotonic_time) {
- for (size_t i = 0; i < active_animations_.size(); ++i) {
- if (active_animations_[i]->run_state() == Animation::Starting ||
- active_animations_[i]->run_state() == Animation::Running ||
- active_animations_[i]->run_state() == Animation::Paused) {
- double trimmed =
- active_animations_[i]->TrimTimeToCurrentIteration(monotonic_time);
-
- // Animation assumes its initial value until it gets the synchronized
- // start time from the impl thread and can start ticking.
- if (active_animations_[i]->needs_synchronized_start_time())
- trimmed = 0;
-
- // A just-started animation assumes its initial value.
- if (active_animations_[i]->run_state() == Animation::Starting &&
- !active_animations_[i]->has_set_start_time())
- trimmed = 0;
-
- switch (active_animations_[i]->target_property()) {
-
- case Animation::Transform: {
- const TransformAnimationCurve* transform_animation_curve =
- active_animations_[i]->curve()->ToTransformAnimationCurve();
- const gfx::Transform transform =
- transform_animation_curve->GetValue(trimmed);
- NotifyObserversTransformAnimated(transform);
- break;
- }
-
- case Animation::Opacity: {
- const FloatAnimationCurve* float_animation_curve =
- active_animations_[i]->curve()->ToFloatAnimationCurve();
- const float opacity = float_animation_curve->GetValue(trimmed);
- NotifyObserversOpacityAnimated(opacity);
- break;
- }
-
- // Do nothing for sentinel value.
- case Animation::TargetPropertyEnumSize:
- NOTREACHED();
- }
- }
- }
-}
-
-void LayerAnimationController::UpdateActivation(UpdateActivationType type) {
- bool force = type == ForceActivation;
- if (registrar_) {
- if (!active_animations_.empty() && (!is_active_ || force))
- registrar_->DidActivateAnimationController(this);
- else if (active_animations_.empty() && (is_active_ || force))
- registrar_->DidDeactivateAnimationController(this);
- is_active_ = !active_animations_.empty();
- }
-}
-
-void LayerAnimationController::NotifyObserversOpacityAnimated(float opacity) {
- FOR_EACH_OBSERVER(LayerAnimationValueObserver,
- observers_,
- OnOpacityAnimated(opacity));
-}
-
-void LayerAnimationController::NotifyObserversTransformAnimated(
- const gfx::Transform& transform) {
- FOR_EACH_OBSERVER(LayerAnimationValueObserver,
- observers_,
- OnTransformAnimated(transform));
-}
-
-bool LayerAnimationController::HasActiveObserver() {
- if (observers_.might_have_observers()) {
- ObserverListBase<LayerAnimationValueObserver>::Iterator it(observers_);
- LayerAnimationValueObserver* obs;
- while ((obs = it.GetNext()) != NULL)
- if (obs->IsActive())
- return true;
- }
- return false;
-}
-
-} // namespace cc
« no previous file with comments | « cc/layer_animation_controller.h ('k') | cc/layer_animation_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698