blob: 1fee2f4dcaba0ea836d03d8a667416ecb9a05ee3 [file] [log] [blame]
// 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/core/v8/Dictionary.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/css/resolver/CSSToStyleMap.h"
namespace blink {
void TimingInput::setStartDelay(Timing& timing, double startDelay)
{
if (std::isfinite(startDelay))
timing.startDelay = startDelay / 1000;
else
timing.startDelay = Timing::defaults().startDelay;
}
void TimingInput::setEndDelay(Timing& timing, double endDelay)
{
if (std::isfinite(endDelay))
timing.endDelay = endDelay / 1000;
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 / 1000;
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)
{
if (RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString))
timing.timingFunction = CSSToStyleMap::mapAnimationTimingFunction(timingFunctionValue.get(), true);
else
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 = Timing::defaults().startDelay;
DictionaryHelper::get(timingInputDictionary, "delay", startDelay);
setStartDelay(result, startDelay);
double endDelay = Timing::defaults().endDelay;
DictionaryHelper::get(timingInputDictionary, "endDelay", endDelay);
setEndDelay(result, endDelay);
String fillMode;
DictionaryHelper::get(timingInputDictionary, "fill", fillMode);
setFillMode(result, fillMode);
double iterationStart = Timing::defaults().iterationStart;
DictionaryHelper::get(timingInputDictionary, "iterationStart", iterationStart);
setIterationStart(result, iterationStart);
double iterationCount = Timing::defaults().iterationCount;
DictionaryHelper::get(timingInputDictionary, "iterations", iterationCount);
setIterationCount(result, iterationCount);
double iterationDuration = 0;
if (DictionaryHelper::get(timingInputDictionary, "duration", iterationDuration)) {
setIterationDuration(result, iterationDuration);
}
double playbackRate = Timing::defaults().playbackRate;
DictionaryHelper::get(timingInputDictionary, "playbackRate", playbackRate);
setPlaybackRate(result, playbackRate);
String direction;
DictionaryHelper::get(timingInputDictionary, "direction", direction);
setPlaybackDirection(result, direction);
String timingFunctionString;
DictionaryHelper::get(timingInputDictionary, "easing", timingFunctionString);
setTimingFunction(result, timingFunctionString);
result.assertValid();
return result;
}
Timing TimingInput::convert(double duration)
{
Timing result;
setIterationDuration(result, duration);
return result;
}
} // namespace blink