OLD | NEW |
(Empty) | |
| 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/TimingInput.h" |
| 7 |
| 8 #include "bindings/v8/Dictionary.h" |
| 9 #include "core/css/parser/BisonCSSParser.h" |
| 10 #include "core/css/resolver/CSSToStyleMap.h" |
| 11 |
| 12 namespace WebCore { |
| 13 |
| 14 void TimingInput::setStartDelay(Timing& timing, double startDelay) |
| 15 { |
| 16 if (std::isfinite(startDelay)) |
| 17 timing.startDelay = startDelay; |
| 18 else |
| 19 timing.startDelay = Timing::defaults().startDelay; |
| 20 } |
| 21 |
| 22 void TimingInput::setEndDelay(Timing& timing, double endDelay) |
| 23 { |
| 24 if (std::isfinite(endDelay)) |
| 25 timing.endDelay = endDelay; |
| 26 else |
| 27 timing.endDelay = Timing::defaults().endDelay; |
| 28 } |
| 29 |
| 30 void TimingInput::setFillMode(Timing& timing, const String& fillMode) |
| 31 { |
| 32 if (fillMode == "none") { |
| 33 timing.fillMode = Timing::FillModeNone; |
| 34 } else if (fillMode == "backwards") { |
| 35 timing.fillMode = Timing::FillModeBackwards; |
| 36 } else if (fillMode == "both") { |
| 37 timing.fillMode = Timing::FillModeBoth; |
| 38 } else if (fillMode == "forwards") { |
| 39 timing.fillMode = Timing::FillModeForwards; |
| 40 } else { |
| 41 timing.fillMode = Timing::defaults().fillMode; |
| 42 } |
| 43 } |
| 44 |
| 45 void TimingInput::setIterationStart(Timing& timing, double iterationStart) |
| 46 { |
| 47 if (std::isfinite(iterationStart)) |
| 48 timing.iterationStart = std::max<double>(iterationStart, 0); |
| 49 else |
| 50 timing.iterationStart = Timing::defaults().iterationStart; |
| 51 } |
| 52 |
| 53 void TimingInput::setIterationCount(Timing& timing, double iterationCount) |
| 54 { |
| 55 if (!std::isnan(iterationCount)) |
| 56 timing.iterationCount = std::max<double>(iterationCount, 0); |
| 57 else |
| 58 timing.iterationCount = Timing::defaults().iterationCount; |
| 59 } |
| 60 |
| 61 void TimingInput::setIterationDuration(Timing& timing, double iterationDuration) |
| 62 { |
| 63 if (!std::isnan(iterationDuration) && iterationDuration >= 0) |
| 64 timing.iterationDuration = iterationDuration; |
| 65 else |
| 66 timing.iterationDuration = Timing::defaults().iterationDuration; |
| 67 } |
| 68 |
| 69 void TimingInput::setPlaybackRate(Timing& timing, double playbackRate) |
| 70 { |
| 71 if (std::isfinite(playbackRate)) |
| 72 timing.playbackRate = playbackRate; |
| 73 else |
| 74 timing.playbackRate = Timing::defaults().playbackRate; |
| 75 } |
| 76 |
| 77 void TimingInput::setPlaybackDirection(Timing& timing, const String& direction) |
| 78 { |
| 79 if (direction == "reverse") { |
| 80 timing.direction = Timing::PlaybackDirectionReverse; |
| 81 } else if (direction == "alternate") { |
| 82 timing.direction = Timing::PlaybackDirectionAlternate; |
| 83 } else if (direction == "alternate-reverse") { |
| 84 timing.direction = Timing::PlaybackDirectionAlternateReverse; |
| 85 } else { |
| 86 timing.direction = Timing::defaults().direction; |
| 87 } |
| 88 } |
| 89 |
| 90 void TimingInput::setTimingFunction(Timing& timing, const String& timingFunction
String) |
| 91 { |
| 92 RefPtrWillBeRawPtr<CSSValue> timingFunctionValue = BisonCSSParser::parseAnim
ationTimingFunctionValue(timingFunctionString); |
| 93 if (timingFunctionValue) { |
| 94 RefPtr<TimingFunction> timingFunction = CSSToStyleMap::animationTimingFu
nction(timingFunctionValue.get(), false); |
| 95 if (timingFunction) { |
| 96 timing.timingFunction = timingFunction; |
| 97 return; |
| 98 } |
| 99 } |
| 100 timing.timingFunction = Timing::defaults().timingFunction; |
| 101 } |
| 102 |
| 103 Timing TimingInput::convert(const Dictionary& timingInputDictionary) |
| 104 { |
| 105 Timing result; |
| 106 |
| 107 // FIXME: This method needs to be refactored to handle invalid |
| 108 // null, NaN, Infinity values better. |
| 109 // See: http://www.w3.org/TR/WebIDL/#es-double |
| 110 double startDelay = 0; |
| 111 timingInputDictionary.get("delay", startDelay); |
| 112 setStartDelay(result, startDelay); |
| 113 |
| 114 double endDelay = 0; |
| 115 timingInputDictionary.get("endDelay", endDelay); |
| 116 setEndDelay(result, endDelay); |
| 117 |
| 118 String fillMode; |
| 119 timingInputDictionary.get("fill", fillMode); |
| 120 setFillMode(result, fillMode); |
| 121 |
| 122 double iterationStart = 0; |
| 123 timingInputDictionary.get("iterationStart", iterationStart); |
| 124 setIterationStart(result, iterationStart); |
| 125 |
| 126 double iterationCount = 1; |
| 127 timingInputDictionary.get("iterations", iterationCount); |
| 128 setIterationCount(result, iterationCount); |
| 129 |
| 130 v8::Local<v8::Value> iterationDurationValue; |
| 131 if (timingInputDictionary.get("duration", iterationDurationValue)) { |
| 132 double iterationDuration = iterationDurationValue->NumberValue(); |
| 133 setIterationDuration(result, iterationDuration); |
| 134 } |
| 135 |
| 136 double playbackRate = 1; |
| 137 timingInputDictionary.get("playbackRate", playbackRate); |
| 138 setPlaybackRate(result, playbackRate); |
| 139 |
| 140 String direction; |
| 141 timingInputDictionary.get("direction", direction); |
| 142 setPlaybackDirection(result, direction); |
| 143 |
| 144 String timingFunctionString; |
| 145 timingInputDictionary.get("easing", timingFunctionString); |
| 146 setTimingFunction(result, timingFunctionString); |
| 147 |
| 148 result.assertValid(); |
| 149 |
| 150 return result; |
| 151 } |
| 152 |
| 153 Timing TimingInput::convert(double duration) |
| 154 { |
| 155 Timing result; |
| 156 setIterationDuration(result, duration); |
| 157 return result; |
| 158 } |
| 159 |
| 160 } // namespace WebCore |
OLD | NEW |