| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 m_compositorTimeline = adoptPtr(Platform::current()->compositorSupport()
->createAnimationTimeline()); | 82 m_compositorTimeline = adoptPtr(Platform::current()->compositorSupport()
->createAnimationTimeline()); |
| 83 } | 83 } |
| 84 | 84 |
| 85 ASSERT(document); | 85 ASSERT(document); |
| 86 } | 86 } |
| 87 | 87 |
| 88 AnimationTimeline::~AnimationTimeline() | 88 AnimationTimeline::~AnimationTimeline() |
| 89 { | 89 { |
| 90 } | 90 } |
| 91 | 91 |
| 92 bool AnimationTimeline::isActive() | |
| 93 { | |
| 94 return m_document && m_document->page(); | |
| 95 } | |
| 96 | |
| 97 void AnimationTimeline::animationAttached(Animation& animation) | 92 void AnimationTimeline::animationAttached(Animation& animation) |
| 98 { | 93 { |
| 99 ASSERT(animation.timeline() == this); | 94 ASSERT(animation.timeline() == this); |
| 100 ASSERT(!m_animations.contains(&animation)); | 95 ASSERT(!m_animations.contains(&animation)); |
| 101 m_animations.add(&animation); | 96 m_animations.add(&animation); |
| 102 } | 97 } |
| 103 | 98 |
| 104 Animation* AnimationTimeline::play(AnimationEffect* child) | 99 Animation* AnimationTimeline::play(AnimationEffect* child) |
| 105 { | 100 { |
| 106 if (!m_document) | 101 if (!m_document) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 animations.append(animation); | 138 animations.append(animation); |
| 144 | 139 |
| 145 std::sort(animations.begin(), animations.end(), Animation::hasLowerPriority)
; | 140 std::sort(animations.begin(), animations.end(), Animation::hasLowerPriority)
; |
| 146 | 141 |
| 147 for (Animation* animation : animations) { | 142 for (Animation* animation : animations) { |
| 148 if (!animation->update(reason)) | 143 if (!animation->update(reason)) |
| 149 m_animationsNeedingUpdate.remove(animation); | 144 m_animationsNeedingUpdate.remove(animation); |
| 150 } | 145 } |
| 151 | 146 |
| 152 ASSERT(m_outdatedAnimationCount == 0); | 147 ASSERT(m_outdatedAnimationCount == 0); |
| 153 ASSERT(m_lastCurrentTimeInternal == currentTimeInternal() || (std::isnan(cur
rentTimeInternal()) && std::isnan(m_lastCurrentTimeInternal))); | 148 ASSERT(m_lastCurrentTimeInternal == currentTimeInternal()); |
| 154 | 149 |
| 155 #if ENABLE(ASSERT) | 150 #if ENABLE(ASSERT) |
| 156 for (const auto& animation : m_animationsNeedingUpdate) | 151 for (const auto& animation : m_animationsNeedingUpdate) |
| 157 ASSERT(!animation->outdated()); | 152 ASSERT(!animation->outdated()); |
| 158 #endif | 153 #endif |
| 159 } | 154 } |
| 160 | 155 |
| 161 void AnimationTimeline::scheduleNextService() | 156 void AnimationTimeline::scheduleNextService() |
| 162 { | 157 { |
| 163 ASSERT(m_outdatedAnimationCount == 0); | 158 ASSERT(m_outdatedAnimationCount == 0); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 return m_zeroTime; | 202 return m_zeroTime; |
| 208 } | 203 } |
| 209 | 204 |
| 210 double AnimationTimeline::currentTime(bool& isNull) | 205 double AnimationTimeline::currentTime(bool& isNull) |
| 211 { | 206 { |
| 212 return currentTimeInternal(isNull) * 1000; | 207 return currentTimeInternal(isNull) * 1000; |
| 213 } | 208 } |
| 214 | 209 |
| 215 double AnimationTimeline::currentTimeInternal(bool& isNull) | 210 double AnimationTimeline::currentTimeInternal(bool& isNull) |
| 216 { | 211 { |
| 217 if (!isActive()) { | 212 if (!m_document) { |
| 218 isNull = true; | 213 isNull = true; |
| 219 return std::numeric_limits<double>::quiet_NaN(); | 214 return std::numeric_limits<double>::quiet_NaN(); |
| 220 } | 215 } |
| 221 double result = m_playbackRate == 0 | 216 double result = m_playbackRate == 0 |
| 222 ? zeroTime() | 217 ? zeroTime() |
| 223 : (document()->animationClock().currentTime() - zeroTime()) * m_playback
Rate; | 218 : (document()->animationClock().currentTime() - zeroTime()) * m_playback
Rate; |
| 224 isNull = std::isnan(result); | 219 isNull = std::isnan(result); |
| 225 return result; | 220 return result; |
| 226 } | 221 } |
| 227 | 222 |
| 228 double AnimationTimeline::currentTime() | 223 double AnimationTimeline::currentTime() |
| 229 { | 224 { |
| 230 return currentTimeInternal() * 1000; | 225 return currentTimeInternal() * 1000; |
| 231 } | 226 } |
| 232 | 227 |
| 233 double AnimationTimeline::currentTimeInternal() | 228 double AnimationTimeline::currentTimeInternal() |
| 234 { | 229 { |
| 235 bool isNull; | 230 bool isNull; |
| 236 return currentTimeInternal(isNull); | 231 return currentTimeInternal(isNull); |
| 237 } | 232 } |
| 238 | 233 |
| 239 void AnimationTimeline::setCurrentTime(double currentTime) | 234 void AnimationTimeline::setCurrentTime(double currentTime) |
| 240 { | 235 { |
| 241 setCurrentTimeInternal(currentTime / 1000); | 236 setCurrentTimeInternal(currentTime / 1000); |
| 242 } | 237 } |
| 243 | 238 |
| 244 void AnimationTimeline::setCurrentTimeInternal(double currentTime) | 239 void AnimationTimeline::setCurrentTimeInternal(double currentTime) |
| 245 { | 240 { |
| 246 if (!isActive()) | 241 if (!document()) |
| 247 return; | 242 return; |
| 248 m_zeroTime = m_playbackRate == 0 | 243 m_zeroTime = m_playbackRate == 0 |
| 249 ? currentTime | 244 ? currentTime |
| 250 : document()->animationClock().currentTime() - currentTime / m_playbackR
ate; | 245 : document()->animationClock().currentTime() - currentTime / m_playbackR
ate; |
| 251 m_zeroTimeInitialized = true; | 246 m_zeroTimeInitialized = true; |
| 252 | 247 |
| 253 for (const auto& animation : m_animations) { | 248 for (const auto& animation : m_animations) { |
| 254 // The Player needs a timing update to pick up a new time. | 249 // The Player needs a timing update to pick up a new time. |
| 255 animation->setOutdated(); | 250 animation->setOutdated(); |
| 256 } | 251 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 271 for (const auto& animation : m_animationsNeedingUpdate) | 266 for (const auto& animation : m_animationsNeedingUpdate) |
| 272 animation->pauseForTesting(pauseTime); | 267 animation->pauseForTesting(pauseTime); |
| 273 serviceAnimations(TimingUpdateOnDemand); | 268 serviceAnimations(TimingUpdateOnDemand); |
| 274 } | 269 } |
| 275 | 270 |
| 276 bool AnimationTimeline::needsAnimationTimingUpdate() | 271 bool AnimationTimeline::needsAnimationTimingUpdate() |
| 277 { | 272 { |
| 278 if (currentTimeInternal() == m_lastCurrentTimeInternal) | 273 if (currentTimeInternal() == m_lastCurrentTimeInternal) |
| 279 return false; | 274 return false; |
| 280 | 275 |
| 281 if (std::isnan(currentTimeInternal()) && std::isnan(m_lastCurrentTimeInterna
l)) | |
| 282 return false; | |
| 283 | |
| 284 // We allow m_lastCurrentTimeInternal to advance here when there | 276 // We allow m_lastCurrentTimeInternal to advance here when there |
| 285 // are no animations to allow animations spawned during style | 277 // are no animations to allow animations spawned during style |
| 286 // recalc to not invalidate this flag. | 278 // recalc to not invalidate this flag. |
| 287 if (m_animationsNeedingUpdate.isEmpty()) | 279 if (m_animationsNeedingUpdate.isEmpty()) |
| 288 m_lastCurrentTimeInternal = currentTimeInternal(); | 280 m_lastCurrentTimeInternal = currentTimeInternal(); |
| 289 | 281 |
| 290 return !m_animationsNeedingUpdate.isEmpty(); | 282 return !m_animationsNeedingUpdate.isEmpty(); |
| 291 } | 283 } |
| 292 | 284 |
| 293 void AnimationTimeline::clearOutdatedAnimation(Animation* animation) | 285 void AnimationTimeline::clearOutdatedAnimation(Animation* animation) |
| 294 { | 286 { |
| 295 ASSERT(!animation->outdated()); | 287 ASSERT(!animation->outdated()); |
| 296 m_outdatedAnimationCount--; | 288 m_outdatedAnimationCount--; |
| 297 } | 289 } |
| 298 | 290 |
| 299 void AnimationTimeline::setOutdatedAnimation(Animation* animation) | 291 void AnimationTimeline::setOutdatedAnimation(Animation* animation) |
| 300 { | 292 { |
| 301 ASSERT(animation->outdated()); | 293 ASSERT(animation->outdated()); |
| 302 m_outdatedAnimationCount++; | 294 m_outdatedAnimationCount++; |
| 303 m_animationsNeedingUpdate.add(animation); | 295 m_animationsNeedingUpdate.add(animation); |
| 304 if (isActive() && !m_document->page()->animator().isServicingAnimations()) | 296 if (m_document && m_document->page() && !m_document->page()->animator().isSe
rvicingAnimations()) |
| 305 m_timing->serviceOnNextFrame(); | 297 m_timing->serviceOnNextFrame(); |
| 306 } | 298 } |
| 307 | 299 |
| 308 void AnimationTimeline::setPlaybackRate(double playbackRate) | 300 void AnimationTimeline::setPlaybackRate(double playbackRate) |
| 309 { | 301 { |
| 310 if (!isActive()) | 302 if (!document()) |
| 311 return; | 303 return; |
| 312 double currentTime = currentTimeInternal(); | 304 double currentTime = currentTimeInternal(); |
| 313 m_playbackRate = playbackRate; | 305 m_playbackRate = playbackRate; |
| 314 m_zeroTime = playbackRate == 0 | 306 m_zeroTime = playbackRate == 0 |
| 315 ? currentTime | 307 ? currentTime |
| 316 : document()->animationClock().currentTime() - currentTime / playbackRat
e; | 308 : document()->animationClock().currentTime() - currentTime / playbackRat
e; |
| 317 m_zeroTimeInitialized = true; | 309 m_zeroTimeInitialized = true; |
| 318 | 310 |
| 319 // Corresponding compositor animation may need to be restarted to pick up | 311 // Corresponding compositor animation may need to be restarted to pick up |
| 320 // the new playback rate. Marking the effect changed forces this. | 312 // the new playback rate. Marking the effect changed forces this. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 343 | 335 |
| 344 DEFINE_TRACE(AnimationTimeline) | 336 DEFINE_TRACE(AnimationTimeline) |
| 345 { | 337 { |
| 346 visitor->trace(m_document); | 338 visitor->trace(m_document); |
| 347 visitor->trace(m_timing); | 339 visitor->trace(m_timing); |
| 348 visitor->trace(m_animationsNeedingUpdate); | 340 visitor->trace(m_animationsNeedingUpdate); |
| 349 visitor->trace(m_animations); | 341 visitor->trace(m_animations); |
| 350 } | 342 } |
| 351 | 343 |
| 352 } // namespace | 344 } // namespace |
| OLD | NEW |