Index: Source/core/animation/TimingInput.cpp |
diff --git a/Source/core/animation/TimingInput.cpp b/Source/core/animation/TimingInput.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e8e325c643b9729145ecd9130ac38997965e9dc7 |
--- /dev/null |
+++ b/Source/core/animation/TimingInput.cpp |
@@ -0,0 +1,160 @@ |
+// 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/TimingInput.h" |
+ |
+#include "bindings/v8/Dictionary.h" |
+#include "core/css/parser/BisonCSSParser.h" |
+#include "core/css/resolver/CSSToStyleMap.h" |
+ |
+namespace WebCore { |
+ |
+void TimingInput::setStartDelay(Timing& timing, double startDelay) |
+{ |
+ if (std::isfinite(startDelay)) |
+ timing.startDelay = startDelay; |
+ else |
+ timing.startDelay = Timing::defaults().startDelay; |
+} |
+ |
+void TimingInput::setEndDelay(Timing& timing, double endDelay) |
+{ |
+ if (std::isfinite(endDelay)) |
+ timing.endDelay = endDelay; |
+ else |
+ timing.endDelay = Timing::defaults().endDelay; |
+} |
+ |
+void TimingInput::setFillMode(Timing& timing, const String& fillMode) |
+{ |
+ if (fillMode == "none") { |
+ timing.fillMode = Timing::FillModeNone; |
+ } else if (fillMode == "backwards") { |
+ timing.fillMode = Timing::FillModeBackwards; |
+ } else if (fillMode == "both") { |
+ timing.fillMode = Timing::FillModeBoth; |
+ } else if (fillMode == "forwards") { |
+ timing.fillMode = Timing::FillModeForwards; |
+ } else { |
+ timing.fillMode = Timing::defaults().fillMode; |
+ } |
+} |
+ |
+void TimingInput::setIterationStart(Timing& timing, double iterationStart) |
+{ |
+ if (std::isfinite(iterationStart)) |
+ timing.iterationStart = std::max<double>(iterationStart, 0); |
+ else |
+ timing.iterationStart = Timing::defaults().iterationStart; |
+} |
+ |
+void TimingInput::setIterationCount(Timing& timing, double iterationCount) |
+{ |
+ if (!std::isnan(iterationCount)) |
+ timing.iterationCount = std::max<double>(iterationCount, 0); |
+ else |
+ timing.iterationCount = Timing::defaults().iterationCount; |
+} |
+ |
+void TimingInput::setIterationDuration(Timing& timing, double iterationDuration) |
+{ |
+ if (!std::isnan(iterationDuration) && iterationDuration >= 0) |
+ timing.iterationDuration = iterationDuration; |
+ else |
+ timing.iterationDuration = Timing::defaults().iterationDuration; |
+} |
+ |
+void TimingInput::setPlaybackRate(Timing& timing, double playbackRate) |
+{ |
+ if (std::isfinite(playbackRate)) |
+ timing.playbackRate = playbackRate; |
+ else |
+ timing.playbackRate = Timing::defaults().playbackRate; |
+} |
+ |
+void TimingInput::setPlaybackDirection(Timing& timing, const String& direction) |
+{ |
+ if (direction == "reverse") { |
+ timing.direction = Timing::PlaybackDirectionReverse; |
+ } else if (direction == "alternate") { |
+ timing.direction = Timing::PlaybackDirectionAlternate; |
+ } else if (direction == "alternate-reverse") { |
+ timing.direction = Timing::PlaybackDirectionAlternateReverse; |
+ } else { |
+ timing.direction = Timing::defaults().direction; |
+ } |
+} |
+ |
+void TimingInput::setTimingFunction(Timing& timing, const String& timingFunctionString) |
+{ |
+ RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString); |
+ if (timingFunctionValue) { |
+ RefPtr<TimingFunction> timingFunction = CSSToStyleMap::animationTimingFunction(timingFunctionValue.get(), false); |
+ if (timingFunction) { |
+ timing.timingFunction = timingFunction; |
+ return; |
+ } |
+ } |
+ timing.timingFunction = Timing::defaults().timingFunction; |
+} |
+ |
+Timing TimingInput::convert(const Dictionary& timingInputDictionary) |
+{ |
+ 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); |
+ setStartDelay(result, startDelay); |
+ |
+ double endDelay = 0; |
+ timingInputDictionary.get("endDelay", endDelay); |
+ setEndDelay(result, endDelay); |
+ |
+ String fillMode; |
+ timingInputDictionary.get("fill", fillMode); |
+ setFillMode(result, fillMode); |
+ |
+ double iterationStart = 0; |
+ timingInputDictionary.get("iterationStart", iterationStart); |
+ setIterationStart(result, iterationStart); |
+ |
+ double iterationCount = 1; |
+ timingInputDictionary.get("iterations", iterationCount); |
+ setIterationCount(result, iterationCount); |
+ |
+ v8::Local<v8::Value> iterationDurationValue; |
+ if (timingInputDictionary.get("duration", iterationDurationValue)) { |
+ double iterationDuration = iterationDurationValue->NumberValue(); |
+ setIterationDuration(result, iterationDuration); |
+ } |
+ |
+ double playbackRate = 1; |
+ timingInputDictionary.get("playbackRate", playbackRate); |
+ setPlaybackRate(result, playbackRate); |
+ |
+ String direction; |
+ timingInputDictionary.get("direction", direction); |
+ setPlaybackDirection(result, direction); |
+ |
+ String timingFunctionString; |
+ timingInputDictionary.get("easing", timingFunctionString); |
+ setTimingFunction(result, timingFunctionString); |
+ |
+ result.assertValid(); |
+ |
+ return result; |
+} |
+ |
+Timing TimingInput::convert(double duration) |
+{ |
+ Timing result; |
+ setIterationDuration(result, duration); |
+ return result; |
+} |
+ |
+} // namespace WebCore |