1d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// found in the LICENSE file.
4d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "config.h"
6d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/animation/TimingInput.h"
7d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/Dictionary.h"
97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/animation/AnimationInputHelpers.h"
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
11c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
13d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setStartDelay(Timing& timing, double startDelay)
14d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isfinite(startDelay))
1610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        timing.startDelay = startDelay / 1000;
17d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
18d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.startDelay = Timing::defaults().startDelay;
19d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
20d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
21d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setEndDelay(Timing& timing, double endDelay)
22d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
23d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isfinite(endDelay))
2410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        timing.endDelay = endDelay / 1000;
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
26d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.endDelay = Timing::defaults().endDelay;
27d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
29d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setFillMode(Timing& timing, const String& fillMode)
30d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (fillMode == "none") {
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.fillMode = Timing::FillModeNone;
33d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (fillMode == "backwards") {
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.fillMode = Timing::FillModeBackwards;
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (fillMode == "both") {
36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.fillMode = Timing::FillModeBoth;
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (fillMode == "forwards") {
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.fillMode = Timing::FillModeForwards;
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.fillMode = Timing::defaults().fillMode;
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setIterationStart(Timing& timing, double iterationStart)
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isfinite(iterationStart))
47d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.iterationStart = std::max<double>(iterationStart, 0);
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.iterationStart = Timing::defaults().iterationStart;
50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setIterationCount(Timing& timing, double iterationCount)
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!std::isnan(iterationCount))
55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.iterationCount = std::max<double>(iterationCount, 0);
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.iterationCount = Timing::defaults().iterationCount;
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setIterationDuration(Timing& timing, double iterationDuration)
61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!std::isnan(iterationDuration) && iterationDuration >= 0)
6310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        timing.iterationDuration = iterationDuration / 1000;
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.iterationDuration = Timing::defaults().iterationDuration;
66d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setPlaybackRate(Timing& timing, double playbackRate)
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
70d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (std::isfinite(playbackRate))
71d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.playbackRate = playbackRate;
72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.playbackRate = Timing::defaults().playbackRate;
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setPlaybackDirection(Timing& timing, const String& direction)
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (direction == "reverse") {
79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.direction = Timing::PlaybackDirectionReverse;
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (direction == "alternate") {
81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.direction = Timing::PlaybackDirectionAlternate;
82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (direction == "alternate-reverse") {
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.direction = Timing::PlaybackDirectionAlternateReverse;
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        timing.direction = Timing::defaults().direction;
86d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void TimingInput::setTimingFunction(Timing& timing, const String& timingFunctionString)
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (RefPtr<TimingFunction> timingFunction = AnimationInputHelpers::parseTimingFunction(timingFunctionString))
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        timing.timingFunction = timingFunction;
93d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    else
94d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        timing.timingFunction = Timing::defaults().timingFunction;
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Timing TimingInput::convert(const Dictionary& timingInputDictionary)
98d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Timing result;
100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: This method needs to be refactored to handle invalid
102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // null, NaN, Infinity values better.
103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // See: http://www.w3.org/TR/WebIDL/#es-double
10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double startDelay = Timing::defaults().startDelay;
105197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "delay", startDelay);
106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setStartDelay(result, startDelay);
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double endDelay = Timing::defaults().endDelay;
109197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "endDelay", endDelay);
110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setEndDelay(result, endDelay);
111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String fillMode;
113197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "fill", fillMode);
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setFillMode(result, fillMode);
115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double iterationStart = Timing::defaults().iterationStart;
117197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "iterationStart", iterationStart);
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setIterationStart(result, iterationStart);
119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double iterationCount = Timing::defaults().iterationCount;
121197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "iterations", iterationCount);
122d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setIterationCount(result, iterationCount);
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double iterationDuration = 0;
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (DictionaryHelper::get(timingInputDictionary, "duration", iterationDuration)) {
126d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        setIterationDuration(result, iterationDuration);
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
12907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double playbackRate = Timing::defaults().playbackRate;
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "playbackRate", playbackRate);
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setPlaybackRate(result, playbackRate);
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String direction;
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "direction", direction);
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setPlaybackDirection(result, direction);
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String timingFunctionString;
138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DictionaryHelper::get(timingInputDictionary, "easing", timingFunctionString);
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setTimingFunction(result, timingFunctionString);
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    result.assertValid();
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return result;
144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)Timing TimingInput::convert(double duration)
147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Timing result;
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setIterationDuration(result, duration);
150d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return result;
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
152d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
154