|  | <!-- | 
|  | // 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> |