Chromium Code Reviews| 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 16 matching lines...) Expand all Loading... | |
| 27 | 27 |
| 28 #include "RuntimeEnabledFeatures.h" | 28 #include "RuntimeEnabledFeatures.h" |
| 29 #include "platform/animation/AnimationUtilities.h" // For blend() | 29 #include "platform/animation/AnimationUtilities.h" // For blend() |
| 30 #include "platform/animation/UnitBezier.h" | 30 #include "platform/animation/UnitBezier.h" |
| 31 #include "wtf/OwnPtr.h" | 31 #include "wtf/OwnPtr.h" |
| 32 #include "wtf/PassOwnPtr.h" | 32 #include "wtf/PassOwnPtr.h" |
| 33 #include "wtf/PassRefPtr.h" | 33 #include "wtf/PassRefPtr.h" |
| 34 #include "wtf/RefCounted.h" | 34 #include "wtf/RefCounted.h" |
| 35 #include "wtf/StdLibExtras.h" | 35 #include "wtf/StdLibExtras.h" |
| 36 #include "wtf/Vector.h" | 36 #include "wtf/Vector.h" |
| 37 #include "wtf/text/StringBuilder.h" | |
| 38 #include "wtf/text/WTFString.h" | |
| 37 #include <algorithm> | 39 #include <algorithm> |
| 38 | 40 |
| 39 | 41 |
| 40 namespace WebCore { | 42 namespace WebCore { |
| 41 | 43 |
| 42 class TimingFunction : public RefCounted<TimingFunction> { | 44 class TimingFunction : public RefCounted<TimingFunction> { |
| 43 public: | 45 public: |
| 44 | 46 |
| 45 enum Type { | 47 enum Type { |
| 46 LinearFunction, CubicBezierFunction, StepsFunction, ChainedFunction | 48 LinearFunction, CubicBezierFunction, StepsFunction, ChainedFunction |
| 47 }; | 49 }; |
| 48 | 50 |
| 49 virtual ~TimingFunction() { } | 51 virtual ~TimingFunction() { } |
| 50 | 52 |
| 51 Type type() const { return m_type; } | 53 Type type() const { return m_type; } |
| 52 | 54 |
| 55 virtual String toString() const { return ""; } | |
|
abarth-chromium
2014/02/13 03:09:38
Please move virtual functions out of line.
| |
| 56 | |
| 53 // Evaluates the timing function at the given fraction. The accuracy paramet er provides a hint as to the required | 57 // Evaluates the timing function at the given fraction. The accuracy paramet er provides a hint as to the required |
| 54 // accuracy and is not guaranteed. | 58 // accuracy and is not guaranteed. |
| 55 virtual double evaluate(double fraction, double accuracy) const = 0; | 59 virtual double evaluate(double fraction, double accuracy) const = 0; |
| 56 | 60 |
| 57 protected: | 61 protected: |
| 58 TimingFunction(Type type) | 62 TimingFunction(Type type) |
| 59 : m_type(type) | 63 : m_type(type) |
| 60 { | 64 { |
| 61 } | 65 } |
| 62 | 66 |
| 63 private: | 67 private: |
| 64 Type m_type; | 68 Type m_type; |
| 65 }; | 69 }; |
| 66 | 70 |
| 67 class LinearTimingFunction FINAL : public TimingFunction { | 71 class LinearTimingFunction FINAL : public TimingFunction { |
| 68 public: | 72 public: |
| 69 static PassRefPtr<LinearTimingFunction> create() | 73 static PassRefPtr<LinearTimingFunction> create() |
| 70 { | 74 { |
| 71 return adoptRef(new LinearTimingFunction); | 75 return adoptRef(new LinearTimingFunction); |
| 72 } | 76 } |
| 73 | 77 |
| 74 virtual ~LinearTimingFunction() { } | 78 virtual ~LinearTimingFunction() { } |
| 75 | 79 |
| 80 virtual String toString() const OVERRIDE { return "linear"; } | |
|
abarth-chromium
2014/02/13 03:09:38
ditto
| |
| 81 | |
| 76 virtual double evaluate(double fraction, double) const OVERRIDE | 82 virtual double evaluate(double fraction, double) const OVERRIDE |
| 77 { | 83 { |
| 78 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1)); | 84 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"); | 85 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; | 86 return fraction; |
| 81 } | 87 } |
| 82 | 88 |
| 83 private: | 89 private: |
| 84 LinearTimingFunction() | 90 LinearTimingFunction() |
| 85 : TimingFunction(LinearFunction) | 91 : TimingFunction(LinearFunction) |
| 86 { | 92 { |
| 87 } | 93 } |
| 88 }; | 94 }; |
| 89 | 95 |
| 90 | |
| 91 // Forward declare so we can friend it below. Don't use in production code! | 96 // Forward declare so we can friend it below. Don't use in production code! |
| 92 class ChainedTimingFunctionTestHelper; | 97 class ChainedTimingFunctionTestHelper; |
| 93 | 98 |
| 94 class CubicBezierTimingFunction FINAL : public TimingFunction { | 99 class CubicBezierTimingFunction FINAL : public TimingFunction { |
| 95 public: | 100 public: |
| 96 enum SubType { | 101 enum SubType { |
| 97 Ease, | 102 Ease, |
| 98 EaseIn, | 103 EaseIn, |
| 99 EaseOut, | 104 EaseOut, |
| 100 EaseInOut, | 105 EaseInOut, |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 130 return easeInOut; | 135 return easeInOut; |
| 131 } | 136 } |
| 132 default: | 137 default: |
| 133 ASSERT_NOT_REACHED(); | 138 ASSERT_NOT_REACHED(); |
| 134 return 0; | 139 return 0; |
| 135 } | 140 } |
| 136 } | 141 } |
| 137 | 142 |
| 138 virtual ~CubicBezierTimingFunction() { } | 143 virtual ~CubicBezierTimingFunction() { } |
| 139 | 144 |
| 145 virtual String toString() const OVERRIDE | |
| 146 { | |
| 147 switch (this->subType()) { | |
| 148 case CubicBezierTimingFunction::Ease: | |
| 149 return "ease"; | |
| 150 break; | |
| 151 case CubicBezierTimingFunction::EaseIn: | |
| 152 return "ease-in"; | |
| 153 break; | |
| 154 case CubicBezierTimingFunction::EaseOut: | |
| 155 return "ease-out"; | |
| 156 break; | |
| 157 case CubicBezierTimingFunction::EaseInOut: | |
| 158 return "ease-in-out"; | |
| 159 break; | |
| 160 case CubicBezierTimingFunction::Custom: | |
| 161 return "cubic-bezier(" + String::numberToStringECMAScript(this->x1() ) + ", " + | |
| 162 String::numberToStringECMAScript(this->y1()) + ", " + String::nu mberToStringECMAScript(this->x2()) + | |
| 163 ", " + String::numberToStringECMAScript(this->y2()) + ")"; | |
| 164 break; | |
| 165 default: | |
| 166 ASSERT_NOT_REACHED(); | |
| 167 } | |
| 168 return ""; | |
| 169 } | |
| 170 | |
| 140 virtual double evaluate(double fraction, double accuracy) const OVERRIDE | 171 virtual double evaluate(double fraction, double accuracy) const OVERRIDE |
| 141 { | 172 { |
| 142 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1)); | 173 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"); | 174 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) | 175 if (!m_bezier) |
| 145 m_bezier = adoptPtr(new UnitBezier(m_x1, m_y1, m_x2, m_y2)); | 176 m_bezier = adoptPtr(new UnitBezier(m_x1, m_y1, m_x2, m_y2)); |
| 146 return m_bezier->solve(fraction, accuracy); | 177 return m_bezier->solve(fraction, accuracy); |
| 147 } | 178 } |
| 148 | 179 |
| 149 double x1() const { return m_x1; } | 180 double x1() const { return m_x1; } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 } | 231 } |
| 201 default: | 232 default: |
| 202 ASSERT_NOT_REACHED(); | 233 ASSERT_NOT_REACHED(); |
| 203 return 0; | 234 return 0; |
| 204 } | 235 } |
| 205 } | 236 } |
| 206 | 237 |
| 207 | 238 |
| 208 virtual ~StepsTimingFunction() { } | 239 virtual ~StepsTimingFunction() { } |
| 209 | 240 |
| 241 virtual String toString() const OVERRIDE | |
| 242 { | |
| 243 StringBuilder builder; | |
| 244 switch (this->subType()) { | |
| 245 case StepsTimingFunction::Start: | |
| 246 return "step-start"; | |
| 247 break; | |
| 248 case StepsTimingFunction::End: | |
| 249 return "step-end"; | |
| 250 break; | |
| 251 case StepsTimingFunction::Custom: | |
| 252 builder.append("steps(" + String::numberToStringECMAScript(this->num berOfSteps()) + ", "); | |
| 253 builder.append(this->stepAtStart() ? "start" : "end"); | |
| 254 builder.append(")"); | |
| 255 break; | |
| 256 default: | |
| 257 ASSERT_NOT_REACHED(); | |
| 258 } | |
| 259 return builder.toString(); | |
| 260 } | |
| 261 | |
| 210 virtual double evaluate(double fraction, double) const OVERRIDE | 262 virtual double evaluate(double fraction, double) const OVERRIDE |
| 211 { | 263 { |
| 212 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled() || (fraction >= 0 && fraction <= 1)); | 264 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"); | 265 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); | 266 return std::min(1.0, (floor(m_steps * fraction) + m_stepAtStart) / m_ste ps); |
| 215 } | 267 } |
| 216 | 268 |
| 217 int numberOfSteps() const { return m_steps; } | 269 int numberOfSteps() const { return m_steps; } |
| 218 bool stepAtStart() const { return m_stepAtStart; } | 270 bool stepAtStart() const { return m_stepAtStart; } |
| 219 | 271 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 239 { | 291 { |
| 240 return adoptRef(new ChainedTimingFunction); | 292 return adoptRef(new ChainedTimingFunction); |
| 241 } | 293 } |
| 242 | 294 |
| 243 void appendSegment(double upperBound, TimingFunction* timingFunction) | 295 void appendSegment(double upperBound, TimingFunction* timingFunction) |
| 244 { | 296 { |
| 245 double max = m_segments.isEmpty() ? 0 : m_segments.last().max(); | 297 double max = m_segments.isEmpty() ? 0 : m_segments.last().max(); |
| 246 ASSERT(upperBound > max); | 298 ASSERT(upperBound > max); |
| 247 m_segments.append(Segment(max, upperBound, timingFunction)); | 299 m_segments.append(Segment(max, upperBound, timingFunction)); |
| 248 } | 300 } |
| 301 | |
| 302 virtual String toString() const OVERRIDE | |
| 303 { | |
| 304 StringBuilder builder; | |
| 305 builder.append("chained("); | |
| 306 for (size_t i = 0; i < this->m_segments.size(); i++) { | |
| 307 ChainedTimingFunction::Segment segment = this->m_segments[i]; | |
| 308 builder.append(segment.m_timingFunction->toString()); | |
| 309 builder.append("[" + String::numberToStringECMAScript(segment.m_min) + " -> " + String::numberToStringECMAScript(segment.m_max) + "]"); | |
| 310 if (i+1 != this->m_segments.size()) { | |
| 311 builder.append(", "); | |
| 312 } | |
| 313 } | |
| 314 builder.append(")"); | |
| 315 return builder.toString(); | |
| 316 } | |
| 317 | |
| 249 virtual double evaluate(double fraction, double accuracy) const OVERRIDE | 318 virtual double evaluate(double fraction, double accuracy) const OVERRIDE |
| 250 { | 319 { |
| 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"); | 320 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()); | 321 ASSERT(!m_segments.isEmpty()); |
| 253 ASSERT(m_segments.last().max() == 1); | 322 ASSERT(m_segments.last().max() == 1); |
| 254 size_t i = 0; | 323 size_t i = 0; |
| 255 const Segment* segment = &m_segments[i++]; | 324 const Segment* segment = &m_segments[i++]; |
| 256 while (fraction >= segment->max() && i < m_segments.size()) { | 325 while (fraction >= segment->max() && i < m_segments.size()) { |
| 257 segment = &m_segments[i++]; | 326 segment = &m_segments[i++]; |
| 258 } | 327 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 285 // FIXME: Come up with a public API for the segments and remove this. | 354 // FIXME: Come up with a public API for the segments and remove this. |
| 286 friend class CompositorAnimationsImpl; | 355 friend class CompositorAnimationsImpl; |
| 287 friend class CompositorAnimations; | 356 friend class CompositorAnimations; |
| 288 | 357 |
| 289 // Allow the compositor to reverse the timing function. | 358 // Allow the compositor to reverse the timing function. |
| 290 friend class CompositorAnimationsTimingFunctionReverser; | 359 friend class CompositorAnimationsTimingFunctionReverser; |
| 291 | 360 |
| 292 // Allow PrintTo/operator== of the segments. Can be removed once | 361 // Allow PrintTo/operator== of the segments. Can be removed once |
| 293 // ChainedTimingFunction has a public API for segments. | 362 // ChainedTimingFunction has a public API for segments. |
| 294 friend class ChainedTimingFunctionTestHelper; | 363 friend class ChainedTimingFunctionTestHelper; |
| 364 friend class ChainedTimingFunction; | |
| 295 }; | 365 }; |
| 296 | 366 |
| 297 ChainedTimingFunction() | 367 ChainedTimingFunction() |
| 298 : TimingFunction(ChainedFunction) | 368 : TimingFunction(ChainedFunction) |
| 299 { | 369 { |
| 300 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled()); | 370 ASSERT(RuntimeEnabledFeatures::webAnimationsCSSEnabled()); |
| 301 } | 371 } |
| 302 | 372 |
| 303 Vector<Segment> m_segments; | 373 Vector<Segment> m_segments; |
| 304 | 374 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 321 value.type() == TimingFunction::typeName##Function) | 391 value.type() == TimingFunction::typeName##Function) |
| 322 | 392 |
| 323 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear); | 393 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear); |
| 324 DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier); | 394 DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier); |
| 325 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps); | 395 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps); |
| 326 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Chained); | 396 DEFINE_TIMING_FUNCTION_TYPE_CASTS(Chained); |
| 327 | 397 |
| 328 } // namespace WebCore | 398 } // namespace WebCore |
| 329 | 399 |
| 330 #endif // TimingFunction_h | 400 #endif // TimingFunction_h |
| OLD | NEW |