Index: cc/animation/timing_function.cc |
diff --git a/cc/animation/timing_function.cc b/cc/animation/timing_function.cc |
index 2531cc69f36457ccac33f807ad39ce960002f147..94bf12874d30eeba4b6c65352e39bd6078e6caaf 100644 |
--- a/cc/animation/timing_function.cc |
+++ b/cc/animation/timing_function.cc |
@@ -5,6 +5,7 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "cc/animation/timing_function.h" |
+#include "cc/base/math_util.h" |
namespace cc { |
@@ -63,4 +64,41 @@ scoped_ptr<TimingFunction> EaseInOutTimingFunction::Create() { |
return CubicBezierTimingFunction::Create(0.42, 0.0, 0.58, 1); |
} |
+scoped_ptr<StepsTimingFunction> StepsTimingFunction::Create( |
+ int steps, |
+ float steps_start_offset) { |
+ return make_scoped_ptr(new StepsTimingFunction(steps, steps_start_offset)); |
+} |
+ |
+StepsTimingFunction::StepsTimingFunction(int steps, float steps_start_offset) |
+ : steps_(steps), steps_start_offset_(steps_start_offset) { |
+ // Restrict it to CSS presets: step_start, step_end and step_middle. |
+ // See the Web Animations specification, 3.12.4. Timing in discrete steps. |
+ DCHECK(steps_start_offset_ == 0 || steps_start_offset_ == 1 || |
+ steps_start_offset_ == 0.5); |
+} |
+ |
+StepsTimingFunction::~StepsTimingFunction() { |
+} |
+ |
+float StepsTimingFunction::GetValue(double t) const { |
+ const double steps = static_cast<double>(steps_); |
+ const double value = MathUtil::ClampToRange( |
+ std::floor((steps * t) + steps_start_offset_) / steps, 0.0, 1.0); |
+ return static_cast<float>(value); |
+} |
+ |
+scoped_ptr<TimingFunction> StepsTimingFunction::Clone() const { |
+ return make_scoped_ptr(new StepsTimingFunction(*this)); |
+} |
+ |
+void StepsTimingFunction::Range(float* min, float* max) const { |
+ *min = 0.0f; |
+ *max = 1.0f; |
+} |
+ |
+float StepsTimingFunction::Velocity(double x) const { |
+ return 0.0f; |
+} |
+ |
} // namespace cc |