| Index: sky/framework/animation/curves.dart
|
| diff --git a/sky/framework/animation/curves.dart b/sky/framework/animation/curves.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..367d4cd4069110baa5ccd00eeb84d6df03c0a6e2
|
| --- /dev/null
|
| +++ b/sky/framework/animation/curves.dart
|
| @@ -0,0 +1,54 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +double _evaluateCubic(double a, double b, double m) {
|
| + // TODO(abarth): Would Math.pow be faster?
|
| + return 3 * a * (1 - m) * (1 - m) * m + 3 * b * (1 - m) * m * m + m * m * m;
|
| +}
|
| +
|
| +const double _kCubicErrorBound = 0.001;
|
| +
|
| +abstract class Curve {
|
| + double transform(double t);
|
| +}
|
| +
|
| +class Linear implements Curve {
|
| + const Linear();
|
| +
|
| + double transform(double t) {
|
| + return t;
|
| + }
|
| +}
|
| +
|
| +class Cubic implements Curve {
|
| + final double a;
|
| + final double b;
|
| + final double c;
|
| + final double d;
|
| +
|
| + const Cubic(this.a, this.b, this.c, this.d);
|
| +
|
| + double transform(double t) {
|
| + double start = 0.0;
|
| + double end = 1.0;
|
| + while (true) {
|
| + double midpoint = (start + end) / 2;
|
| + double estimate = _evaluateCubic(a, c, midpoint);
|
| +
|
| + if ((t - estimate).abs() < _kCubicErrorBound)
|
| + return _evaluateCubic(b, d, midpoint);
|
| +
|
| + if (estimate < t)
|
| + start = midpoint;
|
| + else
|
| + end = midpoint;
|
| + }
|
| + }
|
| +}
|
| +
|
| +const Linear linear = const Linear();
|
| +const Cubic ease = const Cubic(0.25, 0.1, 0.25, 1.0);
|
| +const Cubic easeIn = const Cubic(0.42, 0.0, 1.0, 1.0);
|
| +const Cubic easeOut = const Cubic(0.0, 0.0, 0.58, 1.0);
|
| +const Cubic easeInOut = const Cubic(0.42, 0.0, 0.58, 1.0);
|
|
|