| 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 "cc/active_animation.h" | 7 #include "cc/active_animation.h" |
| 8 #include "cc/animation_registrar.h" | |
| 9 #include "cc/keyframed_animation_curve.h" | 8 #include "cc/keyframed_animation_curve.h" |
| 10 #include "ui/gfx/transform.h" | 9 #include "ui/gfx/transform.h" |
| 11 | 10 |
| 12 namespace cc { | 11 namespace cc { |
| 13 | 12 |
| 14 LayerAnimationController::LayerAnimationController() | 13 LayerAnimationController::LayerAnimationController(LayerAnimationControllerClien
t* client) |
| 15 : m_forceSync(false) | 14 : m_forceSync(false) |
| 16 , m_id(-1) | 15 , m_client(client) |
| 17 , m_opacity(1.0) | |
| 18 , m_registrar(0) | |
| 19 { | 16 { |
| 20 } | 17 } |
| 21 | 18 |
| 22 LayerAnimationController::~LayerAnimationController() | 19 LayerAnimationController::~LayerAnimationController() |
| 23 { | 20 { |
| 24 if (m_registrar) | |
| 25 m_registrar->DidDeactivateAnimationController(this); | |
| 26 } | 21 } |
| 27 | 22 |
| 28 scoped_refptr<LayerAnimationController> LayerAnimationController::create() | 23 scoped_ptr<LayerAnimationController> LayerAnimationController::create(LayerAnima
tionControllerClient* client) |
| 29 { | 24 { |
| 30 return make_scoped_refptr(new LayerAnimationController()); | 25 return make_scoped_ptr(new LayerAnimationController(client)); |
| 31 } | 26 } |
| 32 | 27 |
| 33 void LayerAnimationController::pauseAnimation(int animationId, double timeOffset
) | 28 void LayerAnimationController::pauseAnimation(int animationId, double timeOffset
) |
| 34 { | 29 { |
| 35 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 30 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 36 if (m_activeAnimations[i]->id() == animationId) | 31 if (m_activeAnimations[i]->id() == animationId) |
| 37 m_activeAnimations[i]->setRunState(ActiveAnimation::Paused, timeOffs
et + m_activeAnimations[i]->startTime()); | 32 m_activeAnimations[i]->setRunState(ActiveAnimation::Paused, timeOffs
et + m_activeAnimations[i]->startTime()); |
| 38 } | 33 } |
| 39 } | 34 } |
| 40 | 35 |
| 41 void LayerAnimationController::removeAnimation(int animationId) | 36 void LayerAnimationController::removeAnimation(int animationId) |
| 42 { | 37 { |
| 43 for (size_t i = 0; i < m_activeAnimations.size();) { | 38 for (size_t i = 0; i < m_activeAnimations.size();) { |
| 44 if (m_activeAnimations[i]->id() == animationId) | 39 if (m_activeAnimations[i]->id() == animationId) |
| 45 m_activeAnimations.remove(i); | 40 m_activeAnimations.remove(i); |
| 46 else | 41 else |
| 47 i++; | 42 i++; |
| 48 } | 43 } |
| 49 updateRegistration(); | |
| 50 } | 44 } |
| 51 | 45 |
| 52 void LayerAnimationController::removeAnimation(int animationId, ActiveAnimation:
:TargetProperty targetProperty) | 46 void LayerAnimationController::removeAnimation(int animationId, ActiveAnimation:
:TargetProperty targetProperty) |
| 53 { | 47 { |
| 54 for (size_t i = 0; i < m_activeAnimations.size();) { | 48 for (size_t i = 0; i < m_activeAnimations.size();) { |
| 55 if (m_activeAnimations[i]->id() == animationId && m_activeAnimations[i]-
>targetProperty() == targetProperty) | 49 if (m_activeAnimations[i]->id() == animationId && m_activeAnimations[i]-
>targetProperty() == targetProperty) |
| 56 m_activeAnimations.remove(i); | 50 m_activeAnimations.remove(i); |
| 57 else | 51 else |
| 58 i++; | 52 i++; |
| 59 } | 53 } |
| 60 updateRegistration(); | |
| 61 } | 54 } |
| 62 | 55 |
| 63 // According to render layer backing, these are for testing only. | 56 // According to render layer backing, these are for testing only. |
| 64 void LayerAnimationController::suspendAnimations(double monotonicTime) | 57 void LayerAnimationController::suspendAnimations(double monotonicTime) |
| 65 { | 58 { |
| 66 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 59 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 67 if (!m_activeAnimations[i]->isFinished()) | 60 if (!m_activeAnimations[i]->isFinished()) |
| 68 m_activeAnimations[i]->setRunState(ActiveAnimation::Paused, monotoni
cTime); | 61 m_activeAnimations[i]->setRunState(ActiveAnimation::Paused, monotoni
cTime); |
| 69 } | 62 } |
| 70 } | 63 } |
| 71 | 64 |
| 72 // Looking at GraphicsLayerCA, this appears to be the analog to suspendAnimation
s, which is for testing. | 65 // Looking at GraphicsLayerCA, this appears to be the analog to suspendAnimation
s, which is for testing. |
| 73 void LayerAnimationController::resumeAnimations(double monotonicTime) | 66 void LayerAnimationController::resumeAnimations(double monotonicTime) |
| 74 { | 67 { |
| 75 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 68 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 76 if (m_activeAnimations[i]->runState() == ActiveAnimation::Paused) | 69 if (m_activeAnimations[i]->runState() == ActiveAnimation::Paused) |
| 77 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); | 70 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); |
| 78 } | 71 } |
| 79 } | 72 } |
| 80 | 73 |
| 81 // Ensures that the list of active animations on the main thread and the impl th
read | 74 // Ensures that the list of active animations on the main thread and the impl th
read |
| 82 // are kept in sync. | 75 // are kept in sync. |
| 83 void LayerAnimationController::pushAnimationUpdatesTo(LayerAnimationController*
controllerImpl) | 76 void LayerAnimationController::pushAnimationUpdatesTo(LayerAnimationController*
controllerImpl) |
| 84 { | 77 { |
| 85 if (!isAnimatingProperty(ActiveAnimation::Opacity)) | |
| 86 controllerImpl->m_opacity = m_opacity; | |
| 87 | |
| 88 if (!isAnimatingProperty(ActiveAnimation::Transform)) | |
| 89 controllerImpl->m_transform = m_transform; | |
| 90 | |
| 91 if (m_forceSync) { | 78 if (m_forceSync) { |
| 92 replaceImplThreadAnimations(controllerImpl); | 79 replaceImplThreadAnimations(controllerImpl); |
| 93 m_forceSync = false; | 80 m_forceSync = false; |
| 94 } else { | 81 } else { |
| 95 purgeAnimationsMarkedForDeletion(); | 82 purgeAnimationsMarkedForDeletion(); |
| 96 pushNewAnimationsToImplThread(controllerImpl); | 83 pushNewAnimationsToImplThread(controllerImpl); |
| 97 | 84 |
| 98 // Remove finished impl side animations only after pushing, | 85 // Remove finished impl side animations only after pushing, |
| 99 // and only after the animations are deleted on the main thread | 86 // and only after the animations are deleted on the main thread |
| 100 // this insures we will never push an animation twice. | 87 // this insures we will never push an animation twice. |
| 101 removeAnimationsCompletedOnMainThread(controllerImpl); | 88 removeAnimationsCompletedOnMainThread(controllerImpl); |
| 102 | 89 |
| 103 pushPropertiesToImplThread(controllerImpl); | 90 pushPropertiesToImplThread(controllerImpl); |
| 104 } | 91 } |
| 105 } | 92 } |
| 106 | 93 |
| 107 void LayerAnimationController::animate(double monotonicTime, AnimationEventsVect
or* events) | 94 void LayerAnimationController::animate(double monotonicTime, AnimationEventsVect
or* events) |
| 108 { | 95 { |
| 109 startAnimationsWaitingForNextTick(monotonicTime, events); | 96 startAnimationsWaitingForNextTick(monotonicTime, events); |
| 110 startAnimationsWaitingForStartTime(monotonicTime, events); | 97 startAnimationsWaitingForStartTime(monotonicTime, events); |
| 111 startAnimationsWaitingForTargetAvailability(monotonicTime, events); | 98 startAnimationsWaitingForTargetAvailability(monotonicTime, events); |
| 112 resolveConflicts(monotonicTime); | 99 resolveConflicts(monotonicTime); |
| 113 tickAnimations(monotonicTime); | 100 tickAnimations(monotonicTime); |
| 114 markAnimationsForDeletion(monotonicTime, events); | 101 markAnimationsForDeletion(monotonicTime, events); |
| 115 startAnimationsWaitingForTargetAvailability(monotonicTime, events); | 102 startAnimationsWaitingForTargetAvailability(monotonicTime, events); |
| 116 | |
| 117 updateRegistration(); | |
| 118 } | 103 } |
| 119 | 104 |
| 120 void LayerAnimationController::addAnimation(scoped_ptr<ActiveAnimation> animatio
n) | 105 void LayerAnimationController::addAnimation(scoped_ptr<ActiveAnimation> animatio
n) |
| 121 { | 106 { |
| 122 m_activeAnimations.append(animation.Pass()); | 107 m_activeAnimations.append(animation.Pass()); |
| 123 updateRegistration(); | |
| 124 } | 108 } |
| 125 | 109 |
| 126 ActiveAnimation* LayerAnimationController::getActiveAnimation(int groupId, Activ
eAnimation::TargetProperty targetProperty) const | 110 ActiveAnimation* LayerAnimationController::getActiveAnimation(int groupId, Activ
eAnimation::TargetProperty targetProperty) const |
| 127 { | 111 { |
| 128 for (size_t i = 0; i < m_activeAnimations.size(); ++i) | 112 for (size_t i = 0; i < m_activeAnimations.size(); ++i) |
| 129 if (m_activeAnimations[i]->group() == groupId && m_activeAnimations[i]->
targetProperty() == targetProperty) | 113 if (m_activeAnimations[i]->group() == groupId && m_activeAnimations[i]->
targetProperty() == targetProperty) |
| 130 return m_activeAnimations[i]; | 114 return m_activeAnimations[i]; |
| 131 return 0; | 115 return 0; |
| 132 } | 116 } |
| 133 | 117 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 163 { | 147 { |
| 164 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 148 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 165 if (m_activeAnimations[i]->group() == event.groupId && m_activeAnimation
s[i]->targetProperty() == event.targetProperty && m_activeAnimations[i]->needsSy
nchronizedStartTime()) { | 149 if (m_activeAnimations[i]->group() == event.groupId && m_activeAnimation
s[i]->targetProperty() == event.targetProperty && m_activeAnimations[i]->needsSy
nchronizedStartTime()) { |
| 166 m_activeAnimations[i]->setNeedsSynchronizedStartTime(false); | 150 m_activeAnimations[i]->setNeedsSynchronizedStartTime(false); |
| 167 m_activeAnimations[i]->setStartTime(event.monotonicTime); | 151 m_activeAnimations[i]->setStartTime(event.monotonicTime); |
| 168 return; | 152 return; |
| 169 } | 153 } |
| 170 } | 154 } |
| 171 } | 155 } |
| 172 | 156 |
| 173 void LayerAnimationController::setAnimationRegistrar(AnimationRegistrar* registr
ar) | 157 void LayerAnimationController::setClient(LayerAnimationControllerClient* client) |
| 174 { | 158 { |
| 175 if (m_registrar == registrar) | 159 m_client = client; |
| 176 return; | |
| 177 | |
| 178 if (m_registrar) | |
| 179 m_registrar->UnregisterAnimationController(this); | |
| 180 | |
| 181 m_registrar = registrar; | |
| 182 if (m_registrar) | |
| 183 m_registrar->RegisterAnimationController(this); | |
| 184 | |
| 185 updateRegistration(); | |
| 186 } | |
| 187 | |
| 188 void LayerAnimationController::setId(int id) | |
| 189 { | |
| 190 m_id = id; | |
| 191 } | |
| 192 | |
| 193 bool LayerAnimationController::setOpacity(float opacity) | |
| 194 { | |
| 195 if (m_opacity == opacity || isAnimatingProperty(ActiveAnimation::Opacity)) | |
| 196 return false; | |
| 197 m_opacity = opacity; | |
| 198 return true; | |
| 199 } | |
| 200 | |
| 201 bool LayerAnimationController::setTransform(const gfx::Transform& transform) | |
| 202 { | |
| 203 if (m_transform == transform || isAnimatingProperty(ActiveAnimation::Transfo
rm)) | |
| 204 return false; | |
| 205 m_transform = transform; | |
| 206 return true; | |
| 207 } | 160 } |
| 208 | 161 |
| 209 void LayerAnimationController::pushNewAnimationsToImplThread(LayerAnimationContr
oller* controllerImpl) const | 162 void LayerAnimationController::pushNewAnimationsToImplThread(LayerAnimationContr
oller* controllerImpl) const |
| 210 { | 163 { |
| 211 // Any new animations owned by the main thread's controller are cloned and a
dde to the impl thread's controller. | 164 // Any new animations owned by the main thread's controller are cloned and a
dde to the impl thread's controller. |
| 212 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 165 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 213 // If the animation is already running on the impl thread, there is no n
eed to copy it over. | 166 // If the animation is already running on the impl thread, there is no n
eed to copy it over. |
| 214 if (controllerImpl->getActiveAnimation(m_activeAnimations[i]->group(), m
_activeAnimations[i]->targetProperty())) | 167 if (controllerImpl->getActiveAnimation(m_activeAnimations[i]->group(), m
_activeAnimations[i]->targetProperty())) |
| 215 continue; | 168 continue; |
| 216 | 169 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 } | 207 } |
| 255 | 208 |
| 256 void LayerAnimationController::startAnimationsWaitingForNextTick(double monotoni
cTime, AnimationEventsVector* events) | 209 void LayerAnimationController::startAnimationsWaitingForNextTick(double monotoni
cTime, AnimationEventsVector* events) |
| 257 { | 210 { |
| 258 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 211 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 259 if (m_activeAnimations[i]->runState() == ActiveAnimation::WaitingForNext
Tick) { | 212 if (m_activeAnimations[i]->runState() == ActiveAnimation::WaitingForNext
Tick) { |
| 260 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); | 213 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); |
| 261 if (!m_activeAnimations[i]->hasSetStartTime()) | 214 if (!m_activeAnimations[i]->hasSetStartTime()) |
| 262 m_activeAnimations[i]->setStartTime(monotonicTime); | 215 m_activeAnimations[i]->setStartTime(monotonicTime); |
| 263 if (events) | 216 if (events) |
| 264 events->push_back(AnimationEvent(AnimationEvent::Started, m_id,
m_activeAnimations[i]->group(), m_activeAnimations[i]->targetProperty(), monoton
icTime)); | 217 events->push_back(AnimationEvent(AnimationEvent::Started, m_clie
nt->id(), m_activeAnimations[i]->group(), m_activeAnimations[i]->targetProperty(
), monotonicTime)); |
| 265 } | 218 } |
| 266 } | 219 } |
| 267 } | 220 } |
| 268 | 221 |
| 269 void LayerAnimationController::startAnimationsWaitingForStartTime(double monoton
icTime, AnimationEventsVector* events) | 222 void LayerAnimationController::startAnimationsWaitingForStartTime(double monoton
icTime, AnimationEventsVector* events) |
| 270 { | 223 { |
| 271 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 224 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 272 if (m_activeAnimations[i]->runState() == ActiveAnimation::WaitingForStar
tTime && m_activeAnimations[i]->startTime() <= monotonicTime) { | 225 if (m_activeAnimations[i]->runState() == ActiveAnimation::WaitingForStar
tTime && m_activeAnimations[i]->startTime() <= monotonicTime) { |
| 273 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); | 226 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, monoton
icTime); |
| 274 if (events) | 227 if (events) |
| 275 events->push_back(AnimationEvent(AnimationEvent::Started, m_id,
m_activeAnimations[i]->group(), m_activeAnimations[i]->targetProperty(), monoton
icTime)); | 228 events->push_back(AnimationEvent(AnimationEvent::Started, m_clie
nt->id(), m_activeAnimations[i]->group(), m_activeAnimations[i]->targetProperty(
), monotonicTime)); |
| 276 } | 229 } |
| 277 } | 230 } |
| 278 } | 231 } |
| 279 | 232 |
| 280 void LayerAnimationController::startAnimationsWaitingForTargetAvailability(doubl
e monotonicTime, AnimationEventsVector* events) | 233 void LayerAnimationController::startAnimationsWaitingForTargetAvailability(doubl
e monotonicTime, AnimationEventsVector* events) |
| 281 { | 234 { |
| 282 // First collect running properties. | 235 // First collect running properties. |
| 283 TargetProperties blockedProperties; | 236 TargetProperties blockedProperties; |
| 284 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 237 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 285 if (m_activeAnimations[i]->runState() == ActiveAnimation::Running || m_a
ctiveAnimations[i]->runState() == ActiveAnimation::Finished) | 238 if (m_activeAnimations[i]->runState() == ActiveAnimation::Running || m_a
ctiveAnimations[i]->runState() == ActiveAnimation::Finished) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 304 if (!blockedProperties.insert(*pIter).second) | 257 if (!blockedProperties.insert(*pIter).second) |
| 305 nullIntersection = false; | 258 nullIntersection = false; |
| 306 } | 259 } |
| 307 | 260 |
| 308 // If the intersection is null, then we are free to start the animat
ions in the group. | 261 // If the intersection is null, then we are free to start the animat
ions in the group. |
| 309 if (nullIntersection) { | 262 if (nullIntersection) { |
| 310 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, mon
otonicTime); | 263 m_activeAnimations[i]->setRunState(ActiveAnimation::Running, mon
otonicTime); |
| 311 if (!m_activeAnimations[i]->hasSetStartTime()) | 264 if (!m_activeAnimations[i]->hasSetStartTime()) |
| 312 m_activeAnimations[i]->setStartTime(monotonicTime); | 265 m_activeAnimations[i]->setStartTime(monotonicTime); |
| 313 if (events) | 266 if (events) |
| 314 events->push_back(AnimationEvent(AnimationEvent::Started, m_
id, m_activeAnimations[i]->group(), m_activeAnimations[i]->targetProperty(), mon
otonicTime)); | 267 events->push_back(AnimationEvent(AnimationEvent::Started, m_
client->id(), m_activeAnimations[i]->group(), m_activeAnimations[i]->targetPrope
rty(), monotonicTime)); |
| 315 for (size_t j = i + 1; j < m_activeAnimations.size(); ++j) { | 268 for (size_t j = i + 1; j < m_activeAnimations.size(); ++j) { |
| 316 if (m_activeAnimations[i]->group() == m_activeAnimations[j]-
>group()) { | 269 if (m_activeAnimations[i]->group() == m_activeAnimations[j]-
>group()) { |
| 317 m_activeAnimations[j]->setRunState(ActiveAnimation::Runn
ing, monotonicTime); | 270 m_activeAnimations[j]->setRunState(ActiveAnimation::Runn
ing, monotonicTime); |
| 318 if (!m_activeAnimations[j]->hasSetStartTime()) | 271 if (!m_activeAnimations[j]->hasSetStartTime()) |
| 319 m_activeAnimations[j]->setStartTime(monotonicTime); | 272 m_activeAnimations[j]->setStartTime(monotonicTime); |
| 320 } | 273 } |
| 321 } | 274 } |
| 322 } | 275 } |
| 323 } | 276 } |
| 324 } | 277 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 break; | 313 break; |
| 361 } | 314 } |
| 362 } | 315 } |
| 363 } | 316 } |
| 364 if (allAnimsWithSameIdAreFinished) { | 317 if (allAnimsWithSameIdAreFinished) { |
| 365 // We now need to remove all animations with the same group id as gr
oupId | 318 // We now need to remove all animations with the same group id as gr
oupId |
| 366 // (and send along animation finished notifications, if necessary). | 319 // (and send along animation finished notifications, if necessary). |
| 367 for (size_t j = i; j < m_activeAnimations.size(); j++) { | 320 for (size_t j = i; j < m_activeAnimations.size(); j++) { |
| 368 if (groupId == m_activeAnimations[j]->group()) { | 321 if (groupId == m_activeAnimations[j]->group()) { |
| 369 if (events) | 322 if (events) |
| 370 events->push_back(AnimationEvent(AnimationEvent::Finishe
d, m_id, m_activeAnimations[j]->group(), m_activeAnimations[j]->targetProperty()
, monotonicTime)); | 323 events->push_back(AnimationEvent(AnimationEvent::Finishe
d, m_client->id(), m_activeAnimations[j]->group(), m_activeAnimations[j]->target
Property(), monotonicTime)); |
| 371 m_activeAnimations[j]->setRunState(ActiveAnimation::WaitingF
orDeletion, monotonicTime); | 324 m_activeAnimations[j]->setRunState(ActiveAnimation::WaitingF
orDeletion, monotonicTime); |
| 372 } | 325 } |
| 373 } | 326 } |
| 374 } | 327 } |
| 375 } | 328 } |
| 376 } | 329 } |
| 377 | 330 |
| 378 void LayerAnimationController::purgeAnimationsMarkedForDeletion() | 331 void LayerAnimationController::purgeAnimationsMarkedForDeletion() |
| 379 { | 332 { |
| 380 for (size_t i = 0; i < m_activeAnimations.size();) { | 333 for (size_t i = 0; i < m_activeAnimations.size();) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 398 toAdd = m_activeAnimations[i]->cloneAndInitialize(ActiveAnimation::C
ontrollingInstance, initialRunState, startTime).Pass(); | 351 toAdd = m_activeAnimations[i]->cloneAndInitialize(ActiveAnimation::C
ontrollingInstance, initialRunState, startTime).Pass(); |
| 399 } else | 352 } else |
| 400 toAdd = m_activeAnimations[i]->clone(ActiveAnimation::ControllingIns
tance).Pass(); | 353 toAdd = m_activeAnimations[i]->clone(ActiveAnimation::ControllingIns
tance).Pass(); |
| 401 | 354 |
| 402 controllerImpl->addAnimation(toAdd.Pass()); | 355 controllerImpl->addAnimation(toAdd.Pass()); |
| 403 } | 356 } |
| 404 } | 357 } |
| 405 | 358 |
| 406 void LayerAnimationController::tickAnimations(double monotonicTime) | 359 void LayerAnimationController::tickAnimations(double monotonicTime) |
| 407 { | 360 { |
| 408 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { | 361 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { |
| 409 if (m_activeAnimations[i]->runState() == ActiveAnimation::Running || m_a
ctiveAnimations[i]->runState() == ActiveAnimation::Paused) { | 362 if (m_activeAnimations[i]->runState() == ActiveAnimation::Running || m_a
ctiveAnimations[i]->runState() == ActiveAnimation::Paused) { |
| 410 double trimmed = m_activeAnimations[i]->trimTimeToCurrentIteration(m
onotonicTime); | 363 double trimmed = m_activeAnimations[i]->trimTimeToCurrentIteration(m
onotonicTime); |
| 411 | 364 |
| 412 // Animation assumes its initial value until it gets the synchronize
d start time | 365 // Animation assumes its initial value until it gets the synchronize
d start time |
| 413 // from the impl thread and can start ticking. | 366 // from the impl thread and can start ticking. |
| 414 if (m_activeAnimations[i]->needsSynchronizedStartTime()) | 367 if (m_activeAnimations[i]->needsSynchronizedStartTime()) |
| 415 trimmed = 0; | 368 trimmed = 0; |
| 416 | 369 |
| 417 switch (m_activeAnimations[i]->targetProperty()) { | 370 switch (m_activeAnimations[i]->targetProperty()) { |
| 418 | 371 |
| 419 case ActiveAnimation::Transform: { | 372 case ActiveAnimation::Transform: { |
| 420 const TransformAnimationCurve* transformAnimationCurve = m_activ
eAnimations[i]->curve()->toTransformAnimationCurve(); | 373 const TransformAnimationCurve* transformAnimationCurve = m_activ
eAnimations[i]->curve()->toTransformAnimationCurve(); |
| 421 m_transform = transformAnimationCurve->getValue(trimmed).toTrans
form(); | 374 const gfx::Transform matrix = transformAnimationCurve->getValue(
trimmed).toTransform(); |
| 422 if (m_activeAnimations[i]->isFinishedAt(monotonicTime)) | 375 if (m_activeAnimations[i]->isFinishedAt(monotonicTime)) |
| 423 m_activeAnimations[i]->setRunState(ActiveAnimation::Finished
, monotonicTime); | 376 m_activeAnimations[i]->setRunState(ActiveAnimation::Finished
, monotonicTime); |
| 377 |
| 378 m_client->setTransformFromAnimation(matrix); |
| 424 break; | 379 break; |
| 425 } | 380 } |
| 426 | 381 |
| 427 case ActiveAnimation::Opacity: { | 382 case ActiveAnimation::Opacity: { |
| 428 const FloatAnimationCurve* floatAnimationCurve = m_activeAnimati
ons[i]->curve()->toFloatAnimationCurve(); | 383 const FloatAnimationCurve* floatAnimationCurve = m_activeAnimati
ons[i]->curve()->toFloatAnimationCurve(); |
| 429 m_opacity = floatAnimationCurve->getValue(trimmed); | 384 const float opacity = floatAnimationCurve->getValue(trimmed); |
| 430 if (m_activeAnimations[i]->isFinishedAt(monotonicTime)) | 385 if (m_activeAnimations[i]->isFinishedAt(monotonicTime)) |
| 431 m_activeAnimations[i]->setRunState(ActiveAnimation::Finished
, monotonicTime); | 386 m_activeAnimations[i]->setRunState(ActiveAnimation::Finished
, monotonicTime); |
| 387 |
| 388 m_client->setOpacityFromAnimation(opacity); |
| 432 break; | 389 break; |
| 433 } | 390 } |
| 434 | 391 |
| 435 // Do nothing for sentinel value. | 392 // Do nothing for sentinel value. |
| 436 case ActiveAnimation::TargetPropertyEnumSize: | 393 case ActiveAnimation::TargetPropertyEnumSize: |
| 437 NOTREACHED(); | 394 NOTREACHED(); |
| 438 } | 395 } |
| 439 } | 396 } |
| 440 } | 397 } |
| 441 } | 398 } |
| 442 | 399 |
| 443 void LayerAnimationController::updateRegistration() | |
| 444 { | |
| 445 if (m_registrar) { | |
| 446 if (hasActiveAnimation()) | |
| 447 m_registrar->DidActivateAnimationController(this); | |
| 448 else | |
| 449 m_registrar->DidDeactivateAnimationController(this); | |
| 450 } | |
| 451 } | |
| 452 | |
| 453 } // namespace cc | 400 } // namespace cc |
| OLD | NEW |