Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/timing_function.h" | 5 #include "cc/timing_function.h" |
| 6 | |
| 6 #include "third_party/skia/include/core/SkMath.h" | 7 #include "third_party/skia/include/core/SkMath.h" |
| 7 | 8 |
| 8 // TODO(danakj) These methods come from SkInterpolator.cpp. When such a method | 9 // TODO(danakj) These methods come from SkInterpolator.cpp. When such a method |
| 9 // is available in the public Skia API, we should switch to using that. | 10 // is available in the public Skia API, we should switch to using that. |
| 10 // http://crbug.com/159735 | 11 // http://crbug.com/159735 |
| 11 namespace { | 12 namespace { |
| 12 | 13 |
| 13 // Dot14 has 14 bits for decimal places, and the remainder for whole numbers. | 14 // Dot14 has 14 bits for decimal places, and the remainder for whole numbers. |
| 14 typedef int Dot14; | 15 typedef int Dot14; |
| 15 #define DOT14_ONE (1 << 14) | 16 #define DOT14_ONE (1 << 14) |
| 16 #define DOT14_HALF (1 << 13) | 17 #define DOT14_HALF (1 << 13) |
| 17 | 18 |
| 18 #define Dot14ToFloat(x) ((x) / 16384.f) | 19 #define Dot14ToFloat(x) ((x) / 16384.f) |
| 19 | 20 |
| 20 static inline Dot14 Dot14Mul(Dot14 a, Dot14 b) | 21 static inline Dot14 Dot14Mul(Dot14 a, Dot14 b) { |
| 21 { | |
| 22 return (a * b + DOT14_HALF) >> 14; | 22 return (a * b + DOT14_HALF) >> 14; |
| 23 } | 23 } |
| 24 | 24 |
| 25 static inline Dot14 EvalCubic(Dot14 t, Dot14 A, Dot14 B, Dot14 C) | 25 static inline Dot14 EvalCubic(Dot14 t, Dot14 A, Dot14 B, Dot14 C) { |
| 26 { | |
| 27 return Dot14Mul(Dot14Mul(Dot14Mul(C, t) + B, t) + A, t); | 26 return Dot14Mul(Dot14Mul(Dot14Mul(C, t) + B, t) + A, t); |
| 28 } | 27 } |
| 29 | 28 |
| 30 static inline Dot14 PinAndConvert(SkScalar x) | 29 static inline Dot14 PinAndConvert(SkScalar x) { |
| 31 { | |
| 32 if (x <= 0) | 30 if (x <= 0) |
| 33 return 0; | 31 return 0; |
| 34 if (x >= SK_Scalar1) | 32 if (x >= SK_Scalar1) |
| 35 return DOT14_ONE; | 33 return DOT14_ONE; |
| 36 return SkScalarToFixed(x) >> 2; | 34 return SkScalarToFixed(x) >> 2; |
| 37 } | 35 } |
| 38 | 36 |
| 39 SkScalar SkUnitCubicInterp(SkScalar bx, SkScalar by, SkScalar cx, SkScalar cy, S kScalar value) | 37 SkScalar SkUnitCubicInterp(SkScalar bx, SkScalar by, |
|
danakj
2012/11/16 00:32:13
I thought you have to put 1 parameter per line if
tfarina
2012/11/16 00:36:35
this is a pair of x, y. Yes, I have thought about
danakj
2012/11/16 00:38:22
No, the less line wrapping the better IMO
| |
| 40 { | 38 SkScalar cx, SkScalar cy, |
| 39 SkScalar value) { | |
| 41 Dot14 x = PinAndConvert(value); | 40 Dot14 x = PinAndConvert(value); |
| 42 | 41 |
| 43 if (x == 0) return 0; | 42 if (x == 0) return 0; |
| 44 if (x == DOT14_ONE) return SK_Scalar1; | 43 if (x == DOT14_ONE) return SK_Scalar1; |
| 45 | 44 |
| 46 Dot14 b = PinAndConvert(bx); | 45 Dot14 b = PinAndConvert(bx); |
| 47 Dot14 c = PinAndConvert(cx); | 46 Dot14 c = PinAndConvert(cx); |
| 48 | 47 |
| 49 // Now compute our coefficients from the control points. | 48 // Now compute our coefficients from the control points. |
| 50 // t -> 3b | 49 // t -> 3b |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 68 | 67 |
| 69 // Now we have t, so compute the coefficient for Y and evaluate. | 68 // Now we have t, so compute the coefficient for Y and evaluate. |
| 70 b = PinAndConvert(by); | 69 b = PinAndConvert(by); |
| 71 c = PinAndConvert(cy); | 70 c = PinAndConvert(cy); |
| 72 A = 3 * b; | 71 A = 3 * b; |
| 73 B = 3 * (c - 2 * b); | 72 B = 3 * (c - 2 * b); |
| 74 C = 3 * (b - c) + DOT14_ONE; | 73 C = 3 * (b - c) + DOT14_ONE; |
| 75 return SkFixedToScalar(EvalCubic(t, A, B, C) << 2); | 74 return SkFixedToScalar(EvalCubic(t, A, B, C) << 2); |
| 76 } | 75 } |
| 77 | 76 |
| 78 } // anonymous namespace | 77 } // namespace |
| 79 | 78 |
| 80 namespace cc { | 79 namespace cc { |
| 81 | 80 |
| 82 TimingFunction::TimingFunction() | 81 TimingFunction::TimingFunction() { |
| 83 { | |
| 84 } | 82 } |
| 85 | 83 |
| 86 TimingFunction::~TimingFunction() | 84 TimingFunction::~TimingFunction() { |
| 87 { | |
| 88 } | 85 } |
| 89 | 86 |
| 90 double TimingFunction::duration() const | 87 double TimingFunction::duration() const { |
| 91 { | |
| 92 return 1.0; | 88 return 1.0; |
| 93 } | 89 } |
| 94 | 90 |
| 95 scoped_ptr<CubicBezierTimingFunction> CubicBezierTimingFunction::create(double x 1, double y1, double x2, double y2) | 91 scoped_ptr<CubicBezierTimingFunction> CubicBezierTimingFunction::create( |
| 96 { | 92 double x1, double y1, double x2, double y2) { |
| 97 return make_scoped_ptr(new CubicBezierTimingFunction(x1, y1, x2, y2)); | 93 return make_scoped_ptr(new CubicBezierTimingFunction(x1, y1, x2, y2)); |
| 98 } | 94 } |
| 99 | 95 |
| 100 CubicBezierTimingFunction::CubicBezierTimingFunction(double x1, double y1, doubl e x2, double y2) | 96 CubicBezierTimingFunction::CubicBezierTimingFunction(double x1, double y1, |
| 101 : m_x1(SkDoubleToScalar(x1)) | 97 double x2, double y2) |
| 102 , m_y1(SkDoubleToScalar(y1)) | 98 : x1_(SkDoubleToScalar(x1)), |
| 103 , m_x2(SkDoubleToScalar(x2)) | 99 y1_(SkDoubleToScalar(y1)), |
| 104 , m_y2(SkDoubleToScalar(y2)) | 100 x2_(SkDoubleToScalar(x2)), |
| 105 { | 101 y2_(SkDoubleToScalar(y2)) { |
| 106 } | 102 } |
| 107 | 103 |
| 108 CubicBezierTimingFunction::~CubicBezierTimingFunction() | 104 CubicBezierTimingFunction::~CubicBezierTimingFunction() { |
| 109 { | |
| 110 } | 105 } |
| 111 | 106 |
| 112 float CubicBezierTimingFunction::getValue(double x) const | 107 float CubicBezierTimingFunction::getValue(double x) const { |
| 113 { | 108 SkScalar value = SkUnitCubicInterp(x1_, y1_, x2_, y2_, x); |
| 114 SkScalar value = SkUnitCubicInterp(m_x1, m_y1, m_x2, m_y2, x); | 109 return SkScalarToFloat(value); |
| 115 return SkScalarToFloat(value); | |
| 116 } | 110 } |
| 117 | 111 |
| 118 scoped_ptr<AnimationCurve> CubicBezierTimingFunction::clone() const | 112 scoped_ptr<AnimationCurve> CubicBezierTimingFunction::clone() const { |
| 119 { | 113 return make_scoped_ptr( |
| 120 return make_scoped_ptr(new CubicBezierTimingFunction(*this)).PassAs<Animatio nCurve>(); | 114 new CubicBezierTimingFunction(*this)).PassAs<AnimationCurve>(); |
| 121 } | 115 } |
| 122 | 116 |
| 123 // These numbers come from http://www.w3.org/TR/css3-transitions/#transition-tim ing-function_tag. | 117 // These numbers come from http://www.w3.org/TR/css3-transitions/#transition-tim ing-function_tag. |
| 124 scoped_ptr<TimingFunction> EaseTimingFunction::create() | 118 scoped_ptr<TimingFunction> EaseTimingFunction::create() { |
| 125 { | 119 return CubicBezierTimingFunction::create( |
| 126 return CubicBezierTimingFunction::create(0.25, 0.1, 0.25, 1).PassAs<TimingFu nction>(); | 120 0.25, 0.1, 0.25, 1).PassAs<TimingFunction>(); |
| 127 } | 121 } |
| 128 | 122 |
| 129 scoped_ptr<TimingFunction> EaseInTimingFunction::create() | 123 scoped_ptr<TimingFunction> EaseInTimingFunction::create() { |
| 130 { | 124 return CubicBezierTimingFunction::create( |
| 131 return CubicBezierTimingFunction::create(0.42, 0, 1.0, 1).PassAs<TimingFunct ion>(); | 125 0.42, 0, 1.0, 1).PassAs<TimingFunction>(); |
| 132 } | 126 } |
| 133 | 127 |
| 134 scoped_ptr<TimingFunction> EaseOutTimingFunction::create() | 128 scoped_ptr<TimingFunction> EaseOutTimingFunction::create() { |
| 135 { | 129 return CubicBezierTimingFunction::create( |
| 136 return CubicBezierTimingFunction::create(0, 0, 0.58, 1).PassAs<TimingFunctio n>(); | 130 0, 0, 0.58, 1).PassAs<TimingFunction>(); |
| 137 } | 131 } |
| 138 | 132 |
| 139 scoped_ptr<TimingFunction> EaseInOutTimingFunction::create() | 133 scoped_ptr<TimingFunction> EaseInOutTimingFunction::create() { |
| 140 { | 134 return CubicBezierTimingFunction::create( |
| 141 return CubicBezierTimingFunction::create(0.42, 0, 0.58, 1).PassAs<TimingFunc tion>(); | 135 0.42, 0, 0.58, 1).PassAs<TimingFunction>(); |
| 142 } | 136 } |
| 143 | 137 |
| 144 } // namespace cc | 138 } // namespace cc |
| OLD | NEW |