| 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 | |
| 105 // will treat these as undefined. | |
| 106 if (ensureCalculated().isInEffect) { | 103 if (ensureCalculated().isInEffect) { |
| 107 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); | 104 computedTiming.setLocalTime(ensureCalculated().localTime * 1000); |
| 108 computedTiming.setTimeFraction(ensureCalculated().timeFraction); | 105 computedTiming.setProgress(ensureCalculated().progress); |
| 109 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); | 106 computedTiming.setCurrentIteration(ensureCalculated().currentIteration); |
| 107 } else { |
| 108 computedTiming.setLocalTimeToNull(); |
| 109 computedTiming.setProgressToNull(); |
| 110 computedTiming.setCurrentIterationToNull(); |
| 110 } | 111 } |
| 111 | 112 |
| 112 // KeyframeEffectOptions members. | 113 // KeyframeEffectOptions members. |
| 113 computedTiming.setDelay(specifiedTiming().startDelay * 1000); | 114 computedTiming.setDelay(specifiedTiming().startDelay * 1000); |
| 114 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); | 115 computedTiming.setEndDelay(specifiedTiming().endDelay * 1000); |
| 115 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi
ng().fillMode, isKeyframeEffect()))); | 116 computedTiming.setFill(Timing::fillModeString(resolvedFillMode(specifiedTimi
ng().fillMode, isKeyframeEffect()))); |
| 116 computedTiming.setIterationStart(specifiedTiming().iterationStart); | 117 computedTiming.setIterationStart(specifiedTiming().iterationStart); |
| 117 computedTiming.setIterations(specifiedTiming().iterationCount); | 118 computedTiming.setIterations(specifiedTiming().iterationCount); |
| 118 | 119 |
| 119 UnrestrictedDoubleOrString duration; | 120 UnrestrictedDoubleOrString duration; |
| 120 duration.setUnrestrictedDouble(iterationDuration() * 1000); | 121 duration.setUnrestrictedDouble(iterationDuration() * 1000); |
| 121 computedTiming.setDuration(duration); | 122 computedTiming.setDuration(duration); |
| 122 | 123 |
| 123 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); | 124 computedTiming.setPlaybackRate(specifiedTiming().playbackRate); |
| 124 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming(
).direction)); | 125 computedTiming.setDirection(Timing::playbackDirectionString(specifiedTiming(
).direction)); |
| 125 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); | 126 computedTiming.setEasing(specifiedTiming().timingFunction->toString()); |
| 126 } | 127 } |
| 127 | 128 |
| 128 ComputedTimingProperties AnimationEffect::computedTiming() | 129 ComputedTimingProperties AnimationEffect::getComputedTiming() |
| 129 { | 130 { |
| 130 ComputedTimingProperties result; | 131 ComputedTimingProperties result; |
| 131 computedTiming(result); | 132 getComputedTiming(result); |
| 132 return result; | 133 return result; |
| 133 } | 134 } |
| 134 | 135 |
| 135 | 136 |
| 136 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas
on reason) const | 137 void AnimationEffect::updateInheritedTime(double inheritedTime, TimingUpdateReas
on reason) const |
| 137 { | 138 { |
| 138 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(
isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation
()->effectSuppressed()); | 139 bool needsUpdate = m_needsUpdate || (m_lastUpdateTime != inheritedTime && !(
isNull(m_lastUpdateTime) && isNull(inheritedTime))) || (animation() && animation
()->effectSuppressed()); |
| 139 m_needsUpdate = false; | 140 m_needsUpdate = false; |
| 140 m_lastUpdateTime = inheritedTime; | 141 m_lastUpdateTime = inheritedTime; |
| 141 | 142 |
| 142 const double localTime = inheritedTime; | 143 const double localTime = inheritedTime; |
| 143 double timeToNextIteration = std::numeric_limits<double>::infinity(); | 144 double timeToNextIteration = std::numeric_limits<double>::infinity(); |
| 144 if (needsUpdate) { | 145 if (needsUpdate) { |
| 145 const double activeDuration = this->activeDurationInternal(); | 146 const double activeDuration = this->activeDurationInternal(); |
| 146 | 147 |
| 147 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t
iming); | 148 const Phase currentPhase = calculatePhase(activeDuration, localTime, m_t
iming); |
| 148 // FIXME: parentPhase depends on groups being implemented. | 149 // FIXME: parentPhase depends on groups being implemented. |
| 149 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; | 150 const AnimationEffect::Phase parentPhase = AnimationEffect::PhaseActive; |
| 150 const double activeTime = calculateActiveTime(activeDuration, resolvedFi
llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh
ase, m_timing); | 151 const double activeTime = calculateActiveTime(activeDuration, resolvedFi
llMode(m_timing.fillMode, isKeyframeEffect()), localTime, parentPhase, currentPh
ase, m_timing); |
| 151 | 152 |
| 152 double currentIteration; | 153 double currentIteration; |
| 153 double timeFraction; | 154 double progress; |
| 154 if (const double iterationDuration = this->iterationDuration()) { | 155 if (const double iterationDuration = this->iterationDuration()) { |
| 155 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter
ationStart, iterationDuration); | 156 const double startOffset = multiplyZeroAlwaysGivesZero(m_timing.iter
ationStart, iterationDuration); |
| 156 ASSERT(startOffset >= 0); | 157 ASSERT(startOffset >= 0); |
| 157 const double scaledActiveTime = calculateScaledActiveTime(activeDura
tion, activeTime, startOffset, m_timing); | 158 const double scaledActiveTime = calculateScaledActiveTime(activeDura
tion, activeTime, startOffset, m_timing); |
| 158 const double iterationTime = calculateIterationTime(iterationDuratio
n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); | 159 const double iterationTime = calculateIterationTime(iterationDuratio
n, repeatedDuration(), scaledActiveTime, startOffset, m_timing); |
| 159 | 160 |
| 160 currentIteration = calculateCurrentIteration(iterationDuration, iter
ationTime, scaledActiveTime, m_timing); | 161 currentIteration = calculateCurrentIteration(iterationDuration, iter
ationTime, scaledActiveTime, m_timing); |
| 161 const double transformedTime = calculateTransformedTime(currentItera
tion, iterationDuration, iterationTime, m_timing); | 162 const double transformedTime = calculateTransformedTime(currentItera
tion, iterationDuration, iterationTime, m_timing); |
| 162 | 163 |
| 163 // The infinite iterationDuration case here is a workaround because | 164 // The infinite iterationDuration case here is a workaround because |
| 164 // the specified behaviour does not handle infinite durations well. | 165 // the specified behaviour does not handle infinite durations well. |
| 165 // There is an open issue against the spec to fix this: | 166 // There is an open issue against the spec to fix this: |
| 166 // https://github.com/w3c/web-animations/issues/142 | 167 // https://github.com/w3c/web-animations/issues/142 |
| 167 if (!std::isfinite(iterationDuration)) | 168 if (!std::isfinite(iterationDuration)) |
| 168 timeFraction = fmod(m_timing.iterationStart, 1.0); | 169 progress = fmod(m_timing.iterationStart, 1.0); |
| 169 else | 170 else |
| 170 timeFraction = transformedTime / iterationDuration; | 171 progress = transformedTime / iterationDuration; |
| 171 | 172 |
| 172 if (!isNull(iterationTime)) { | 173 if (!isNull(iterationTime)) { |
| 173 timeToNextIteration = (iterationDuration - iterationTime) / std:
:abs(m_timing.playbackRate); | 174 timeToNextIteration = (iterationDuration - iterationTime) / std:
:abs(m_timing.playbackRate); |
| 174 if (activeDuration - activeTime < timeToNextIteration) | 175 if (activeDuration - activeTime < timeToNextIteration) |
| 175 timeToNextIteration = std::numeric_limits<double>::infinity(
); | 176 timeToNextIteration = std::numeric_limits<double>::infinity(
); |
| 176 } | 177 } |
| 177 } else { | 178 } else { |
| 178 const double localIterationDuration = 1; | 179 const double localIterationDuration = 1; |
| 179 const double localRepeatedDuration = localIterationDuration * m_timi
ng.iterationCount; | 180 const double localRepeatedDuration = localIterationDuration * m_timi
ng.iterationCount; |
| 180 ASSERT(localRepeatedDuration >= 0); | 181 ASSERT(localRepeatedDuration >= 0); |
| 181 const double localActiveDuration = m_timing.playbackRate ? localRepe
atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in
finity(); | 182 const double localActiveDuration = m_timing.playbackRate ? localRepe
atedDuration / std::abs(m_timing.playbackRate) : std::numeric_limits<double>::in
finity(); |
| 182 ASSERT(localActiveDuration >= 0); | 183 ASSERT(localActiveDuration >= 0); |
| 183 const double localLocalTime = localTime < m_timing.startDelay ? loca
lTime : localActiveDuration + m_timing.startDelay; | 184 const double localLocalTime = localTime < m_timing.startDelay ? loca
lTime : localActiveDuration + m_timing.startDelay; |
| 184 const AnimationEffect::Phase localCurrentPhase = calculatePhase(loca
lActiveDuration, localLocalTime, m_timing); | 185 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); | 186 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; | 187 const double startOffset = m_timing.iterationStart * localIterationD
uration; |
| 187 ASSERT(startOffset >= 0); | 188 ASSERT(startOffset >= 0); |
| 188 const double scaledActiveTime = calculateScaledActiveTime(localActiv
eDuration, localActiveTime, startOffset, m_timing); | 189 const double scaledActiveTime = calculateScaledActiveTime(localActiv
eDuration, localActiveTime, startOffset, m_timing); |
| 189 const double iterationTime = calculateIterationTime(localIterationDu
ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); | 190 const double iterationTime = calculateIterationTime(localIterationDu
ration, localRepeatedDuration, scaledActiveTime, startOffset, m_timing); |
| 190 | 191 |
| 191 currentIteration = calculateCurrentIteration(localIterationDuration,
iterationTime, scaledActiveTime, m_timing); | 192 currentIteration = calculateCurrentIteration(localIterationDuration,
iterationTime, scaledActiveTime, m_timing); |
| 192 timeFraction = calculateTransformedTime(currentIteration, localItera
tionDuration, iterationTime, m_timing); | 193 progress = calculateTransformedTime(currentIteration, localIteration
Duration, iterationTime, m_timing); |
| 193 } | 194 } |
| 194 | 195 |
| 195 m_calculated.currentIteration = currentIteration; | 196 m_calculated.currentIteration = currentIteration; |
| 196 m_calculated.timeFraction = timeFraction; | 197 m_calculated.progress = progress; |
| 197 | 198 |
| 198 m_calculated.phase = currentPhase; | 199 m_calculated.phase = currentPhase; |
| 199 m_calculated.isInEffect = !isNull(activeTime); | 200 m_calculated.isInEffect = !isNull(activeTime); |
| 200 m_calculated.isInPlay = getPhase() == PhaseActive; | 201 m_calculated.isInPlay = getPhase() == PhaseActive; |
| 201 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); | 202 m_calculated.isCurrent = getPhase() == PhaseBefore || isInPlay(); |
| 202 m_calculated.localTime = m_lastUpdateTime; | 203 m_calculated.localTime = m_lastUpdateTime; |
| 203 } | 204 } |
| 204 | 205 |
| 205 // Test for events even if timing didn't need an update as the animation may
have gained a start time. | 206 // 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. | 207 // 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); | 233 return AnimationEffectTiming::create(this); |
| 233 } | 234 } |
| 234 | 235 |
| 235 DEFINE_TRACE(AnimationEffect) | 236 DEFINE_TRACE(AnimationEffect) |
| 236 { | 237 { |
| 237 visitor->trace(m_animation); | 238 visitor->trace(m_animation); |
| 238 visitor->trace(m_eventDelegate); | 239 visitor->trace(m_eventDelegate); |
| 239 } | 240 } |
| 240 | 241 |
| 241 } // namespace blink | 242 } // namespace blink |
| OLD | NEW |