Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(488)

Side by Side Diff: Source/WebCore/platform/graphics/chromium/cc/CCLayerAnimationController.cpp

Issue 10310152: Merge 116786 - [chromium] Ensure that animations continue to run when transform-style is changed (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1132/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 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 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 109
110 // If timeOffset > 0, then the animation has started in the past. 110 // If timeOffset > 0, then the animation has started in the past.
111 anim->setTimeOffset(timeOffset); 111 anim->setTimeOffset(timeOffset);
112 112
113 return anim.release(); 113 return anim.release();
114 } 114 }
115 115
116 } // namepace 116 } // namepace
117 117
118 CCLayerAnimationController::CCLayerAnimationController(CCLayerAnimationControlle rClient* client) 118 CCLayerAnimationController::CCLayerAnimationController(CCLayerAnimationControlle rClient* client)
119 : m_client(client) 119 : m_forceSync(false)
120 , m_client(client)
120 { 121 {
121 } 122 }
122 123
123 CCLayerAnimationController::~CCLayerAnimationController() 124 CCLayerAnimationController::~CCLayerAnimationController()
124 { 125 {
125 } 126 }
126 127
127 PassOwnPtr<CCLayerAnimationController> CCLayerAnimationController::create(CCLaye rAnimationControllerClient* client) 128 PassOwnPtr<CCLayerAnimationController> CCLayerAnimationController::create(CCLaye rAnimationControllerClient* client)
128 { 129 {
129 return adoptPtr(new CCLayerAnimationController(client)); 130 return adoptPtr(new CCLayerAnimationController(client));
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { 189 for (size_t i = 0; i < m_activeAnimations.size(); ++i) {
189 if (m_activeAnimations[i]->runState() == CCActiveAnimation::Paused) 190 if (m_activeAnimations[i]->runState() == CCActiveAnimation::Paused)
190 m_activeAnimations[i]->setRunState(CCActiveAnimation::Running, monot onicTime); 191 m_activeAnimations[i]->setRunState(CCActiveAnimation::Running, monot onicTime);
191 } 192 }
192 } 193 }
193 194
194 // Ensures that the list of active animations on the main thread and the impl th read 195 // Ensures that the list of active animations on the main thread and the impl th read
195 // are kept in sync. 196 // are kept in sync.
196 void CCLayerAnimationController::pushAnimationUpdatesTo(CCLayerAnimationControll er* controllerImpl) 197 void CCLayerAnimationController::pushAnimationUpdatesTo(CCLayerAnimationControll er* controllerImpl)
197 { 198 {
198 pushNewAnimationsToImplThread(controllerImpl); 199 if (m_forceSync) {
199 removeAnimationsCompletedOnMainThread(controllerImpl); 200 replaceImplThreadAnimations(controllerImpl);
200 pushPropertiesToImplThread(controllerImpl); 201 m_forceSync = false;
202 } else {
203 pushNewAnimationsToImplThread(controllerImpl);
204 removeAnimationsCompletedOnMainThread(controllerImpl);
205 pushPropertiesToImplThread(controllerImpl);
206 }
201 } 207 }
202 208
203 void CCLayerAnimationController::animate(double monotonicTime, CCAnimationEvents Vector* events) 209 void CCLayerAnimationController::animate(double monotonicTime, CCAnimationEvents Vector* events)
204 { 210 {
205 startAnimationsWaitingForNextTick(monotonicTime, events); 211 startAnimationsWaitingForNextTick(monotonicTime, events);
206 startAnimationsWaitingForStartTime(monotonicTime, events); 212 startAnimationsWaitingForStartTime(monotonicTime, events);
207 startAnimationsWaitingForTargetAvailability(monotonicTime, events); 213 startAnimationsWaitingForTargetAvailability(monotonicTime, events);
208 resolveConflicts(monotonicTime); 214 resolveConflicts(monotonicTime);
209 tickAnimations(monotonicTime); 215 tickAnimations(monotonicTime);
210 purgeFinishedAnimations(monotonicTime, events); 216 purgeFinishedAnimations(monotonicTime, events);
(...skipping 27 matching lines...) Expand all
238 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { 244 for (size_t i = 0; i < m_activeAnimations.size(); ++i) {
239 if (m_activeAnimations[i]->runState() != CCActiveAnimation::Finished && m_activeAnimations[i]->runState() != CCActiveAnimation::Aborted && m_activeAnima tions[i]->targetProperty() == targetProperty) 245 if (m_activeAnimations[i]->runState() != CCActiveAnimation::Finished && m_activeAnimations[i]->runState() != CCActiveAnimation::Aborted && m_activeAnima tions[i]->targetProperty() == targetProperty)
240 return true; 246 return true;
241 } 247 }
242 return false; 248 return false;
243 } 249 }
244 250
245 void CCLayerAnimationController::notifyAnimationStarted(const CCAnimationEvent& event) 251 void CCLayerAnimationController::notifyAnimationStarted(const CCAnimationEvent& event)
246 { 252 {
247 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { 253 for (size_t i = 0; i < m_activeAnimations.size(); ++i) {
248 if (m_activeAnimations[i]->group() == event.groupId && m_activeAnimation s[i]->targetProperty() == event.targetProperty) { 254 if (m_activeAnimations[i]->group() == event.groupId && m_activeAnimation s[i]->targetProperty() == event.targetProperty && m_activeAnimations[i]->needsSy nchronizedStartTime()) {
249 ASSERT(m_activeAnimations[i]->needsSynchronizedStartTime());
250 m_activeAnimations[i]->setNeedsSynchronizedStartTime(false); 255 m_activeAnimations[i]->setNeedsSynchronizedStartTime(false);
251 m_activeAnimations[i]->setStartTime(event.monotonicTime); 256 m_activeAnimations[i]->setStartTime(event.monotonicTime);
252 return; 257 return;
253 } 258 }
254 } 259 }
255 } 260 }
256 261
262 void CCLayerAnimationController::setClient(CCLayerAnimationControllerClient* cli ent)
263 {
264 m_client = client;
265 }
266
257 void CCLayerAnimationController::pushNewAnimationsToImplThread(CCLayerAnimationC ontroller* controllerImpl) const 267 void CCLayerAnimationController::pushNewAnimationsToImplThread(CCLayerAnimationC ontroller* controllerImpl) const
258 { 268 {
259 // Any new animations owned by the main thread's controller are cloned and a dde to the impl thread's controller. 269 // Any new animations owned by the main thread's controller are cloned and a dde to the impl thread's controller.
260 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { 270 for (size_t i = 0; i < m_activeAnimations.size(); ++i) {
261 // If the animation is already running on the impl thread, there is no n eed to copy it over. 271 // If the animation is already running on the impl thread, there is no n eed to copy it over.
262 if (controllerImpl->getActiveAnimation(m_activeAnimations[i]->group(), m _activeAnimations[i]->targetProperty())) 272 if (controllerImpl->getActiveAnimation(m_activeAnimations[i]->group(), m _activeAnimations[i]->targetProperty()))
263 continue; 273 continue;
264 274
265 // If the animation is not running on the impl thread, it does not neces sarily mean that it needs 275 // If the animation is not running on the impl thread, it does not neces sarily mean that it needs
266 // to be copied over and started; it may have already finished. In this case, the impl thread animation 276 // to be copied over and started; it may have already finished. In this case, the impl thread animation
267 // will have already notified that it has started and the main thread an imation will no longer need 277 // will have already notified that it has started and the main thread an imation will no longer need
268 // a synchronized start time. 278 // a synchronized start time.
269 if (!m_activeAnimations[i]->needsSynchronizedStartTime()) 279 if (!m_activeAnimations[i]->needsSynchronizedStartTime())
270 continue; 280 continue;
271 281
272 OwnPtr<CCActiveAnimation> toAdd(m_activeAnimations[i]->cloneForImplThrea d()); 282 OwnPtr<CCActiveAnimation> toAdd(m_activeAnimations[i]->cloneForImplThrea d());
273 ASSERT(!toAdd->needsSynchronizedStartTime()); 283 ASSERT(!toAdd->needsSynchronizedStartTime());
274 // The new animation should be set to run as soon as possible. 284 // The new animation should be set to run as soon as possible.
275 toAdd->setRunState(CCActiveAnimation::WaitingForTargetAvailability, 0); 285 toAdd->setRunState(CCActiveAnimation::WaitingForTargetAvailability, 0);
286 toAdd->setStartTime(0);
276 controllerImpl->add(toAdd.release()); 287 controllerImpl->add(toAdd.release());
277 } 288 }
278 } 289 }
279 290
280 void CCLayerAnimationController::removeAnimationsCompletedOnMainThread(CCLayerAn imationController* controllerImpl) const 291 void CCLayerAnimationController::removeAnimationsCompletedOnMainThread(CCLayerAn imationController* controllerImpl) const
281 { 292 {
282 // Delete all impl thread animations for which there is no corresponding mai n thread animation. 293 // Delete all impl thread animations for which there is no corresponding mai n thread animation.
283 // Each iteration, controller->m_activeAnimations.size() is decremented or i is incremented 294 // Each iteration, controller->m_activeAnimations.size() is decremented or i is incremented
284 // guaranteeing progress towards loop termination. 295 // guaranteeing progress towards loop termination.
285 for (size_t i = 0; i < controllerImpl->m_activeAnimations.size();) { 296 for (size_t i = 0; i < controllerImpl->m_activeAnimations.size();) {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 if (events) 433 if (events)
423 events->append(CCAnimationEvent(CCAnimationEvent::Finish ed, m_client->id(), m_activeAnimations[j]->group(), m_activeAnimations[j]->targe tProperty(), monotonicTime)); 434 events->append(CCAnimationEvent(CCAnimationEvent::Finish ed, m_client->id(), m_activeAnimations[j]->group(), m_activeAnimations[j]->targe tProperty(), monotonicTime));
424 m_activeAnimations.remove(j); 435 m_activeAnimations.remove(j);
425 } 436 }
426 } 437 }
427 } else 438 } else
428 i++; 439 i++;
429 } 440 }
430 } 441 }
431 442
443 void CCLayerAnimationController::replaceImplThreadAnimations(CCLayerAnimationCon troller* controllerImpl) const
444 {
445 controllerImpl->m_activeAnimations.clear();
446 for (size_t i = 0; i < m_activeAnimations.size(); ++i)
447 controllerImpl->add(m_activeAnimations[i]->cloneForImplThread());
448 }
449
432 void CCLayerAnimationController::tickAnimations(double monotonicTime) 450 void CCLayerAnimationController::tickAnimations(double monotonicTime)
433 { 451 {
434 for (size_t i = 0; i < m_activeAnimations.size(); ++i) { 452 for (size_t i = 0; i < m_activeAnimations.size(); ++i) {
435 if (m_activeAnimations[i]->runState() == CCActiveAnimation::Running || m _activeAnimations[i]->runState() == CCActiveAnimation::Paused) { 453 if (m_activeAnimations[i]->runState() == CCActiveAnimation::Running || m _activeAnimations[i]->runState() == CCActiveAnimation::Paused) {
436 double trimmed = m_activeAnimations[i]->trimTimeToCurrentIteration(m onotonicTime); 454 double trimmed = m_activeAnimations[i]->trimTimeToCurrentIteration(m onotonicTime);
437 455
438 // Animation assumes its initial value until it gets the synchronize d start time 456 // Animation assumes its initial value until it gets the synchronize d start time
439 // from the impl thread and can start ticking. 457 // from the impl thread and can start ticking.
440 if (m_activeAnimations[i]->needsSynchronizedStartTime()) 458 if (m_activeAnimations[i]->needsSynchronizedStartTime())
441 trimmed = 0; 459 trimmed = 0;
(...skipping 19 matching lines...) Expand all
461 m_client->setOpacityFromAnimation(opacity); 479 m_client->setOpacityFromAnimation(opacity);
462 break; 480 break;
463 } 481 }
464 482
465 } 483 }
466 } 484 }
467 } 485 }
468 } 486 }
469 487
470 } // namespace WebCore 488 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/platform/graphics/chromium/cc/CCLayerAnimationController.h ('k') | Source/WebKit/chromium/WebKit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698