| Index: app/linear_animation.cc
|
| diff --git a/app/linear_animation.cc b/app/linear_animation.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..35974af667a9d0382315851f113e5af5239b2d6c
|
| --- /dev/null
|
| +++ b/app/linear_animation.cc
|
| @@ -0,0 +1,91 @@
|
| +// Copyright (c) 2010 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 "app/linear_animation.h"
|
| +
|
| +#include <math.h>
|
| +
|
| +#include "app/animation_container.h"
|
| +
|
| +using base::Time;
|
| +using base::TimeDelta;
|
| +
|
| +static TimeDelta CalculateInterval(int frame_rate) {
|
| + int timer_interval = 1000000 / frame_rate;
|
| + if (timer_interval < 10000)
|
| + timer_interval = 10000;
|
| + return TimeDelta::FromMicroseconds(timer_interval);
|
| +}
|
| +
|
| +LinearAnimation::LinearAnimation(int frame_rate,
|
| + AnimationDelegate* delegate)
|
| + : Animation(CalculateInterval(frame_rate)),
|
| + state_(0.0),
|
| + in_end_(false) {
|
| + set_delegate(delegate);
|
| +}
|
| +
|
| +LinearAnimation::LinearAnimation(int duration,
|
| + int frame_rate,
|
| + AnimationDelegate* delegate)
|
| + : Animation(CalculateInterval(frame_rate)),
|
| + duration_(TimeDelta::FromMilliseconds(duration)),
|
| + state_(0.0),
|
| + in_end_(false) {
|
| + set_delegate(delegate);
|
| + SetDuration(duration);
|
| +}
|
| +
|
| +double LinearAnimation::GetCurrentValue() const {
|
| + // Default is linear relationship, subclass to adapt.
|
| + return state_;
|
| +}
|
| +
|
| +void LinearAnimation::End() {
|
| + if (!is_animating())
|
| + return;
|
| +
|
| + // NOTE: We don't use AutoReset here as Stop may end up deleting us (by way
|
| + // of the delegate).
|
| + in_end_ = true;
|
| + Stop();
|
| +}
|
| +
|
| +void LinearAnimation::SetDuration(int duration) {
|
| + duration_ = TimeDelta::FromMilliseconds(duration);
|
| + if (duration_ < timer_interval())
|
| + duration_ = timer_interval();
|
| + if (is_animating())
|
| + SetStartTime(container()->last_tick_time());
|
| +}
|
| +
|
| +void LinearAnimation::Step(base::TimeTicks time_now) {
|
| + TimeDelta elapsed_time = time_now - start_time();
|
| + state_ = static_cast<double>(elapsed_time.InMicroseconds()) /
|
| + static_cast<double>(duration_.InMicroseconds());
|
| + if (state_ >= 1.0)
|
| + state_ = 1.0;
|
| +
|
| + AnimateToState(state_);
|
| +
|
| + if (delegate())
|
| + delegate()->AnimationProgressed(this);
|
| +
|
| + if (state_ == 1.0)
|
| + Stop();
|
| +}
|
| +
|
| +void LinearAnimation::AnimationStopped() {
|
| + if (!in_end_)
|
| + return;
|
| +
|
| + in_end_ = false;
|
| + // Set state_ to ensure we send ended to delegate and not canceled.
|
| + state_ = 1;
|
| + AnimateToState(1.0);
|
| +}
|
| +
|
| +bool LinearAnimation::ShouldSendCanceledFromStop() {
|
| + return state_ != 1;
|
| +}
|
|
|