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