| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layer_animation_controller.h" | 5 #include "cc/layer_animation_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> |
| 8 |
| 7 #include "cc/animation.h" | 9 #include "cc/animation.h" |
| 8 #include "cc/animation_registrar.h" | 10 #include "cc/animation_registrar.h" |
| 9 #include "cc/keyframed_animation_curve.h" | 11 #include "cc/keyframed_animation_curve.h" |
| 10 #include "cc/layer_animation_value_observer.h" | 12 #include "cc/layer_animation_value_observer.h" |
| 13 #include "cc/scoped_ptr_algorithm.h" |
| 11 #include "ui/gfx/transform.h" | 14 #include "ui/gfx/transform.h" |
| 12 | 15 |
| 13 namespace { | 16 namespace { |
| 14 gfx::Transform convertWebTransformationMatrixToTransform(const WebKit::WebTransf
ormationMatrix& matrix) | 17 gfx::Transform convertWebTransformationMatrixToTransform(const WebKit::WebTransf
ormationMatrix& matrix) |
| 15 { | 18 { |
| 16 gfx::Transform transform; | 19 gfx::Transform transform; |
| 17 transform.matrix().setDouble(0, 0, matrix.m11()); | 20 transform.matrix().setDouble(0, 0, matrix.m11()); |
| 18 transform.matrix().setDouble(0, 1, matrix.m21()); | 21 transform.matrix().setDouble(0, 1, matrix.m21()); |
| 19 transform.matrix().setDouble(0, 2, matrix.m31()); | 22 transform.matrix().setDouble(0, 2, matrix.m31()); |
| 20 transform.matrix().setDouble(0, 3, matrix.m41()); | 23 transform.matrix().setDouble(0, 3, matrix.m41()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 } | 59 } |
| 57 | 60 |
| 58 void LayerAnimationController::pauseAnimation(int animationId, double timeOffset
) | 61 void LayerAnimationController::pauseAnimation(int animationId, double timeOffset
) |
| 59 { | 62 { |
| 60 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 63 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 61 if (m_activeAnimations[i]->id() == animationId) | 64 if (m_activeAnimations[i]->id() == animationId) |
| 62 m_activeAnimations[i]->setRunState(Animation::Paused, timeOffset + m
_activeAnimations[i]->startTime()); | 65 m_activeAnimations[i]->setRunState(Animation::Paused, timeOffset + m
_activeAnimations[i]->startTime()); |
| 63 } | 66 } |
| 64 } | 67 } |
| 65 | 68 |
| 69 struct HasAnimationId { |
| 70 HasAnimationId(int id) : m_id(id) { } |
| 71 bool operator()(Animation* animation) const { return animation->id() == m_id
; } |
| 72 private: |
| 73 int m_id; |
| 74 }; |
| 75 |
| 66 void LayerAnimationController::removeAnimation(int animationId) | 76 void LayerAnimationController::removeAnimation(int animationId) |
| 67 { | 77 { |
| 68 for (size_t i = 0; i < m_activeAnimations.size();) { | 78 ScopedPtrVector<Animation>& animations = m_activeAnimations; |
| 69 if (m_activeAnimations[i]->id() == animationId) | 79 animations.erase(cc::remove_if(animations, animations.begin(), animations.en
d(), HasAnimationId(animationId)), animations.end()); |
| 70 m_activeAnimations.remove(i); | |
| 71 else | |
| 72 i++; | |
| 73 } | |
| 74 updateActivation(); | 80 updateActivation(); |
| 75 } | 81 } |
| 76 | 82 |
| 83 struct HasAnimationIdAndProperty { |
| 84 HasAnimationIdAndProperty(int id, Animation::TargetProperty targetProperty)
: m_id(id), m_targetProperty(targetProperty) { } |
| 85 bool operator()(Animation* animation) const { return animation->id() == m_id
&& animation->targetProperty() == m_targetProperty; } |
| 86 private: |
| 87 int m_id; |
| 88 Animation::TargetProperty m_targetProperty; |
| 89 }; |
| 90 |
| 77 void LayerAnimationController::removeAnimation(int animationId, Animation::Targe
tProperty targetProperty) | 91 void LayerAnimationController::removeAnimation(int animationId, Animation::Targe
tProperty targetProperty) |
| 78 { | 92 { |
| 79 for (size_t i = 0; i < m_activeAnimations.size();) { | 93 ScopedPtrVector<Animation>& animations = m_activeAnimations; |
| 80 if (m_activeAnimations[i]->id() == animationId && m_activeAnimations[i]-
>targetProperty() == targetProperty) | 94 animations.erase(cc::remove_if(animations, animations.begin(), animations.en
d(), HasAnimationIdAndProperty(animationId, targetProperty)), animations.end()); |
| 81 m_activeAnimations.remove(i); | |
| 82 else | |
| 83 i++; | |
| 84 } | |
| 85 updateActivation(); | 95 updateActivation(); |
| 86 } | 96 } |
| 87 | 97 |
| 88 // According to render layer backing, these are for testing only. | 98 // According to render layer backing, these are for testing only. |
| 89 void LayerAnimationController::suspendAnimations(double monotonicTime) | 99 void LayerAnimationController::suspendAnimations(double monotonicTime) |
| 90 { | 100 { |
| 91 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 101 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 92 if (!m_activeAnimations[i]->isFinished()) | 102 if (!m_activeAnimations[i]->isFinished()) |
| 93 m_activeAnimations[i]->setRunState(Animation::Paused, monotonicTime)
; | 103 m_activeAnimations[i]->setRunState(Animation::Paused, monotonicTime)
; |
| 94 } | 104 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 resolveConflicts(monotonicTime); | 146 resolveConflicts(monotonicTime); |
| 137 tickAnimations(monotonicTime); | 147 tickAnimations(monotonicTime); |
| 138 markAnimationsForDeletion(monotonicTime, events); | 148 markAnimationsForDeletion(monotonicTime, events); |
| 139 startAnimationsWaitingForTargetAvailability(monotonicTime, events); | 149 startAnimationsWaitingForTargetAvailability(monotonicTime, events); |
| 140 | 150 |
| 141 updateActivation(); | 151 updateActivation(); |
| 142 } | 152 } |
| 143 | 153 |
| 144 void LayerAnimationController::addAnimation(scoped_ptr<Animation> animation) | 154 void LayerAnimationController::addAnimation(scoped_ptr<Animation> animation) |
| 145 { | 155 { |
| 146 m_activeAnimations.append(animation.Pass()); | 156 m_activeAnimations.push_back(animation.Pass()); |
| 147 updateActivation(); | 157 updateActivation(); |
| 148 } | 158 } |
| 149 | 159 |
| 150 Animation* LayerAnimationController::getAnimation(int groupId, Animation::Target
Property targetProperty) const | 160 Animation* LayerAnimationController::getAnimation(int groupId, Animation::Target
Property targetProperty) const |
| 151 { | 161 { |
| 152 for (size_t i = 0; i < m_activeAnimations.size(); ++i) | 162 for (size_t i = 0; i < m_activeAnimations.size(); ++i) |
| 153 if (m_activeAnimations[i]->group() == groupId && m_activeAnimations[i]->
targetProperty() == targetProperty) | 163 if (m_activeAnimations[i]->group() == groupId && m_activeAnimations[i]->
targetProperty() == targetProperty) |
| 154 return m_activeAnimations[i]; | 164 return m_activeAnimations[i]; |
| 155 return 0; | 165 return 0; |
| 156 } | 166 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 | 248 |
| 239 // The new animation should be set to run as soon as possible. | 249 // The new animation should be set to run as soon as possible. |
| 240 Animation::RunState initialRunState = Animation::WaitingForTargetAvailab
ility; | 250 Animation::RunState initialRunState = Animation::WaitingForTargetAvailab
ility; |
| 241 double startTime = 0; | 251 double startTime = 0; |
| 242 scoped_ptr<Animation> toAdd(m_activeAnimations[i]->cloneAndInitialize(An
imation::ControllingInstance, initialRunState, startTime)); | 252 scoped_ptr<Animation> toAdd(m_activeAnimations[i]->cloneAndInitialize(An
imation::ControllingInstance, initialRunState, startTime)); |
| 243 DCHECK(!toAdd->needsSynchronizedStartTime()); | 253 DCHECK(!toAdd->needsSynchronizedStartTime()); |
| 244 controllerImpl->addAnimation(toAdd.Pass()); | 254 controllerImpl->addAnimation(toAdd.Pass()); |
| 245 } | 255 } |
| 246 } | 256 } |
| 247 | 257 |
| 258 struct IsCompleted { |
| 259 IsCompleted(const LayerAnimationController& mainThreadController) : m_mainTh
readController(mainThreadController) { } |
| 260 bool operator()(Animation* animation) const { return !m_mainThreadController
.getAnimation(animation->group(), animation->targetProperty()); } |
| 261 private: |
| 262 const LayerAnimationController& m_mainThreadController; |
| 263 }; |
| 264 |
| 248 void LayerAnimationController::removeAnimationsCompletedOnMainThread(LayerAnimat
ionController* controllerImpl) const | 265 void LayerAnimationController::removeAnimationsCompletedOnMainThread(LayerAnimat
ionController* controllerImpl) const |
| 249 { | 266 { |
| 250 // Delete all impl thread animations for which there is no corresponding mai
n thread animation. | 267 // Delete all impl thread animations for which there is no corresponding mai
n thread animation. |
| 251 // Each iteration, controller->m_activeAnimations.size() is decremented or i
is incremented | 268 // Each iteration, controller->m_activeAnimations.size() is decremented or i
is incremented |
| 252 // guaranteeing progress towards loop termination. | 269 // guaranteeing progress towards loop termination. |
| 253 for (size_t i = 0; i < controllerImpl->m_activeAnimations.size();) { | 270 ScopedPtrVector<Animation>& animations = controllerImpl->m_activeAnimations; |
| 254 Animation* current = getAnimation(controllerImpl->m_activeAnimations[i]-
>group(), controllerImpl->m_activeAnimations[i]->targetProperty()); | 271 animations.erase(cc::remove_if(animations, animations.begin(), animations.en
d(), IsCompleted(*this)), animations.end()); |
| 255 if (!current) | |
| 256 controllerImpl->m_activeAnimations.remove(i); | |
| 257 else | |
| 258 i++; | |
| 259 } | |
| 260 } | 272 } |
| 261 | 273 |
| 262 void LayerAnimationController::pushPropertiesToImplThread(LayerAnimationControll
er* controllerImpl) const | 274 void LayerAnimationController::pushPropertiesToImplThread(LayerAnimationControll
er* controllerImpl) const |
| 263 { | 275 { |
| 264 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 276 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 265 Animation* currentImpl = controllerImpl->getAnimation(m_activeAnimations
[i]->group(), m_activeAnimations[i]->targetProperty()); | 277 Animation* currentImpl = controllerImpl->getAnimation(m_activeAnimations
[i]->group(), m_activeAnimations[i]->targetProperty()); |
| 266 if (currentImpl) | 278 if (currentImpl) |
| 267 m_activeAnimations[i]->pushPropertiesTo(currentImpl); | 279 m_activeAnimations[i]->pushPropertiesTo(currentImpl); |
| 268 } | 280 } |
| 269 } | 281 } |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 if (groupId == m_activeAnimations[j]->group()) { | 395 if (groupId == m_activeAnimations[j]->group()) { |
| 384 if (events) | 396 if (events) |
| 385 events->push_back(AnimationEvent(AnimationEvent::Finishe
d, m_id, m_activeAnimations[j]->group(), m_activeAnimations[j]->targetProperty()
, monotonicTime)); | 397 events->push_back(AnimationEvent(AnimationEvent::Finishe
d, m_id, m_activeAnimations[j]->group(), m_activeAnimations[j]->targetProperty()
, monotonicTime)); |
| 386 m_activeAnimations[j]->setRunState(Animation::WaitingForDele
tion, monotonicTime); | 398 m_activeAnimations[j]->setRunState(Animation::WaitingForDele
tion, monotonicTime); |
| 387 } | 399 } |
| 388 } | 400 } |
| 389 } | 401 } |
| 390 } | 402 } |
| 391 } | 403 } |
| 392 | 404 |
| 405 static bool isWaitingForDeletion(Animation* animation) { return animation->runSt
ate() == Animation::WaitingForDeletion; } |
| 406 |
| 393 void LayerAnimationController::purgeAnimationsMarkedForDeletion() | 407 void LayerAnimationController::purgeAnimationsMarkedForDeletion() |
| 394 { | 408 { |
| 395 for (size_t i = 0; i < m_activeAnimations.size();) { | 409 ScopedPtrVector<Animation>& animations = m_activeAnimations; |
| 396 if (m_activeAnimations[i]->runState() == Animation::WaitingForDeletion) | 410 animations.erase(cc::remove_if(animations, animations.begin(), animations.en
d(), isWaitingForDeletion), animations.end()); |
| 397 m_activeAnimations.remove(i); | |
| 398 else | |
| 399 i++; | |
| 400 } | |
| 401 } | 411 } |
| 402 | 412 |
| 403 void LayerAnimationController::replaceImplThreadAnimations(LayerAnimationControl
ler* controllerImpl) const | 413 void LayerAnimationController::replaceImplThreadAnimations(LayerAnimationControl
ler* controllerImpl) const |
| 404 { | 414 { |
| 405 controllerImpl->m_activeAnimations.clear(); | 415 controllerImpl->m_activeAnimations.clear(); |
| 406 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 416 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 407 scoped_ptr<Animation> toAdd; | 417 scoped_ptr<Animation> toAdd; |
| 408 if (m_activeAnimations[i]->needsSynchronizedStartTime()) { | 418 if (m_activeAnimations[i]->needsSynchronizedStartTime()) { |
| 409 // We haven't received an animation started notification yet, so it | 419 // We haven't received an animation started notification yet, so it |
| 410 // is important that we add it in a 'waiting' and not 'running' stat
e. | 420 // is important that we add it in a 'waiting' and not 'running' stat
e. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 case Animation::TargetPropertyEnumSize: | 465 case Animation::TargetPropertyEnumSize: |
| 456 NOTREACHED(); | 466 NOTREACHED(); |
| 457 } | 467 } |
| 458 } | 468 } |
| 459 } | 469 } |
| 460 } | 470 } |
| 461 | 471 |
| 462 void LayerAnimationController::updateActivation(bool force) | 472 void LayerAnimationController::updateActivation(bool force) |
| 463 { | 473 { |
| 464 if (m_registrar) { | 474 if (m_registrar) { |
| 465 if (!m_activeAnimations.isEmpty() && (!m_isActive || force)) | 475 if (!m_activeAnimations.empty() && (!m_isActive || force)) |
| 466 m_registrar->DidActivateAnimationController(this); | 476 m_registrar->DidActivateAnimationController(this); |
| 467 else if (m_activeAnimations.isEmpty() && (m_isActive || force)) | 477 else if (m_activeAnimations.empty() && (m_isActive || force)) |
| 468 m_registrar->DidDeactivateAnimationController(this); | 478 m_registrar->DidDeactivateAnimationController(this); |
| 469 m_isActive = !m_activeAnimations.isEmpty(); | 479 m_isActive = !m_activeAnimations.empty(); |
| 470 } | 480 } |
| 471 } | 481 } |
| 472 | 482 |
| 473 void LayerAnimationController::notifyObserversOpacityAnimated(float opacity) | 483 void LayerAnimationController::notifyObserversOpacityAnimated(float opacity) |
| 474 { | 484 { |
| 475 FOR_EACH_OBSERVER(LayerAnimationValueObserver, | 485 FOR_EACH_OBSERVER(LayerAnimationValueObserver, |
| 476 m_observers, | 486 m_observers, |
| 477 OnOpacityAnimated(opacity)); | 487 OnOpacityAnimated(opacity)); |
| 478 } | 488 } |
| 479 | 489 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 490 ObserverListBase<LayerAnimationValueObserver>::Iterator it(m_observers); | 500 ObserverListBase<LayerAnimationValueObserver>::Iterator it(m_observers); |
| 491 LayerAnimationValueObserver* obs; | 501 LayerAnimationValueObserver* obs; |
| 492 while ((obs = it.GetNext()) != NULL) | 502 while ((obs = it.GetNext()) != NULL) |
| 493 if (obs->IsActive()) | 503 if (obs->IsActive()) |
| 494 return true; | 504 return true; |
| 495 } | 505 } |
| 496 return false; | 506 return false; |
| 497 } | 507 } |
| 498 | 508 |
| 499 } // namespace cc | 509 } // namespace cc |
| OLD | NEW |