diff options
author | samli <samli@chromium.org> | 2014-09-17 17:10:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-18 00:11:05 +0000 |
commit | a867b7d7899c3be047dcc7c07859002de1791402 (patch) | |
tree | 747689a634abd6139f20f85c46b57c70040d83e2 | |
parent | 657d4d8c7d26c89c0846479ac322931bfaba4f86 (diff) | |
download | chromium_src-a867b7d7899c3be047dcc7c07859002de1791402.zip chromium_src-a867b7d7899c3be047dcc7c07859002de1791402.tar.gz chromium_src-a867b7d7899c3be047dcc7c07859002de1791402.tar.bz2 |
CC: Add support for iteration start in animations
This adds support for iteration start property from Web Animations to compositor accelerated animations.
BUG=414890
Review URL: https://codereview.chromium.org/573053002
Cr-Commit-Position: refs/heads/master@{#295380}
-rw-r--r-- | cc/animation/animation.cc | 38 | ||||
-rw-r--r-- | cc/animation/animation.h | 6 | ||||
-rw-r--r-- | cc/animation/animation_unittest.cc | 49 | ||||
-rw-r--r-- | cc/blink/web_animation_impl.cc | 8 | ||||
-rw-r--r-- | cc/blink/web_animation_impl.h | 2 |
5 files changed, 83 insertions, 20 deletions
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc index 47ebaa3..dc26a3e 100644 --- a/cc/animation/animation.cc +++ b/cc/animation/animation.cc @@ -64,6 +64,7 @@ Animation::Animation(scoped_ptr<AnimationCurve> curve, target_property_(target_property), run_state_(WaitingForTargetAvailability), iterations_(1), + iteration_start_(0), direction_(Normal), playback_rate_(1), needs_synchronized_start_time_(false), @@ -162,8 +163,9 @@ double Animation::TrimTimeToCurrentIteration( base::TimeTicks monotonic_time) const { base::TimeTicks trimmed = monotonic_time + time_offset_; - // Zero playback rate not supported + // Check for valid parameters DCHECK(playback_rate_); + DCHECK_GE(iteration_start_, 0); // If we're paused, time is 'stuck' at the pause time. if (run_state_ == Paused) @@ -195,41 +197,36 @@ double Animation::TrimTimeToCurrentIteration( double repeated_duration = iterations_ * curve_->Duration(); double active_duration = repeated_duration / std::abs(playback_rate_); + double start_offset = iteration_start_ * curve_->Duration(); // Check if we are past active duration - bool is_past_active_duration = - iterations_ > 0 && active_time >= active_duration; + if (iterations_ > 0 && active_time >= active_duration) + active_time = active_duration; // Calculate the scaled active time double scaled_active_time; if (playback_rate_ < 0) - scaled_active_time = (active_time - active_duration) * playback_rate_; + scaled_active_time = + (active_time - active_duration) * playback_rate_ + start_offset; else - scaled_active_time = active_time * playback_rate_; + scaled_active_time = active_time * playback_rate_ + start_offset; // Calculate the iteration time double iteration_time; - if (is_past_active_duration) { - // If we are past the active interval, return iteration duration of last - // iteration - double frac = fmod(repeated_duration, curve_->Duration()); - iteration_time = - frac == 0 && scaled_active_time > 0 ? curve_->Duration() : frac; - } else if (scaled_active_time == repeated_duration) { + if (scaled_active_time - start_offset == repeated_duration && + fmod(iterations_ + iteration_start_, 1) == 0) iteration_time = curve_->Duration(); - } else { + else iteration_time = fmod(scaled_active_time, curve_->Duration()); - } // Calculate the current iteration int iteration; - if (scaled_active_time <= 0) { + if (scaled_active_time <= 0) iteration = 0; - } else if (is_past_active_duration || iteration_time == curve_->Duration()) { - iteration = iterations_ - 1; - } else { + else if (iteration_time == curve_->Duration()) + iteration = ceil(iteration_start_ + iterations_ - 1); + else iteration = static_cast<int>(scaled_active_time / curve_->Duration()); - } // Check if we are running the animation in reverse direction for the current // iteration @@ -239,7 +236,7 @@ double Animation::TrimTimeToCurrentIteration( // If we are running the animation in reverse direction, reverse the result if (reverse) - return curve_->Duration() - iteration_time; + iteration_time = curve_->Duration() - iteration_time; return iteration_time; } @@ -250,6 +247,7 @@ scoped_ptr<Animation> Animation::CloneAndInitialize( new Animation(curve_->Clone(), id_, group_, target_property_)); to_return->run_state_ = initial_run_state; to_return->iterations_ = iterations_; + to_return->iteration_start_ = iteration_start_; to_return->start_time_ = start_time_; to_return->pause_time_ = pause_time_; to_return->total_paused_time_ = total_paused_time_; diff --git a/cc/animation/animation.h b/cc/animation/animation.h index aac6d7b..89b09ba 100644 --- a/cc/animation/animation.h +++ b/cc/animation/animation.h @@ -71,6 +71,11 @@ class CC_EXPORT Animation { double iterations() const { return iterations_; } void set_iterations(double n) { iterations_ = n; } + double iteration_start() const { return iteration_start_; } + void set_iteration_start(double iteration_start) { + iteration_start_ = iteration_start; + } + base::TimeTicks start_time() const { return start_time_; } void set_start_time(base::TimeTicks monotonic_time) { @@ -167,6 +172,7 @@ class CC_EXPORT Animation { TargetProperty target_property_; RunState run_state_; double iterations_; + double iteration_start_; base::TimeTicks start_time_; Direction direction_; double playback_rate_; diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc index c9b215b..ab9c909 100644 --- a/cc/animation/animation_unittest.cc +++ b/cc/animation/animation_unittest.cc @@ -617,5 +617,54 @@ TEST(AnimationTest, EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))); } +TEST(AnimationTest, TrimTimeIterationStart) { + scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1)); + anim->set_iteration_start(0.5); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))); +} + +TEST(AnimationTest, TrimTimeIterationStartAlternate) { + scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1)); + anim->set_direction(Animation::Alternate); + anim->set_iteration_start(0.3); + EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); + EXPECT_EQ(0.8, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.7))); + EXPECT_EQ(0.7, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.2))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.7))); +} + +TEST(AnimationTest, TrimTimeIterationStartAlternateThreeIterations) { + scoped_ptr<Animation> anim(CreateAnimation(3, 1, 1)); + anim->set_direction(Animation::Alternate); + anim->set_iteration_start(1); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); + EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))); +} + +TEST(AnimationTest, + TrimTimeIterationStartAlternateThreeIterationsPlaybackReverse) { + scoped_ptr<Animation> anim(CreateAnimation(3, 1, -1)); + anim->set_direction(Animation::Alternate); + anim->set_iteration_start(1); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); + EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))); + EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))); +} + } // namespace } // namespace cc diff --git a/cc/blink/web_animation_impl.cc b/cc/blink/web_animation_impl.cc index 1f19937..a819cec 100644 --- a/cc/blink/web_animation_impl.cc +++ b/cc/blink/web_animation_impl.cc @@ -97,6 +97,14 @@ void WebCompositorAnimationImpl::setIterations(int n) { } #endif +double WebCompositorAnimationImpl::iterationStart() const { + return animation_->iteration_start(); +} + +void WebCompositorAnimationImpl::setIterationStart(double iteration_start) { + animation_->set_iteration_start(iteration_start); +} + double WebCompositorAnimationImpl::startTime() const { return (animation_->start_time() - base::TimeTicks()).InSecondsF(); } diff --git a/cc/blink/web_animation_impl.h b/cc/blink/web_animation_impl.h index f2b2f07..1c61af0 100644 --- a/cc/blink/web_animation_impl.h +++ b/cc/blink/web_animation_impl.h @@ -38,6 +38,8 @@ class WebCompositorAnimationImpl : public blink::WebCompositorAnimation { virtual int iterations() const; virtual void setIterations(int iterations); #endif + virtual double iterationStart() const; + virtual void setIterationStart(double iteration_start); virtual double startTime() const; virtual void setStartTime(double monotonic_time); virtual double timeOffset() const; |