Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 , m_timer(this, &SMILTimeContainer::timerFired) | 47 , m_timer(this, &SMILTimeContainer::timerFired) |
| 48 , m_ownerSVGElement(owner) | 48 , m_ownerSVGElement(owner) |
| 49 #ifndef NDEBUG | 49 #ifndef NDEBUG |
| 50 , m_preventScheduledAnimationsChanges(false) | 50 , m_preventScheduledAnimationsChanges(false) |
| 51 #endif | 51 #endif |
| 52 { | 52 { |
| 53 } | 53 } |
| 54 | 54 |
| 55 SMILTimeContainer::~SMILTimeContainer() | 55 SMILTimeContainer::~SMILTimeContainer() |
| 56 { | 56 { |
| 57 m_timer.stop(); | 57 cancelAnimationFrame(); |
| 58 ASSERT(!m_timer.isActive()); | 58 ASSERT(!m_timer.isActive()); |
| 59 #ifndef NDEBUG | 59 #ifndef NDEBUG |
| 60 ASSERT(!m_preventScheduledAnimationsChanges); | 60 ASSERT(!m_preventScheduledAnimationsChanges); |
| 61 #endif | 61 #endif |
| 62 } | 62 } |
| 63 | 63 |
| 64 void SMILTimeContainer::schedule(SVGSMILElement* animation, SVGElement* target, const QualifiedName& attributeName) | 64 void SMILTimeContainer::schedule(SVGSMILElement* animation, SVGElement* target, const QualifiedName& attributeName) |
| 65 { | 65 { |
| 66 ASSERT(animation->timeContainer() == this); | 66 ASSERT(animation->timeContainer() == this); |
| 67 ASSERT(target); | 67 ASSERT(target); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 96 ASSERT(scheduled); | 96 ASSERT(scheduled); |
| 97 size_t idx = scheduled->find(animation); | 97 size_t idx = scheduled->find(animation); |
| 98 ASSERT(idx != kNotFound); | 98 ASSERT(idx != kNotFound); |
| 99 scheduled->remove(idx); | 99 scheduled->remove(idx); |
| 100 } | 100 } |
| 101 | 101 |
| 102 void SMILTimeContainer::notifyIntervalsChanged() | 102 void SMILTimeContainer::notifyIntervalsChanged() |
| 103 { | 103 { |
| 104 // Schedule updateAnimations() to be called asynchronously so multiple inter vals | 104 // Schedule updateAnimations() to be called asynchronously so multiple inter vals |
| 105 // can change with updateAnimations() only called once at the end. | 105 // can change with updateAnimations() only called once at the end. |
| 106 startTimer(0); | 106 immediateAnimationFrame(); |
| 107 } | 107 } |
| 108 | 108 |
| 109 SMILTime SMILTimeContainer::elapsed() const | 109 SMILTime SMILTimeContainer::elapsed() const |
| 110 { | 110 { |
| 111 if (!m_beginTime) | 111 if (!m_beginTime) |
| 112 return 0; | 112 return 0; |
| 113 | 113 |
| 114 if (isPaused()) | 114 if (isPaused()) |
| 115 return m_accumulatedActiveTime; | 115 return m_accumulatedActiveTime; |
| 116 | 116 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 133 double now = currentTime(); | 133 double now = currentTime(); |
| 134 | 134 |
| 135 // If 'm_presetStartTime' is set, the timeline was modified via setElapsed() before the document began. | 135 // If 'm_presetStartTime' is set, the timeline was modified via setElapsed() before the document began. |
| 136 // In this case pass on 'seekToTime=true' to updateAnimations(). | 136 // In this case pass on 'seekToTime=true' to updateAnimations(). |
| 137 m_beginTime = now - m_presetStartTime; | 137 m_beginTime = now - m_presetStartTime; |
| 138 updateAnimations(SMILTime(m_presetStartTime), m_presetStartTime ? true : fal se); | 138 updateAnimations(SMILTime(m_presetStartTime), m_presetStartTime ? true : fal se); |
| 139 m_presetStartTime = 0; | 139 m_presetStartTime = 0; |
| 140 | 140 |
| 141 if (m_pauseTime) { | 141 if (m_pauseTime) { |
| 142 m_pauseTime = now; | 142 m_pauseTime = now; |
| 143 m_timer.stop(); | 143 cancelAnimationFrame(); |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 void SMILTimeContainer::pause() | 147 void SMILTimeContainer::pause() |
| 148 { | 148 { |
| 149 ASSERT(!isPaused()); | 149 ASSERT(!isPaused()); |
| 150 m_pauseTime = currentTime(); | 150 m_pauseTime = currentTime(); |
| 151 | 151 |
| 152 if (m_beginTime) { | 152 if (m_beginTime) { |
| 153 m_accumulatedActiveTime += m_pauseTime - lastResumeTime(); | 153 m_accumulatedActiveTime += m_pauseTime - lastResumeTime(); |
| 154 m_timer.stop(); | 154 cancelAnimationFrame(); |
| 155 } | 155 } |
| 156 m_resumeTime = 0; | 156 m_resumeTime = 0; |
| 157 } | 157 } |
| 158 | 158 |
| 159 void SMILTimeContainer::resume() | 159 void SMILTimeContainer::resume() |
| 160 { | 160 { |
| 161 ASSERT(isPaused()); | 161 ASSERT(isPaused()); |
| 162 m_resumeTime = currentTime(); | 162 m_resumeTime = currentTime(); |
| 163 | 163 |
| 164 m_pauseTime = 0; | 164 m_pauseTime = 0; |
| 165 startTimer(0); | 165 immediateAnimationFrame(); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void SMILTimeContainer::setElapsed(SMILTime time) | 168 void SMILTimeContainer::setElapsed(SMILTime time) |
| 169 { | 169 { |
| 170 // If the documment didn't begin yet, record a new start time, we'll seek to once its possible. | 170 // If the documment didn't begin yet, record a new start time, we'll seek to once its possible. |
| 171 if (!m_beginTime) { | 171 if (!m_beginTime) { |
| 172 m_presetStartTime = time.value(); | 172 m_presetStartTime = time.value(); |
| 173 return; | 173 return; |
| 174 } | 174 } |
| 175 | 175 |
| 176 if (m_beginTime) | 176 if (m_beginTime) |
| 177 m_timer.stop(); | 177 cancelAnimationFrame(); |
| 178 | 178 |
| 179 double now = currentTime(); | 179 double now = currentTime(); |
| 180 m_beginTime = now - time.value(); | 180 m_beginTime = now - time.value(); |
| 181 m_resumeTime = 0; | 181 m_resumeTime = 0; |
| 182 if (m_pauseTime) { | 182 if (m_pauseTime) { |
| 183 m_pauseTime = now; | 183 m_pauseTime = now; |
| 184 m_accumulatedActiveTime = time.value(); | 184 m_accumulatedActiveTime = time.value(); |
| 185 } else { | 185 } else { |
| 186 m_accumulatedActiveTime = 0; | 186 m_accumulatedActiveTime = 0; |
| 187 } | 187 } |
| 188 | 188 |
| 189 #ifndef NDEBUG | 189 #ifndef NDEBUG |
| 190 m_preventScheduledAnimationsChanges = true; | 190 m_preventScheduledAnimationsChanges = true; |
| 191 #endif | 191 #endif |
| 192 GroupedAnimationsMap::iterator end = m_scheduledAnimations.end(); | 192 GroupedAnimationsMap::iterator end = m_scheduledAnimations.end(); |
| 193 for (GroupedAnimationsMap::iterator it = m_scheduledAnimations.begin(); it ! = end; ++it) { | 193 for (GroupedAnimationsMap::iterator it = m_scheduledAnimations.begin(); it ! = end; ++it) { |
| 194 AnimationsVector* scheduled = it->value.get(); | 194 AnimationsVector* scheduled = it->value.get(); |
| 195 unsigned size = scheduled->size(); | 195 unsigned size = scheduled->size(); |
| 196 for (unsigned n = 0; n < size; n++) | 196 for (unsigned n = 0; n < size; n++) |
| 197 scheduled->at(n)->reset(); | 197 scheduled->at(n)->reset(); |
| 198 } | 198 } |
| 199 #ifndef NDEBUG | 199 #ifndef NDEBUG |
| 200 m_preventScheduledAnimationsChanges = false; | 200 m_preventScheduledAnimationsChanges = false; |
| 201 #endif | 201 #endif |
| 202 | 202 |
| 203 updateAnimations(time, true); | 203 updateAnimations(time, true); |
| 204 } | 204 } |
| 205 | 205 |
| 206 void SMILTimeContainer::startTimer(SMILTime fireTime, SMILTime minimumDelay) | 206 bool SMILTimeContainer::isTimelineRunning() const |
| 207 { | 207 { |
| 208 if (!m_beginTime || isPaused()) | 208 return m_beginTime && !isPaused(); |
| 209 } | |
| 210 | |
| 211 void SMILTimeContainer::scheduleAnimationFrame(SMILTime fireTime) | |
| 212 { | |
| 213 if (!isTimelineRunning()) | |
| 209 return; | 214 return; |
| 210 | 215 |
| 211 if (!fireTime.isFinite()) | 216 if (!fireTime.isFinite()) |
| 212 return; | 217 return; |
| 213 | 218 |
| 214 SMILTime delay = max(fireTime - elapsed(), minimumDelay); | 219 SMILTime delay = max(fireTime - elapsed(), SMILTime(animationFrameDelay)); |
| 215 m_timer.startOneShot(delay.value()); | 220 m_timer.startOneShot(delay.value()); |
| 216 } | 221 } |
| 217 | 222 |
| 223 void SMILTimeContainer::immediateAnimationFrame() | |
|
pdr.
2014/02/04 18:45:57
Nit: can you rename this scheduleAnimationFrame? T
| |
| 224 { | |
| 225 if (!isTimelineRunning()) | |
| 226 return; | |
| 227 | |
| 228 m_timer.startOneShot(0); | |
| 229 } | |
| 230 | |
| 231 void SMILTimeContainer::cancelAnimationFrame() | |
| 232 { | |
| 233 m_timer.stop(); | |
| 234 } | |
| 235 | |
| 218 void SMILTimeContainer::timerFired(Timer<SMILTimeContainer>*) | 236 void SMILTimeContainer::timerFired(Timer<SMILTimeContainer>*) |
| 219 { | 237 { |
| 220 ASSERT(m_beginTime); | 238 ASSERT(isTimelineRunning()); |
| 221 ASSERT(!m_pauseTime); | |
| 222 updateAnimations(elapsed()); | 239 updateAnimations(elapsed()); |
| 223 } | 240 } |
| 224 | 241 |
| 225 void SMILTimeContainer::updateDocumentOrderIndexes() | 242 void SMILTimeContainer::updateDocumentOrderIndexes() |
| 226 { | 243 { |
| 227 unsigned timingElementCount = 0; | 244 unsigned timingElementCount = 0; |
| 228 for (Element* element = m_ownerSVGElement; element; element = ElementTravers al::next(*element, m_ownerSVGElement)) { | 245 for (Element* element = m_ownerSVGElement; element; element = ElementTravers al::next(*element, m_ownerSVGElement)) { |
| 229 if (isSVGSMILElement(*element)) | 246 if (isSVGSMILElement(*element)) |
| 230 toSVGSMILElement(element)->setDocumentOrderIndex(timingElementCount+ +); | 247 toSVGSMILElement(element)->setDocumentOrderIndex(timingElementCount+ +); |
| 231 } | 248 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 302 animationsToApply.append(resultElement); | 319 animationsToApply.append(resultElement); |
| 303 } | 320 } |
| 304 | 321 |
| 305 std::sort(animationsToApply.begin(), animationsToApply.end(), PriorityCompar e(elapsed)); | 322 std::sort(animationsToApply.begin(), animationsToApply.end(), PriorityCompar e(elapsed)); |
| 306 | 323 |
| 307 unsigned animationsToApplySize = animationsToApply.size(); | 324 unsigned animationsToApplySize = animationsToApply.size(); |
| 308 if (!animationsToApplySize) { | 325 if (!animationsToApplySize) { |
| 309 #ifndef NDEBUG | 326 #ifndef NDEBUG |
| 310 m_preventScheduledAnimationsChanges = false; | 327 m_preventScheduledAnimationsChanges = false; |
| 311 #endif | 328 #endif |
| 312 startTimer(earliestFireTime, animationFrameDelay); | 329 scheduleAnimationFrame(earliestFireTime); |
| 313 return; | 330 return; |
| 314 } | 331 } |
| 315 | 332 |
| 316 // Apply results to target elements. | 333 // Apply results to target elements. |
| 317 for (unsigned i = 0; i < animationsToApplySize; ++i) | 334 for (unsigned i = 0; i < animationsToApplySize; ++i) |
| 318 animationsToApply[i]->applyResultsToTarget(); | 335 animationsToApply[i]->applyResultsToTarget(); |
| 319 | 336 |
| 320 #ifndef NDEBUG | 337 #ifndef NDEBUG |
| 321 m_preventScheduledAnimationsChanges = false; | 338 m_preventScheduledAnimationsChanges = false; |
| 322 #endif | 339 #endif |
| 323 | 340 |
| 324 startTimer(earliestFireTime, animationFrameDelay); | 341 scheduleAnimationFrame(earliestFireTime); |
| 325 | 342 |
| 326 for (unsigned i = 0; i < animationsToApplySize; ++i) { | 343 for (unsigned i = 0; i < animationsToApplySize; ++i) { |
| 327 if (animationsToApply[i]->inDocument() && animationsToApply[i]->isSVGDis cardElement()) { | 344 if (animationsToApply[i]->inDocument() && animationsToApply[i]->isSVGDis cardElement()) { |
| 328 RefPtr<SVGSMILElement> animDiscard = animationsToApply[i]; | 345 RefPtr<SVGSMILElement> animDiscard = animationsToApply[i]; |
| 329 RefPtr<SVGElement> targetElement = animDiscard->targetElement(); | 346 RefPtr<SVGElement> targetElement = animDiscard->targetElement(); |
| 330 if (targetElement && targetElement->inDocument()) { | 347 if (targetElement && targetElement->inDocument()) { |
| 331 targetElement->remove(IGNORE_EXCEPTION); | 348 targetElement->remove(IGNORE_EXCEPTION); |
| 332 ASSERT(!targetElement->inDocument()); | 349 ASSERT(!targetElement->inDocument()); |
| 333 } | 350 } |
| 334 | 351 |
| 335 if (animDiscard->inDocument()) { | 352 if (animDiscard->inDocument()) { |
| 336 animDiscard->remove(IGNORE_EXCEPTION); | 353 animDiscard->remove(IGNORE_EXCEPTION); |
| 337 ASSERT(!animDiscard->inDocument()); | 354 ASSERT(!animDiscard->inDocument()); |
| 338 } | 355 } |
| 339 } | 356 } |
| 340 } | 357 } |
| 341 } | 358 } |
| 342 | 359 |
| 343 } | 360 } |
| OLD | NEW |