| <!-- |
| // 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. |
| --> |
| <script> |
| function evaluateCubic(a, b, 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 kCubicErrorBound = 0.001; |
| |
| class Linear { |
| transform(t) { |
| return t; |
| } |
| }; |
| |
| class Cubic { |
| constructor(a, b, c, d) { |
| this.a_ = a; |
| this.b_ = b; |
| this.c_ = c; |
| this.d_ = d; |
| Object.preventExtensions(this); |
| } |
| |
| transform(t) { |
| var start = 0, end = 1; |
| while (1) { |
| var midpoint = (start + end) / 2; |
| var estimate = evaluateCubic(this.a_, this.c_, midpoint); |
| |
| if (Math.abs(t - estimate) < kCubicErrorBound) |
| return evaluateCubic(this.b_, this.d_, midpoint); |
| |
| if (estimate < t) |
| start = midpoint; |
| else |
| end = midpoint; |
| } |
| } |
| } |
| |
| module.exports = { |
| Linear: Linear, |
| Cubic: Cubic, |
| linear: new Linear(), |
| ease: new Cubic(0.25, 0.1, 0.25, 1), |
| easeIn: new Cubic(0.42, 0, 1, 1), |
| easeOut: new Cubic(0, 0, 0.58, 1), |
| easeInOut: new Cubic(0.42, 0, 0.58, 1), |
| }; |
| </script> |