Skip to content

Commit

Permalink
cc: Fix animation end value for animations that alternate direction
Browse files Browse the repository at this point in the history
This fixes the logic used in Animation::TrimTimeToCurrentIteration for
times that are >= the total duration of the animation and animations
that alternate direction. The previous logic reversed the result from
the correct value, causing flicker at the end of such animations.

BUG=348071

Review URL: https://codereview.chromium.org/263243003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@268392 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
ajuma@chromium.org committed May 6, 2014
1 parent 2456926 commit 17eae39
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 6 deletions.
2 changes: 1 addition & 1 deletion cc/animation/animation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ double Animation::TrimTimeToCurrentIteration(double monotonic_time) const {

// If we are past the active interval, return iteration duration.
if (is_past_total_duration) {
iteration = iterations_;
iteration = iterations_ - 1;
trimmed = curve_->Duration();
} else {
iteration = static_cast<int>(trimmed / curve_->Duration());
Expand Down
60 changes: 55 additions & 5 deletions cc/animation/animation_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -60,26 +60,76 @@ TEST(AnimationTest, TrimTimeReverse) {
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(1.25));
}

TEST(AnimationTest, TrimTimeAlternate) {
TEST(AnimationTest, TrimTimeAlternateInfiniteIterations) {
scoped_ptr<Animation> anim(CreateAnimation(-1));
anim->set_direction(Animation::Alternate);
EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(1.25));
}

TEST(AnimationTest, TrimTimeAlternateOneIteration) {
scoped_ptr<Animation> anim(CreateAnimation(1));
anim->set_direction(Animation::Alternate);
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(1.25));
}

TEST(AnimationTest, TrimTimeAlternateTwoIterations) {
scoped_ptr<Animation> anim(CreateAnimation(2));
anim->set_direction(Animation::Alternate);
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(1.25));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(1.75));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(2.0));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(2.25));
}

TEST(AnimationTest, TrimTimeAlternateReverse) {
TEST(AnimationTest, TrimTimeAlternateReverseInfiniteIterations) {
scoped_ptr<Animation> anim(CreateAnimation(-1));
anim->set_direction(Animation::AlternateReverse);
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(1.25));
}

TEST(AnimationTest, TrimTimeAlternateReverseOneIteration) {
scoped_ptr<Animation> anim(CreateAnimation(1));
anim->set_direction(Animation::AlternateReverse);
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.25));
}

TEST(AnimationTest, TrimTimeAlternateReverseTwoIterations) {
scoped_ptr<Animation> anim(CreateAnimation(2));
anim->set_direction(Animation::AlternateReverse);
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(0.0));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(0.25));
EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(0.75));
EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.0));
EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(1.25));
EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(1.75));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(2.0));
EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(2.25));
}

TEST(AnimationTest, TrimTimeStartTime) {
Expand Down

0 comments on commit 17eae39

Please sign in to comment.