Index: Source/core/animation/Timing.cpp |
diff --git a/Source/core/animation/Timing.cpp b/Source/core/animation/Timing.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a3aca868b910335f2eda8572a56c35fc76a878c6 |
--- /dev/null |
+++ b/Source/core/animation/Timing.cpp |
@@ -0,0 +1,154 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "config.h" |
+#include "core/animation/Timing.h" |
+ |
+#include "bindings/v8/Dictionary.h" |
+#include "core/css/parser/BisonCSSParser.h" |
+#include "core/css/resolver/CSSToStyleMap.h" |
+ |
+namespace WebCore { |
+ |
+ |
Timothy Loh
2014/02/28 00:55:24
Extra blank line :<
alancutter (OOO until 2018)
2014/03/03 05:09:45
Done.
|
+void Timing::setStartDelay(double startDelay) |
+{ |
+ if (std::isfinite(startDelay)) |
+ this->startDelay = startDelay; |
+ else |
+ this->startDelay = 0; |
+} |
+ |
+void Timing::setEndDelay(double endDelay) |
+{ |
+ if (std::isfinite(endDelay)) |
+ this->endDelay = endDelay; |
+ else |
+ this->endDelay = 0; |
esprehn
2014/02/28 00:57:16
This is wrong, you shouldn't make everything publi
alancutter (OOO until 2018)
2014/03/03 05:09:45
Done, moved setters to a separate TimingInput clas
|
+} |
+ |
+void Timing::setFillMode(const String& fillMode) |
+{ |
+ if (fillMode == "none") { |
+ this->fillMode = Timing::FillModeNone; |
+ } else if (fillMode == "backwards") { |
+ this->fillMode = Timing::FillModeBackwards; |
+ } else if (fillMode == "both") { |
+ this->fillMode = Timing::FillModeBoth; |
+ } else if (fillMode == "forwards") { |
+ this->fillMode = Timing::FillModeForwards; |
+ } else { |
+ this->fillMode = Timing::FillModeAuto; |
+ } |
+} |
+ |
+void Timing::setIterationStart(double iterationStart) |
+{ |
+ if (!std::isnan(iterationStart) && !std::isinf(iterationStart)) |
Timothy Loh
2014/02/28 00:55:24
While you're here, std::isfinite instead of the tw
alancutter (OOO until 2018)
2014/03/03 05:09:45
Done.
|
+ this->iterationStart = std::max<double>(iterationStart, 0); |
+ else |
+ this->iterationStart = 0; |
+} |
+ |
+void Timing::setIterationCount(double iterationCount) |
+{ |
+ if (!std::isnan(iterationCount)) |
+ this->iterationCount = std::max<double>(iterationCount, 0); |
+ else |
+ this->iterationCount = 1; |
+} |
+ |
+void Timing::setIterationDuration(double iterationDuration) |
+{ |
+ if (!std::isnan(iterationDuration) && iterationDuration >= 0) |
+ this->iterationDuration = iterationDuration; |
+ else |
+ this->iterationDuration = std::numeric_limits<double>::quiet_NaN(); |
+} |
+ |
+void Timing::setPlaybackRate(double playbackRate) |
+{ |
+ if (!std::isnan(playbackRate) && !std::isinf(playbackRate)) |
Timothy Loh
2014/02/28 00:55:24
std::isfinite here too.
alancutter (OOO until 2018)
2014/03/03 05:09:45
Done.
|
+ this->playbackRate = playbackRate; |
+ else |
+ this->playbackRate = 1; |
+} |
+ |
+void Timing::setPlaybackDirection(const String& direction) |
+{ |
+ if (direction == "reverse") { |
+ this->direction = Timing::PlaybackDirectionReverse; |
+ } else if (direction == "alternate") { |
+ this->direction = Timing::PlaybackDirectionAlternate; |
+ } else if (direction == "alternate-reverse") { |
+ this->direction = Timing::PlaybackDirectionAlternateReverse; |
+ } else { |
+ this->direction = Timing::PlaybackDirectionNormal; |
+ } |
+} |
+ |
+void Timing::setTimingFunction(const String& timingFunctionString) |
+{ |
+ RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString); |
+ if (timingFunctionValue) { |
+ RefPtr<TimingFunction> timingFunction = CSSToStyleMap::animationTimingFunction(timingFunctionValue.get(), false); |
+ if (timingFunction) { |
+ this->timingFunction = timingFunction; |
+ return; |
+ } |
+ } |
+ this->timingFunction = LinearTimingFunction::create(); |
+} |
+ |
+Timing Timing::convertInput(const Dictionary& timingInputDictionary) |
esprehn
2014/02/28 00:57:16
This is a lot of copying of values. You copy a ton
alancutter (OOO until 2018)
2014/03/03 05:09:45
This function is copying data from V8 into Blink,
|
+{ |
+ Timing result; |
+ |
+ // FIXME: This method needs to be refactored to handle invalid |
+ // null, NaN, Infinity values better. |
+ // See: http://www.w3.org/TR/WebIDL/#es-double |
+ double startDelay = 0; |
+ timingInputDictionary.get("delay", startDelay); |
+ result.setStartDelay(startDelay); |
+ |
+ double endDelay = 0; |
+ timingInputDictionary.get("endDelay", endDelay); |
+ result.setEndDelay(endDelay); |
+ |
+ String fillMode; |
+ timingInputDictionary.get("fill", fillMode); |
+ result.setFillMode(fillMode); |
+ |
+ double iterationStart = 0; |
+ timingInputDictionary.get("iterationStart", iterationStart); |
+ result.setIterationStart(iterationStart); |
+ |
+ double iterationCount = 1; |
+ timingInputDictionary.get("iterations", iterationCount); |
+ result.setIterationCount(iterationCount); |
+ |
+ v8::Local<v8::Value> iterationDurationValue; |
+ if (timingInputDictionary.get("duration", iterationDurationValue)) { |
+ double iterationDuration = iterationDurationValue->NumberValue(); |
+ result.setIterationDuration(iterationDuration); |
+ } |
+ |
+ double playbackRate = 1; |
+ timingInputDictionary.get("playbackRate", playbackRate); |
+ result.setPlaybackRate(playbackRate); |
+ |
+ String direction; |
+ timingInputDictionary.get("direction", direction); |
+ result.setPlaybackDirection(direction); |
+ |
+ String timingFunctionString; |
+ timingInputDictionary.get("easing", timingFunctionString); |
+ result.setTimingFunction(timingFunctionString); |
+ |
+ result.assertValid(); |
+ |
+ return result; |
+} |
+ |
+} // namespace WebCore |