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

Unified Diff: cc/animation/keyframed_animation_curve_unittest.cc

Issue 598853003: CC: Add curve (whole animation) timing function to compositor animations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 6 years, 3 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/animation/keyframed_animation_curve.cc ('k') | cc/blink/web_filter_animation_curve_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/keyframed_animation_curve_unittest.cc
diff --git a/cc/animation/keyframed_animation_curve_unittest.cc b/cc/animation/keyframed_animation_curve_unittest.cc
index d9e2a3bc57e5b1afeec117bfe41041c07ee1e248..9ce1fdbac014c1a2f89f742441b7467f648e31b2 100644
--- a/cc/animation/keyframed_animation_curve_unittest.cc
+++ b/cc/animation/keyframed_animation_curve_unittest.cc
@@ -542,5 +542,98 @@ TEST(KeyframedAnimationCurveTest, MaximumScale) {
EXPECT_FALSE(curve->MaximumScale(&maximum_scale));
}
+// Tests that an animation with a curve timing function works as expected.
+TEST(KeyframedAnimationCurveTest, CurveTiming) {
+ scoped_ptr<KeyframedFloatAnimationCurve> curve(
+ KeyframedFloatAnimationCurve::Create());
+ curve->AddKeyframe(
+ FloatKeyframe::Create(0.0, 0.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>()));
+ curve->SetTimingFunction(
+ CubicBezierTimingFunction::Create(0.75f, 0.f, 0.25f, 1.f).Pass());
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f));
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f));
+ EXPECT_NEAR(0.05f, curve->GetValue(0.25f), 0.005f);
+ EXPECT_FLOAT_EQ(0.5f, curve->GetValue(0.5f));
+ EXPECT_NEAR(0.95f, curve->GetValue(0.75f), 0.005f);
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(1.f));
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(2.f));
+}
+
+// Tests that an animation with a curve and keyframe timing function works as
+// expected.
+TEST(KeyframedAnimationCurveTest, CurveAndKeyframeTiming) {
+ scoped_ptr<KeyframedFloatAnimationCurve> curve(
+ KeyframedFloatAnimationCurve::Create());
+ curve->AddKeyframe(FloatKeyframe::Create(
+ 0.0,
+ 0.f,
+ CubicBezierTimingFunction::Create(0.35f, 0.f, 0.65f, 1.f).Pass()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>()));
+ // Curve timing function producing outputs outside of range [0,1].
+ curve->SetTimingFunction(
+ CubicBezierTimingFunction::Create(0.5f, -0.5f, 0.5f, 1.5f).Pass());
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f));
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f));
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.25f)); // Clamped. c(.25) < 0
+ EXPECT_NEAR(0.17f, curve->GetValue(0.42f), 0.005f); // c(.42)=.27, k(.27)=.17
+ EXPECT_FLOAT_EQ(0.5f, curve->GetValue(0.5f));
+ EXPECT_NEAR(0.83f, curve->GetValue(0.58f), 0.005f); // c(.58)=.73, k(.73)=.83
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(0.75f)); // Clamped. c(.75) > 1
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(1.f));
+ EXPECT_FLOAT_EQ(1.f, curve->GetValue(2.f));
+}
+
+// Tests that an animation with a curve timing function and multiple keyframes
+// works as expected.
+TEST(KeyframedAnimationCurveTest, CurveTimingMultipleKeyframes) {
+ scoped_ptr<KeyframedFloatAnimationCurve> curve(
+ KeyframedFloatAnimationCurve::Create());
+ curve->AddKeyframe(
+ FloatKeyframe::Create(0.0, 0.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(2.0, 3.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(3.0, 6.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(4.0, 9.f, scoped_ptr<TimingFunction>()));
+ curve->SetTimingFunction(
+ CubicBezierTimingFunction::Create(0.5f, 0.f, 0.5f, 1.f).Pass());
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(-1.f));
+ EXPECT_FLOAT_EQ(0.f, curve->GetValue(0.f));
+ EXPECT_NEAR(0.42f, curve->GetValue(1.f), 0.005f);
+ EXPECT_NEAR(1.f, curve->GetValue(1.455f), 0.005f);
+ EXPECT_FLOAT_EQ(3.f, curve->GetValue(2.f));
+ EXPECT_NEAR(8.72f, curve->GetValue(3.5f), 0.01f);
+ EXPECT_FLOAT_EQ(9.f, curve->GetValue(4.f));
+ EXPECT_FLOAT_EQ(9.f, curve->GetValue(5.f));
+}
+
+// Tests that an animation with a curve timing function that overshoots works as
+// expected.
+TEST(KeyframedAnimationCurveTest, CurveTimingOvershootMultipeKeyframes) {
+ scoped_ptr<KeyframedFloatAnimationCurve> curve(
+ KeyframedFloatAnimationCurve::Create());
+ curve->AddKeyframe(
+ FloatKeyframe::Create(0.0, 0.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(1.0, 1.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(2.0, 3.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(3.0, 6.f, scoped_ptr<TimingFunction>()));
+ curve->AddKeyframe(
+ FloatKeyframe::Create(4.0, 9.f, scoped_ptr<TimingFunction>()));
+ // Curve timing function producing outputs outside of range [0,1].
+ curve->SetTimingFunction(
+ CubicBezierTimingFunction::Create(0.5f, -0.5f, 0.5f, 1.5f).Pass());
+ EXPECT_LE(curve->GetValue(1.f), 0.f); // c(.25) < 0
+ EXPECT_GE(curve->GetValue(3.f), 9.f); // c(.75) > 1
+}
+
} // namespace
} // namespace cc
« no previous file with comments | « cc/animation/keyframed_animation_curve.cc ('k') | cc/blink/web_filter_animation_curve_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698