SMILKeySpline.h (3146B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_SMIL_SMILKEYSPLINE_H_ 8 #define DOM_SMIL_SMILKEYSPLINE_H_ 9 10 #include <cstdint> 11 12 namespace mozilla { 13 14 /** 15 * Utility class to provide scaling defined in a keySplines element. 16 */ 17 class SMILKeySpline { 18 public: 19 constexpr SMILKeySpline() : mX1(0), mY1(0), mX2(0), mY2(0) { 20 /* caller must call Init later */\ 21 } 22 23 /** 24 * Creates a new key spline control point description. 25 * 26 * aX1, etc. are the x1, y1, x2, y2 cubic Bezier control points as defined 27 * by SMILANIM 3.2.3. They must each be in the range 0.0 <= x <= 1.0 28 */ 29 SMILKeySpline(double aX1, double aY1, double aX2, double aY2) 30 : mX1(0), mY1(0), mX2(0), mY2(0) { 31 Init(aX1, aY1, aX2, aY2); 32 } 33 34 double X1() const { return mX1; } 35 double Y1() const { return mY1; } 36 double X2() const { return mX2; } 37 double Y2() const { return mY2; } 38 39 void Init(double aX1, double aY1, double aX2, double aY2); 40 41 /** 42 * Gets the output (y) value for an input (x). 43 * 44 * @param aX The input x value. A floating-point number between 0 and 45 * 1 (inclusive). 46 */ 47 double GetSplineValue(double aX) const; 48 49 void GetSplineDerivativeValues(double aX, double& aDX, double& aDY) const; 50 51 bool operator==(const SMILKeySpline& aOther) const { 52 return mX1 == aOther.mX1 && mY1 == aOther.mY1 && mX2 == aOther.mX2 && 53 mY2 == aOther.mY2; 54 } 55 bool operator!=(const SMILKeySpline& aOther) const { 56 return !(*this == aOther); 57 } 58 int32_t Compare(const SMILKeySpline& aRhs) const { 59 if (mX1 != aRhs.mX1) return mX1 < aRhs.mX1 ? -1 : 1; 60 if (mY1 != aRhs.mY1) return mY1 < aRhs.mY1 ? -1 : 1; 61 if (mX2 != aRhs.mX2) return mX2 < aRhs.mX2 ? -1 : 1; 62 if (mY2 != aRhs.mY2) return mY2 < aRhs.mY2 ? -1 : 1; 63 return 0; 64 } 65 66 private: 67 void CalcSampleValues(); 68 69 /** 70 * Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. 71 */ 72 static double CalcBezier(double aT, double aA1, double aA2); 73 74 /** 75 * Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. 76 */ 77 static double GetSlope(double aT, double aA1, double aA2); 78 79 double GetTForX(double aX) const; 80 81 double NewtonRaphsonIterate(double aX, double aGuessT) const; 82 83 double BinarySubdivide(double aX, double aA, double aB) const; 84 85 static double A(double aA1, double aA2) { 86 return 1.0 - 3.0 * aA2 + 3.0 * aA1; 87 } 88 89 static double B(double aA1, double aA2) { return 3.0 * aA2 - 6.0 * aA1; } 90 91 static double C(double aA1) { return 3.0 * aA1; } 92 93 double mX1; 94 double mY1; 95 double mX2; 96 double mY2; 97 98 enum { kSplineTableSize = 11 }; 99 double mSampleValues[kSplineTableSize] = {}; 100 101 static const double kSampleStepSize; 102 }; 103 104 } // namespace mozilla 105 106 #endif // DOM_SMIL_SMILKEYSPLINE_H_