OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
3 * (C) 2000 Antti Koivisto (koivisto@kde.org) | 3 * (C) 2000 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) | 6 * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com) |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 protected: | 57 protected: |
58 TimingFunction(Type type) | 58 TimingFunction(Type type) |
59 : m_type(type) | 59 : m_type(type) |
60 { | 60 { |
61 } | 61 } |
62 | 62 |
63 private: | 63 private: |
64 Type m_type; | 64 Type m_type; |
65 }; | 65 }; |
66 | 66 |
67 class LinearTimingFunction : public TimingFunction { | 67 class LinearTimingFunction FINAL : public TimingFunction { |
68 public: | 68 public: |
69 static PassRefPtr<LinearTimingFunction> create() | 69 static PassRefPtr<LinearTimingFunction> create() |
70 { | 70 { |
71 return adoptRef(new LinearTimingFunction); | 71 return adoptRef(new LinearTimingFunction); |
72 } | 72 } |
73 | 73 |
74 ~LinearTimingFunction() { } | 74 virtual ~LinearTimingFunction() { } |
75 | 75 |
76 virtual double evaluate(double fraction, double) const | 76 virtual double evaluate(double fraction, double) const OVERRIDE |
77 { | 77 { |
78 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); | 78 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); |
79 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); | 79 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); |
80 return fraction; | 80 return fraction; |
81 } | 81 } |
82 | 82 |
83 private: | 83 private: |
84 LinearTimingFunction() | 84 LinearTimingFunction() |
85 : TimingFunction(LinearFunction) | 85 : TimingFunction(LinearFunction) |
86 { | 86 { |
87 } | 87 } |
88 }; | 88 }; |
89 | 89 |
90 | 90 |
91 // Forward declare so we can friend it below. Don't use in production code! | 91 // Forward declare so we can friend it below. Don't use in production code! |
92 class ChainedTimingFunctionTestHelper; | 92 class ChainedTimingFunctionTestHelper; |
93 | 93 |
94 class CubicBezierTimingFunction : public TimingFunction { | 94 class CubicBezierTimingFunction FINAL : public TimingFunction { |
95 public: | 95 public: |
96 enum SubType { | 96 enum SubType { |
97 Ease, | 97 Ease, |
98 EaseIn, | 98 EaseIn, |
99 EaseOut, | 99 EaseOut, |
100 EaseInOut, | 100 EaseInOut, |
101 Custom | 101 Custom |
102 }; | 102 }; |
103 | 103 |
104 static PassRefPtr<CubicBezierTimingFunction> create(double x1, double y1, do
uble x2, double y2) | 104 static PassRefPtr<CubicBezierTimingFunction> create(double x1, double y1, do
uble x2, double y2) |
(...skipping 23 matching lines...) Expand all Loading... |
128 { | 128 { |
129 DEFINE_STATIC_REF(CubicBezierTimingFunction, easeInOut, (adoptRe
f(new CubicBezierTimingFunction(EaseInOut, 0.42, 0.0, 0.58, 1.0)))); | 129 DEFINE_STATIC_REF(CubicBezierTimingFunction, easeInOut, (adoptRe
f(new CubicBezierTimingFunction(EaseInOut, 0.42, 0.0, 0.58, 1.0)))); |
130 return easeInOut; | 130 return easeInOut; |
131 } | 131 } |
132 default: | 132 default: |
133 ASSERT_NOT_REACHED(); | 133 ASSERT_NOT_REACHED(); |
134 return 0; | 134 return 0; |
135 } | 135 } |
136 } | 136 } |
137 | 137 |
138 ~CubicBezierTimingFunction() { } | 138 virtual ~CubicBezierTimingFunction() { } |
139 | 139 |
140 virtual double evaluate(double fraction, double accuracy) const | 140 virtual double evaluate(double fraction, double accuracy) const OVERRIDE |
141 { | 141 { |
142 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); | 142 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); |
143 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); | 143 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); |
144 if (!m_bezier) | 144 if (!m_bezier) |
145 m_bezier = adoptPtr(new UnitBezier(m_x1, m_y1, m_x2, m_y2)); | 145 m_bezier = adoptPtr(new UnitBezier(m_x1, m_y1, m_x2, m_y2)); |
146 return m_bezier->solve(fraction, accuracy); | 146 return m_bezier->solve(fraction, accuracy); |
147 } | 147 } |
148 | 148 |
149 double x1() const { return m_x1; } | 149 double x1() const { return m_x1; } |
150 double y1() const { return m_y1; } | 150 double y1() const { return m_y1; } |
(...skipping 14 matching lines...) Expand all Loading... |
165 } | 165 } |
166 | 166 |
167 double m_x1; | 167 double m_x1; |
168 double m_y1; | 168 double m_y1; |
169 double m_x2; | 169 double m_x2; |
170 double m_y2; | 170 double m_y2; |
171 SubType m_subType; | 171 SubType m_subType; |
172 mutable OwnPtr<UnitBezier> m_bezier; | 172 mutable OwnPtr<UnitBezier> m_bezier; |
173 }; | 173 }; |
174 | 174 |
175 class StepsTimingFunction : public TimingFunction { | 175 class StepsTimingFunction FINAL : public TimingFunction { |
176 public: | 176 public: |
177 enum SubType { | 177 enum SubType { |
178 Start, | 178 Start, |
179 End, | 179 End, |
180 Custom | 180 Custom |
181 }; | 181 }; |
182 | 182 |
183 static PassRefPtr<StepsTimingFunction> create(int steps, bool stepAtStart) | 183 static PassRefPtr<StepsTimingFunction> create(int steps, bool stepAtStart) |
184 { | 184 { |
185 return adoptRef(new StepsTimingFunction(Custom, steps, stepAtStart)); | 185 return adoptRef(new StepsTimingFunction(Custom, steps, stepAtStart)); |
(...skipping 12 matching lines...) Expand all Loading... |
198 DEFINE_STATIC_REF(StepsTimingFunction, end, (adoptRef(new StepsT
imingFunction(End, 1, false)))); | 198 DEFINE_STATIC_REF(StepsTimingFunction, end, (adoptRef(new StepsT
imingFunction(End, 1, false)))); |
199 return end; | 199 return end; |
200 } | 200 } |
201 default: | 201 default: |
202 ASSERT_NOT_REACHED(); | 202 ASSERT_NOT_REACHED(); |
203 return 0; | 203 return 0; |
204 } | 204 } |
205 } | 205 } |
206 | 206 |
207 | 207 |
208 ~StepsTimingFunction() { } | 208 virtual ~StepsTimingFunction() { } |
209 | 209 |
210 virtual double evaluate(double fraction, double) const | 210 virtual double evaluate(double fraction, double) const OVERRIDE |
211 { | 211 { |
212 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); | 212 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >=
0 && fraction <= 1)); |
213 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); | 213 ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsCSSEnabled() |
| (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Timing
function behavior outside the range [0, 1] is not yet specified"); |
214 return std::min(1.0, (floor(m_steps * fraction) + m_stepAtStart) / m_ste
ps); | 214 return std::min(1.0, (floor(m_steps * fraction) + m_stepAtStart) / m_ste
ps); |
215 } | 215 } |
216 | 216 |
217 int numberOfSteps() const { return m_steps; } | 217 int numberOfSteps() const { return m_steps; } |
218 bool stepAtStart() const { return m_stepAtStart; } | 218 bool stepAtStart() const { return m_stepAtStart; } |
219 | 219 |
220 SubType subType() const { return m_subType; } | 220 SubType subType() const { return m_subType; } |
221 | 221 |
222 private: | 222 private: |
223 StepsTimingFunction(SubType subType, int steps, bool stepAtStart) | 223 StepsTimingFunction(SubType subType, int steps, bool stepAtStart) |
224 : TimingFunction(StepsFunction) | 224 : TimingFunction(StepsFunction) |
225 , m_steps(steps) | 225 , m_steps(steps) |
226 , m_stepAtStart(stepAtStart) | 226 , m_stepAtStart(stepAtStart) |
227 , m_subType(subType) | 227 , m_subType(subType) |
228 { | 228 { |
229 } | 229 } |
230 | 230 |
231 int m_steps; | 231 int m_steps; |
232 bool m_stepAtStart; | 232 bool m_stepAtStart; |
233 SubType m_subType; | 233 SubType m_subType; |
234 }; | 234 }; |
235 | 235 |
236 class ChainedTimingFunction : public TimingFunction { | 236 class ChainedTimingFunction FINAL : public TimingFunction { |
237 public: | 237 public: |
238 static PassRefPtr<ChainedTimingFunction> create() | 238 static PassRefPtr<ChainedTimingFunction> create() |
239 { | 239 { |
240 return adoptRef(new ChainedTimingFunction); | 240 return adoptRef(new ChainedTimingFunction); |
241 } | 241 } |
242 | 242 |
243 void appendSegment(double upperBound, TimingFunction* timingFunction) | 243 void appendSegment(double upperBound, TimingFunction* timingFunction) |
244 { | 244 { |
245 double max = m_segments.isEmpty() ? 0 : m_segments.last().max(); | 245 double max = m_segments.isEmpty() ? 0 : m_segments.last().max(); |
246 ASSERT(upperBound > max); | 246 ASSERT(upperBound > max); |
247 m_segments.append(Segment(max, upperBound, timingFunction)); | 247 m_segments.append(Segment(max, upperBound, timingFunction)); |
248 } | 248 } |
249 virtual double evaluate(double fraction, double accuracy) const | 249 virtual double evaluate(double fraction, double accuracy) const OVERRIDE |
250 { | 250 { |
251 ASSERT_WITH_MESSAGE(fraction >= 0 && fraction <= 1, "Web Animations not
yet implemented: Timing function behavior outside the range [0, 1] is not yet sp
ecified"); | 251 ASSERT_WITH_MESSAGE(fraction >= 0 && fraction <= 1, "Web Animations not
yet implemented: Timing function behavior outside the range [0, 1] is not yet sp
ecified"); |
252 ASSERT(!m_segments.isEmpty()); | 252 ASSERT(!m_segments.isEmpty()); |
253 ASSERT(m_segments.last().max() == 1); | 253 ASSERT(m_segments.last().max() == 1); |
254 size_t i = 0; | 254 size_t i = 0; |
255 const Segment* segment = &m_segments[i++]; | 255 const Segment* segment = &m_segments[i++]; |
256 while (fraction >= segment->max() && i < m_segments.size()) { | 256 while (fraction >= segment->max() && i < m_segments.size()) { |
257 segment = &m_segments[i++]; | 257 segment = &m_segments[i++]; |
258 } | 258 } |
259 return segment->evaluate(fraction, accuracy); | 259 return segment->evaluate(fraction, accuracy); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 value.type() == TimingFunction::typeName##Function) | 321 value.type() == TimingFunction::typeName##Function) |
322 | 322 |
323 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear); | 323 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear); |
324 DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier); | 324 DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier); |
325 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps); | 325 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps); |
326 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Chained); | 326 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Chained); |
327 | 327 |
328 } // namespace WebCore | 328 } // namespace WebCore |
329 | 329 |
330 #endif // TimingFunction_h | 330 #endif // TimingFunction_h |
OLD | NEW |