| 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 virtual ~TimingFunction() { } | 47 virtual ~TimingFunction() { } |
| 48 | 48 |
| 49 Type type() const { return m_type; } | 49 Type type() const { return m_type; } |
| 50 | 50 |
| 51 // Evaluates the timing function at the given fraction. The accuracy paramet
er provides a hint as to the required | 51 // Evaluates the timing function at the given fraction. The accuracy paramet
er provides a hint as to the required |
| 52 // accuracy and is not guaranteed. | 52 // accuracy and is not guaranteed. |
| 53 virtual double evaluate(double fraction, double accuracy) const = 0; | 53 virtual double evaluate(double fraction, double accuracy) const = 0; |
| 54 virtual bool operator==(const TimingFunction& other) const = 0; | 54 virtual bool operator==(const TimingFunction& other) const = 0; |
| 55 virtual bool operator!=(const TimingFunction& other) const { return !operato
r==(other); } | 55 virtual bool operator!=(const TimingFunction& other) const { return !operato
r==(other); } |
| 56 | 56 |
| 57 virtual PassRefPtr<TimingFunction> reverse() const = 0; |
| 58 |
| 57 protected: | 59 protected: |
| 58 TimingFunction(Type type) | 60 TimingFunction(Type type) |
| 59 : m_type(type) | 61 : m_type(type) |
| 60 { | 62 { |
| 61 } | 63 } |
| 62 | 64 |
| 63 private: | 65 private: |
| 64 Type m_type; | 66 Type m_type; |
| 65 }; | 67 }; |
| 66 | 68 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 78 ASSERT(RuntimeEnabledFeatures::webAnimationsEnabled() || (fraction >= 0
&& fraction <= 1)); | 80 ASSERT(RuntimeEnabledFeatures::webAnimationsEnabled() || (fraction >= 0
&& fraction <= 1)); |
| 79 RELEASE_ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsEnable
d() || (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Ti
ming function behavior outside the range [0, 1] is not yet specified"); | 81 RELEASE_ASSERT_WITH_MESSAGE(!RuntimeEnabledFeatures::webAnimationsEnable
d() || (fraction >= 0 && fraction <= 1), "Web Animations not yet implemented: Ti
ming function behavior outside the range [0, 1] is not yet specified"); |
| 80 return fraction; | 82 return fraction; |
| 81 } | 83 } |
| 82 | 84 |
| 83 virtual bool operator==(const TimingFunction& other) const | 85 virtual bool operator==(const TimingFunction& other) const |
| 84 { | 86 { |
| 85 return other.type() == LinearFunction; | 87 return other.type() == LinearFunction; |
| 86 } | 88 } |
| 87 | 89 |
| 90 virtual PassRefPtr<TimingFunction> reverse() const |
| 91 { |
| 92 return const_cast<LinearTimingFunction*>(this); |
| 93 } |
| 94 |
| 88 private: | 95 private: |
| 89 LinearTimingFunction() | 96 LinearTimingFunction() |
| 90 : TimingFunction(LinearFunction) | 97 : TimingFunction(LinearFunction) |
| 91 { | 98 { |
| 92 } | 99 } |
| 93 }; | 100 }; |
| 94 | 101 |
| 95 | 102 |
| 96 // Forward declare so we can friend it below. Don't used in production code! | 103 // Forward declare so we can friend it below. Don't used in production code! |
| 97 class ChainedTimingFunctionPrintTo; | 104 class ChainedTimingFunctionPrintTo; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 return m_subType == ctf->m_subType; | 184 return m_subType == ctf->m_subType; |
| 178 } | 185 } |
| 179 | 186 |
| 180 double x1() const { return m_x1; } | 187 double x1() const { return m_x1; } |
| 181 double y1() const { return m_y1; } | 188 double y1() const { return m_y1; } |
| 182 double x2() const { return m_x2; } | 189 double x2() const { return m_x2; } |
| 183 double y2() const { return m_y2; } | 190 double y2() const { return m_y2; } |
| 184 | 191 |
| 185 SubType subType() const { return m_subType; } | 192 SubType subType() const { return m_subType; } |
| 186 | 193 |
| 194 virtual PassRefPtr<TimingFunction> reverse() const |
| 195 { |
| 196 switch (m_subType) { |
| 197 case Ease: |
| 198 return const_cast<CubicBezierTimingFunction*>(this); |
| 199 case EaseIn: |
| 200 return preset(EaseOut); |
| 201 case EaseOut: |
| 202 return preset(EaseIn); |
| 203 case EaseInOut: |
| 204 return const_cast<CubicBezierTimingFunction*>(this); |
| 205 case Custom: |
| 206 // Flip the timing function in x. We also have to flip it in y to |
| 207 // maintain the invariant that it runs from (0, 0) to (1, 1). |
| 208 return create(1 - m_x2, 1 - m_y2, 1 - m_x1, 1 - m_y1); |
| 209 default: |
| 210 ASSERT_NOT_REACHED(); |
| 211 } |
| 212 } |
| 213 |
| 187 private: | 214 private: |
| 188 explicit CubicBezierTimingFunction(SubType subType, double x1, double y1, do
uble x2, double y2) | 215 explicit CubicBezierTimingFunction(SubType subType, double x1, double y1, do
uble x2, double y2) |
| 189 : TimingFunction(CubicBezierFunction) | 216 : TimingFunction(CubicBezierFunction) |
| 190 , m_x1(x1) | 217 , m_x1(x1) |
| 191 , m_y1(y1) | 218 , m_y1(y1) |
| 192 , m_x2(x2) | 219 , m_x2(x2) |
| 193 , m_y2(y2) | 220 , m_y2(y2) |
| 194 , m_subType(subType) | 221 , m_subType(subType) |
| 195 { | 222 { |
| 196 } | 223 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 if (m_subType != Custom) | 289 if (m_subType != Custom) |
| 263 return m_subType == stf->m_subType; | 290 return m_subType == stf->m_subType; |
| 264 return m_steps == stf->m_steps && m_stepAtStart == stf->m_stepAtStart; | 291 return m_steps == stf->m_steps && m_stepAtStart == stf->m_stepAtStart; |
| 265 } | 292 } |
| 266 | 293 |
| 267 int numberOfSteps() const { return m_steps; } | 294 int numberOfSteps() const { return m_steps; } |
| 268 bool stepAtStart() const { return m_stepAtStart; } | 295 bool stepAtStart() const { return m_stepAtStart; } |
| 269 | 296 |
| 270 SubType subType() const { return m_subType; } | 297 SubType subType() const { return m_subType; } |
| 271 | 298 |
| 299 virtual PassRefPtr<TimingFunction> reverse() const |
| 300 { |
| 301 switch (m_subType) { |
| 302 case Start: |
| 303 return preset(End); |
| 304 case End: |
| 305 return preset(Start); |
| 306 case Custom: |
| 307 return create(m_steps, !m_stepAtStart); |
| 308 default: |
| 309 ASSERT_NOT_REACHED(); |
| 310 return 0; |
| 311 } |
| 312 } |
| 313 |
| 272 private: | 314 private: |
| 273 StepsTimingFunction(SubType subType, int steps, bool stepAtStart) | 315 StepsTimingFunction(SubType subType, int steps, bool stepAtStart) |
| 274 : TimingFunction(StepsFunction) | 316 : TimingFunction(StepsFunction) |
| 275 , m_steps(steps) | 317 , m_steps(steps) |
| 276 , m_stepAtStart(stepAtStart) | 318 , m_stepAtStart(stepAtStart) |
| 277 , m_subType(subType) | 319 , m_subType(subType) |
| 278 { | 320 { |
| 279 } | 321 } |
| 280 | 322 |
| 281 int m_steps; | 323 int m_steps; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 if (ctf->m_segments.size() != m_segments.size()) | 364 if (ctf->m_segments.size() != m_segments.size()) |
| 323 return false; | 365 return false; |
| 324 | 366 |
| 325 for (size_t i = 0; i < m_segments.size(); i++) { | 367 for (size_t i = 0; i < m_segments.size(); i++) { |
| 326 if (m_segments[i] != ctf->m_segments[i]) | 368 if (m_segments[i] != ctf->m_segments[i]) |
| 327 return false; | 369 return false; |
| 328 } | 370 } |
| 329 return true; | 371 return true; |
| 330 } | 372 } |
| 331 | 373 |
| 374 virtual PassRefPtr<TimingFunction> reverse() const |
| 375 { |
| 376 RefPtr<ChainedTimingFunction> reversed = create(); |
| 377 for (size_t i = 0; i < m_segments.size(); i++) { |
| 378 size_t index = m_segments.size() - i - 1; |
| 379 |
| 380 reversed->appendSegment(1 - m_segments[index].m_min, m_segments[inde
x].m_timingFunction->reverse().get()); |
| 381 } |
| 382 return reversed; |
| 383 } |
| 384 |
| 332 private: | 385 private: |
| 333 class Segment { | 386 class Segment { |
| 334 public: | 387 public: |
| 335 Segment(double min, double max, TimingFunction* timingFunction) | 388 Segment(double min, double max, TimingFunction* timingFunction) |
| 336 : m_min(min) | 389 : m_min(min) |
| 337 , m_max(max) | 390 , m_max(max) |
| 338 , m_timingFunction(timingFunction) | 391 , m_timingFunction(timingFunction) |
| 339 { } | 392 { } |
| 340 | 393 |
| 341 double max() const { return m_max; } | 394 double max() const { return m_max; } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 Vector<Segment> m_segments; | 432 Vector<Segment> m_segments; |
| 380 | 433 |
| 381 // Allow printing of our segments. Can be removed once | 434 // Allow printing of our segments. Can be removed once |
| 382 // ChainedTimingFunction has a public API for segments. | 435 // ChainedTimingFunction has a public API for segments. |
| 383 friend class ChainedTimingFunctionPrintTo; | 436 friend class ChainedTimingFunctionPrintTo; |
| 384 }; | 437 }; |
| 385 | 438 |
| 386 } // namespace WebCore | 439 } // namespace WebCore |
| 387 | 440 |
| 388 #endif // TimingFunction_h | 441 #endif // TimingFunction_h |
| OLD | NEW |