1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "config.h"
6#include "core/animation/AnimationNodeTiming.h"
7
8#include "core/animation/Animation.h"
9#include "core/animation/AnimationNode.h"
10#include "platform/animation/TimingFunction.h"
11
12namespace blink {
13
14PassRefPtrWillBeRawPtr<AnimationNodeTiming> AnimationNodeTiming::create(AnimationNode* parent)
15{
16    return adoptRefWillBeNoop(new AnimationNodeTiming(parent));
17}
18
19AnimationNodeTiming::AnimationNodeTiming(AnimationNode* parent)
20    : m_parent(parent)
21{
22}
23
24double AnimationNodeTiming::delay()
25{
26    return m_parent->specifiedTiming().startDelay * 1000;
27}
28
29double AnimationNodeTiming::endDelay()
30{
31    return m_parent->specifiedTiming().endDelay * 1000;
32}
33
34String AnimationNodeTiming::fill()
35{
36    Timing::FillMode fillMode = m_parent->specifiedTiming().fillMode;
37    switch (fillMode) {
38    case Timing::FillModeNone:
39        return "none";
40    case Timing::FillModeForwards:
41        return "forwards";
42    case Timing::FillModeBackwards:
43        return "backwards";
44    case Timing::FillModeBoth:
45        return "both";
46    case Timing::FillModeAuto:
47        return "auto";
48    }
49    ASSERT_NOT_REACHED();
50    return "auto";
51}
52
53double AnimationNodeTiming::iterationStart()
54{
55    return m_parent->specifiedTiming().iterationStart;
56}
57
58double AnimationNodeTiming::iterations()
59{
60    return m_parent->specifiedTiming().iterationCount;
61}
62
63// This logic was copied from the example in bindings/tests/idls/TestInterface.idl
64// and bindings/tests/results/V8TestInterface.cpp.
65// FIXME: It might be possible to have 'duration' defined as an attribute in the idl.
66// If possible, fix will be in a follow-up patch.
67void AnimationNodeTiming::getDuration(String propertyName, Nullable<double>& element0, String& element1)
68{
69    if (propertyName != "duration")
70        return;
71
72    if (std::isnan(m_parent->specifiedTiming().iterationDuration)) {
73        element1 = "auto";
74        return;
75    }
76    element0.set(m_parent->specifiedTiming().iterationDuration * 1000);
77    return;
78}
79
80double AnimationNodeTiming::playbackRate()
81{
82    return m_parent->specifiedTiming().playbackRate;
83}
84
85String AnimationNodeTiming::direction()
86{
87    Timing::PlaybackDirection direction = m_parent->specifiedTiming().direction;
88    switch (direction) {
89    case Timing::PlaybackDirectionNormal:
90        return "normal";
91    case Timing::PlaybackDirectionReverse:
92        return "reverse";
93    case Timing::PlaybackDirectionAlternate:
94        return "alternate";
95    case Timing::PlaybackDirectionAlternateReverse:
96        return "alternate-reverse";
97    }
98    ASSERT_NOT_REACHED();
99    return "normal";
100}
101
102String AnimationNodeTiming::easing()
103{
104    return m_parent->specifiedTiming().timingFunction->toString();
105}
106
107void AnimationNodeTiming::setDelay(double delay)
108{
109    Timing timing = m_parent->specifiedTiming();
110    TimingInput::setStartDelay(timing, delay);
111    m_parent->updateSpecifiedTiming(timing);
112}
113
114void AnimationNodeTiming::setEndDelay(double endDelay)
115{
116    Timing timing = m_parent->specifiedTiming();
117    TimingInput::setEndDelay(timing, endDelay);
118    m_parent->updateSpecifiedTiming(timing);
119}
120
121void AnimationNodeTiming::setFill(String fill)
122{
123    Timing timing = m_parent->specifiedTiming();
124    TimingInput::setFillMode(timing, fill);
125    m_parent->updateSpecifiedTiming(timing);
126}
127
128void AnimationNodeTiming::setIterationStart(double iterationStart)
129{
130    Timing timing = m_parent->specifiedTiming();
131    TimingInput::setIterationStart(timing, iterationStart);
132    m_parent->updateSpecifiedTiming(timing);
133}
134
135void AnimationNodeTiming::setIterations(double iterations)
136{
137    Timing timing = m_parent->specifiedTiming();
138    TimingInput::setIterationCount(timing, iterations);
139    m_parent->updateSpecifiedTiming(timing);
140}
141
142bool AnimationNodeTiming::setDuration(String name, double duration)
143{
144    if (name != "duration")
145        return false;
146    Timing timing = m_parent->specifiedTiming();
147    TimingInput::setIterationDuration(timing, duration);
148    m_parent->updateSpecifiedTiming(timing);
149    return true;
150}
151
152void AnimationNodeTiming::setPlaybackRate(double playbackRate)
153{
154    Timing timing = m_parent->specifiedTiming();
155    TimingInput::setPlaybackRate(timing, playbackRate);
156    m_parent->updateSpecifiedTiming(timing);
157}
158
159void AnimationNodeTiming::setDirection(String direction)
160{
161    Timing timing = m_parent->specifiedTiming();
162    TimingInput::setPlaybackDirection(timing, direction);
163    m_parent->updateSpecifiedTiming(timing);
164}
165
166void AnimationNodeTiming::setEasing(String easing)
167{
168    Timing timing = m_parent->specifiedTiming();
169    TimingInput::setTimingFunction(timing, easing);
170    m_parent->updateSpecifiedTiming(timing);
171}
172
173void AnimationNodeTiming::trace(Visitor* visitor)
174{
175    visitor->trace(m_parent);
176}
177
178} // namespace blink
179