// 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 "sky/engine/config.h" #include "sky/engine/core/animation/TimingInput.h" #include "sky/engine/core/css/parser/BisonCSSParser.h" #include "sky/engine/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(iterationStart, 0); else timing.iterationStart = Timing::defaults().iterationStart; } void TimingInput::setIterationCount(Timing& timing, double iterationCount) { if (!std::isnan(iterationCount)) timing.iterationCount = std::max(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 (RefPtr timingFunctionValue = BisonCSSParser::parseAnimationTimingFunctionValue(timingFunctionString)) timing.timingFunction = CSSToStyleMap::mapAnimationTimingFunction(timingFunctionValue.get(), true); else timing.timingFunction = Timing::defaults().timingFunction; } Timing TimingInput::convert(double duration) { Timing result; setIterationDuration(result, duration); return result; } } // namespace blink