summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsamli <samli@chromium.org>2014-09-17 17:10:55 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-18 00:11:05 +0000
commita867b7d7899c3be047dcc7c07859002de1791402 (patch)
tree747689a634abd6139f20f85c46b57c70040d83e2
parent657d4d8c7d26c89c0846479ac322931bfaba4f86 (diff)
downloadchromium_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.cc38
-rw-r--r--cc/animation/animation.h6
-rw-r--r--cc/animation/animation_unittest.cc49
-rw-r--r--cc/blink/web_animation_impl.cc8
-rw-r--r--cc/blink/web_animation_impl.h2
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;