| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 void AnimationEffect::updateSpecifiedTiming(const Timing& timing) | 87 void AnimationEffect::updateSpecifiedTiming(const Timing& timing) |
| 88 { | 88 { |
| 89 // FIXME: Test whether the timing is actually different? | 89 // FIXME: Test whether the timing is actually different? |
| 90 m_timing = timing; | 90 m_timing = timing; |
| 91 invalidate(); | 91 invalidate(); |
| 92 if (m_animation) | 92 if (m_animation) |
| 93 m_animation->setOutdated(); | 93 m_animation->setOutdated(); |
| 94 specifiedTimingChanged(); | 94 specifiedTimingChanged(); |
| 95 } | 95 } |
| 96 | 96 |
| 97 void AnimationEffect::computedTiming(ComputedTimingProperties& computedTiming) | 97 void AnimationEffect::getComputedTiming(ComputedTimingProperties& computedTiming
) |
| 98 { | 98 { |
| 99 // ComputedTimingProperties members. | 99 // ComputedTimingProperties members. |
| 100 computedTiming.setStartTime(0); | |
| 101 computedTiming.setEndTime(endTimeInternal() * 1000); | 100 computedTiming.setEndTime(endTimeInternal() * 1000); |
| 102 computedTiming.setActiveDuration(activeDurationInternal() * 1000); | 101 computedTiming.setActiveDuration(activeDurationInternal() * 1000); |
| 103 | 102 |
| 104 // FIXME: These should be null if not in effect, but current dictionary API | 103 // FIXME: These should be null if not in effect, but current dictionary API |
| 105 // will treat these as undefined. | 104 // will treat these as undefined. |
| 106 if (ensureCalculated().isInEffect) { | 105 if (ensureCalculated().isInEffect) { |
| 107 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); | 106 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); |
| 108 computedTiming.setTimeFraction(ensureCalculated().timeFraction); | 107 computedTiming.setProgress(ensureCalculated().progress); |
| 109 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); | 108 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); |
| 110 } | 109 } |
| 111 | 110 |
| 112 // KeyframeEffectOptions members. | 111 // KeyframeEffectOptions members. |
| 113 computedTiming.setDelay(specifiedTiming().startDelay * 1000); | 112 computedTiming.setDelay(specifiedTiming().startDelay * 1000); |
| 114 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); | 113 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); |
| 115 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi
ng().fillMode, isKeyframeEffect()))); | 114 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi
ng().fillMode, isKeyframeEffect()))); |
| 116 computedTiming.setIterationStart(specifiedTiming().iterationStart); | 115 computedTiming.setIterationStart(specifiedTiming().iterationStart); |
| 117 computedTiming.setIterations(specifiedTiming().iterationCount); | 116 computedTiming.setIterations(specifiedTiming().iterationCount); |
| 118 | 117 |
| 119 UnrestrictedDoubleOrString duration; | 118 UnrestrictedDoubleOrString duration; |
| 120 duration.setUnrestrictedDouble(iterationDuration() * 1000); | 119 duration.setUnrestrictedDouble(iterationDuration() * 1000); |
| 121 computedTiming.setDuration(duration); | 120 computedTiming.setDuration(duration); |
| 122 | 121 |
| 123 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); | 122 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); |
| 124 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming(
).direction)); | 123 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming(
).direction)); |
| 125 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); | 124 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); |
| 126 } | 125 } |
| 127 | 126 |
| 128 ComputedTimingProperties AnimationEffect::computedTiming() | 127 ComputedTimingProperties AnimationEffect::getComputedTiming() |
| 129 { | 128 { |
| 130 ComputedTimingProperties result; | 129 ComputedTimingProperties result; |
| 131 computedTiming(result); | 130 getComputedTiming(result); |
| 132 return result; | 131 return result; |
| 133 } | 132 } |
| 134 | 133 |
| 135 | 134 |
| 136 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas
on reason) const | 135 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas
on reason) const |
| 137 { | 136 { |
| 138 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(
isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation
()->effectSuppressed()); | 137 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(
isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation
()->effectSuppressed()); |
| 139 m_needsUpdate = false; | 138 m_needsUpdate = false; |
| 140 m_lastUpdateTime = inheritedTime; | 139 m_lastUpdateTime = inheritedTime; |
| 141 | 140 |
| 142 const double localTime = inheritedTime; | 141 const double localTime = inheritedTime; |
| 143 double timeToNextIteration = std::numeric_limits<double>::infinity(); | 142 double timeToNextIteration = std::numeric_limits<double>::infinity(); |
| 144 if (needsUpdate) { | 143 if (needsUpdate) { |
| 145 const double activeDuration = this->activeDurationInternal(); | 144 const double activeDuration = this->activeDurationInternal(); |
| 146 | 145 |
| 147 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t
iming); | 146 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t
iming); |
| 148 // FIXME: parentPhase depends on groups being implemented. | 147 // FIXME: parentPhase depends on groups being implemented. |
| 149 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; | 148 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; |
| 150 const double activeTime = calculateActiveTime(activeDuration, resolvedFi
llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh
ase, m_timing); | 149 const double activeTime = calculateActiveTime(activeDuration, resolvedFi
llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh
ase, m_timing); |
| 151 | 150 |
| 152 double currentIteration; | 151 double currentIteration; |
| 153 double timeFraction; | 152 double progress; |
| 154 if (const double iterationDuration = this->iterationDuration()) { | 153 if (const double iterationDuration = this->iterationDuration()) { |
| 155 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter
ationStart, iterationDuration); | 154 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter
ationStart, iterationDuration); |
| 156 ASSERT(startOffset >= 0); | 155 ASSERT(startOffset >= 0); |
| 157 const double scaledActiveTime = calculateScaledActiveTime(activeDura
tion, activeTime, startOffset, m_timing); | 156 const double scaledActiveTime = calculateScaledActiveTime(activeDura
tion, activeTime, startOffset, m_timing); |
| 158 const double iterationTime = calculateIterationTime(iterationDuratio
n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); | 157 const double iterationTime = calculateIterationTime(iterationDuratio
n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); |
| 159 | 158 |
| 160 currentIteration = calculateCurrentIteration(iterationDuration, iter
ationTime, scaledActiveTime, m_timing); | 159 currentIteration = calculateCurrentIteration(iterationDuration, iter
ationTime, scaledActiveTime, m_timing); |
| 161 const double transformedTime = calculateTransformedTime(currentItera
tion, iterationDuration, iterationTime, m_timing); | 160 const double transformedTime = calculateTransformedTime(currentItera
tion, iterationDuration, iterationTime, m_timing); |
| 162 | 161 |
| 163 // The infinite iterationDuration case here is a workaround because | 162 // The infinite iterationDuration case here is a workaround because |
| 164 // the specified behaviour does not handle infinite durations well. | 163 // the specified behaviour does not handle infinite durations well. |
| 165 // There is an open issue against the spec to fix this: | 164 // There is an open issue against the spec to fix this: |
| 166 // https://github.com/w3c/web-animations/issues/142 | 165 // https://github.com/w3c/web-animations/issues/142 |
| 167 if (!std::isfinite(iterationDuration)) | 166 if (!std::isfinite(iterationDuration)) |
| 168 timeFraction = fmod(m_timing.iterationStart, 1.0); | 167 progress = fmod(m_timing.iterationStart, 1.0); |
| 169 else | 168 else |
| 170 timeFraction = transformedTime / iterationDuration; | 169 progress = transformedTime / iterationDuration; |
| 171 | 170 |
| 172 if (!isNull(iterationTime)) { | 171 if (!isNull(iterationTime)) { |
| 173 timeToNextIteration = (iterationDuration - iterationTime) / std:
:abs(m_timing.playbackRate); | 172 timeToNextIteration = (iterationDuration - iterationTime) / std:
:abs(m_timing.playbackRate); |
| 174 if (activeDuration - activeTime < timeToNextIteration) | 173 if (activeDuration - activeTime < timeToNextIteration) |
| 175 timeToNextIteration = std::numeric_limits<double>::infinity(
); | 174 timeToNextIteration = std::numeric_limits<double>::infinity(
); |
| 176 } | 175 } |
| 177 } else { | 176 } else { |
| 178 const double localIterationDuration = 1; | 177 const double localIterationDuration = 1; |
| 179 const double localRepeatedDuration = localIterationDuration * m_timi
ng.iterationCount; | 178 const double localRepeatedDuration = localIterationDuration * m_timi
ng.iterationCount; |
| 180 ASSERT(localRepeatedDuration >= 0); | 179 ASSERT(localRepeatedDuration >= 0); |
| 181 const double localActiveDuration = m_timing.playbackRate ? localRepe
atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in
finity(); | 180 const double localActiveDuration = m_timing.playbackRate ? localRepe
atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in
finity(); |
| 182 ASSERT(localActiveDuration >= 0); | 181 ASSERT(localActiveDuration >= 0); |
| 183 const double localLocalTime = localTime < m_timing.startDelay ? loca
lTime : localActiveDuration + m_timing.startDelay; | 182 const double localLocalTime = localTime < m_timing.startDelay ? loca
lTime : localActiveDuration + m_timing.startDelay; |
| 184 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca
lActiveDuration, localLocalTime, m_timing); | 183 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca
lActiveDuration, localLocalTime, m_timing); |
| 185 const double localActiveTime = calculateActiveTime(localActiveDurati
on, resolvedFillMode(m_timing.fillMode, isKeyframeEffect()), localLocalTime, par
entPhase, localCurrentPhase, m_timing); | 184 const double localActiveTime = calculateActiveTime(localActiveDurati
on, resolvedFillMode(m_timing.fillMode, isKeyframeEffect()), localLocalTime, par
entPhase, localCurrentPhase, m_timing); |
| 186 const double startOffset = m_timing.iterationStart * localIterationD
uration; | 185 const double startOffset = m_timing.iterationStart * localIterationD
uration; |
| 187 ASSERT(startOffset >= 0); | 186 ASSERT(startOffset >= 0); |
| 188 const double scaledActiveTime = calculateScaledActiveTime(localActiv
eDuration, localActiveTime, startOffset, m_timing); | 187 const double scaledActiveTime = calculateScaledActiveTime(localActiv
eDuration, localActiveTime, startOffset, m_timing); |
| 189 const double iterationTime = calculateIterationTime(localIterationDu
ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); | 188 const double iterationTime = calculateIterationTime(localIterationDu
ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); |
| 190 | 189 |
| 191 currentIteration = calculateCurrentIteration(localIterationDuration,
iterationTime, scaledActiveTime, m_timing); | 190 currentIteration = calculateCurrentIteration(localIterationDuration,
iterationTime, scaledActiveTime, m_timing); |
| 192 timeFraction = calculateTransformedTime(currentIteration, localItera
tionDuration, iterationTime, m_timing); | 191 progress = calculateTransformedTime(currentIteration, localIteration
Duration, iterationTime, m_timing); |
| 193 } | 192 } |
| 194 | 193 |
| 195 m_calculated.currentIteration = currentIteration; | 194 m_calculated.currentIteration = currentIteration; |
| 196 m_calculated.timeFraction = timeFraction; | 195 m_calculated.progress = progress; |
| 197 | 196 |
| 198 m_calculated.phase = currentPhase; | 197 m_calculated.phase = currentPhase; |
| 199 m_calculated.isInEffect = !isNull(activeTime); | 198 m_calculated.isInEffect = !isNull(activeTime); |
| 200 m_calculated.isInPlay = getPhase() == PhaseActive; | 199 m_calculated.isInPlay = getPhase() == PhaseActive; |
| 201 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); | 200 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); |
| 202 m_calculated.localTime = m_lastUpdateTime; | 201 m_calculated.localTime = m_lastUpdateTime; |
| 203 } | 202 } |
| 204 | 203 |
| 205 // Test for events even if timing didn't need an update as the animation may
have gained a start time. | 204 // Test for events even if timing didn't need an update as the animation may
have gained a start time. |
| 206 // FIXME: Refactor so that we can ASSERT(m_animation) here, this is currentl
y required to be nullable for testing. | 205 // FIXME: Refactor so that we can ASSERT(m_animation) here, this is currentl
y required to be nullable for testing. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 232 return AnimationEffectTiming::create(this); | 231 return AnimationEffectTiming::create(this); |
| 233 } | 232 } |
| 234 | 233 |
| 235 DEFINE_TRACE(AnimationEffect) | 234 DEFINE_TRACE(AnimationEffect) |
| 236 { | 235 { |
| 237 visitor->trace(m_animation); | 236 visitor->trace(m_animation); |
| 238 visitor->trace(m_eventDelegate); | 237 visitor->trace(m_eventDelegate); |
| 239 } | 238 } |
| 240 | 239 |
| 241 } // namespace blink | 240 } // namespace blink |
| OLD | NEW |