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

Side by Side Diff: Source/core/animation/CompositorAnimations.cpp

Issue 23874019: Web Animations CSS: Start running animations on the compositor (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase and rename hasActiveAnimationOnCompositor to hasActiveAnimationsOnCompositor Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 default: 116 default:
117 ASSERT_NOT_REACHED(); 117 ASSERT_NOT_REACHED();
118 return PassRefPtr<TimingFunction>(); 118 return PassRefPtr<TimingFunction>();
119 } 119 }
120 } 120 }
121 121
122 // ----------------------------------------------------------------------- 122 // -----------------------------------------------------------------------
123 // CompositorAnimations public API 123 // CompositorAnimations public API
124 // ----------------------------------------------------------------------- 124 // -----------------------------------------------------------------------
125 125
126 bool CompositorAnimations::isCandidateForCompositorAnimation(const Timing& timin g, const AnimationEffect& effect) 126 bool CompositorAnimations::isCandidateForAnimationOnCompositor(const Timing& tim ing, const AnimationEffect& effect)
127 { 127 {
128 const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(& effect); 128 const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(& effect);
129 129
130 return CompositorAnimationsImpl::isCandidateForCompositor(keyframeEffect) 130 return CompositorAnimationsImpl::isCandidateForCompositor(keyframeEffect)
131 && CompositorAnimationsImpl::isCandidateForCompositor(timing, keyframeEf fect.getFrames()); 131 && CompositorAnimationsImpl::isCandidateForCompositor(timing, keyframeEf fect.getFrames());
132 } 132 }
133 133
134 bool CompositorAnimations::canStartCompositorAnimation(const Element& element) 134 bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element)
135 { 135 {
136 return element.renderer() && element.renderer()->compositingState() == Paint sIntoOwnBacking; 136 return element.renderer() && element.renderer()->compositingState() == Paint sIntoOwnBacking;
137 } 137 }
138 138
139 void CompositorAnimations::startCompositorAnimation(const Element& element, cons t Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimationId s) 139 bool CompositorAnimations::startAnimationOnCompositor(const Element& element, co nst Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimation Ids)
140 { 140 {
141 ASSERT(isCandidateForCompositorAnimation(timing, effect)); 141 ASSERT(startedAnimationIds.isEmpty());
142 ASSERT(canStartCompositorAnimation(element)); 142 ASSERT(isCandidateForAnimationOnCompositor(timing, effect));
143 ASSERT(canStartAnimationOnCompositor(element));
143 144
144 const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(& effect); 145 const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(& effect);
145 146
146 RenderLayer* layer = toRenderBoxModelObject(element.renderer())->layer(); 147 RenderLayer* layer = toRenderBoxModelObject(element.renderer())->layer();
147 ASSERT(layer); 148 ASSERT(layer);
148 ASSERT(layer->renderBox()); 149 ASSERT(layer->renderBox());
149 150
150 // FIXME: Should we check in some way if there is an animation already creat ed?
151 Vector<OwnPtr<blink::WebAnimation> > animations; 151 Vector<OwnPtr<blink::WebAnimation> > animations;
152 CompositorAnimationsImpl::getCompositorAnimations(timing, keyframeEffect, an imations, layer->renderBox()->pixelSnappedBorderBoxRect().size()); 152 CompositorAnimationsImpl::getAnimationOnCompositor(timing, keyframeEffect, a nimations, layer->renderBox()->pixelSnappedBorderBoxRect().size());
153 for (size_t i = 0; i < animations.size(); ++i) { 153 for (size_t i = 0; i < animations.size(); ++i) {
154 startedAnimationIds.append(animations[i]->id()); 154 int id = animations[i]->id();
155 layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(anima tions[i].release()); 155 if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation( animations[i].release())) {
156 // FIXME: We should know ahead of time whether these animations can be started.
157 for (size_t j = 0; j < startedAnimationIds.size(); ++j)
158 cancelAnimationOnCompositor(element, startedAnimationIds[j]);
159 startedAnimationIds.clear();
160 return false;
161 }
162 startedAnimationIds.append(id);
156 } 163 }
164 return true;
157 } 165 }
158 166
159 void CompositorAnimations::cancelCompositorAnimation(const Element& element, int id) 167 void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, i nt id)
160 { 168 {
161 // FIXME: Implement. 169 if (!element.renderer() || element.renderer()->compositingState() != PaintsI ntoOwnBacking)
162 ASSERT_NOT_REACHED(); 170 return;
171 toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping( )->mainGraphicsLayer()->removeAnimation(id);
163 } 172 }
164 173
165 // ----------------------------------------------------------------------- 174 // -----------------------------------------------------------------------
166 // CompositorAnimationsKeyframeEffectHelper 175 // CompositorAnimationsKeyframeEffectHelper
167 // ----------------------------------------------------------------------- 176 // -----------------------------------------------------------------------
168 177
169 PassOwnPtr<Vector<CSSPropertyID> > CompositorAnimationsKeyframeEffectHelper::get Properties( 178 PassOwnPtr<Vector<CSSPropertyID> > CompositorAnimationsKeyframeEffectHelper::get Properties(
170 const KeyframeAnimationEffect* effect) 179 const KeyframeAnimationEffect* effect)
171 { 180 {
172 const_cast<KeyframeAnimationEffect*>(effect)->ensureKeyframeGroups(); 181 const_cast<KeyframeAnimationEffect*>(effect)->ensureKeyframeGroups();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 const KeyframeAnimationEffect::KeyframeVector frames = effect.getFrames(); 248 const KeyframeAnimationEffect::KeyframeVector frames = effect.getFrames();
240 for (size_t i = 0; i < frames.size(); ++i) { 249 for (size_t i = 0; i < frames.size(); ++i) {
241 if (!isCandidateForCompositor(*frames[i].get())) 250 if (!isCandidateForCompositor(*frames[i].get()))
242 return false; 251 return false;
243 } 252 }
244 return true; 253 return true;
245 } 254 }
246 255
247 bool CompositorAnimationsImpl::isCandidateForCompositor(const Timing& timing, co nst KeyframeAnimationEffect::KeyframeVector& frames) 256 bool CompositorAnimationsImpl::isCandidateForCompositor(const Timing& timing, co nst KeyframeAnimationEffect::KeyframeVector& frames)
248 { 257 {
249
250 CompositorTiming out; 258 CompositorTiming out;
251 if (!convertTimingForCompositor(timing, out)) 259 if (!convertTimingForCompositor(timing, out))
252 return false; 260 return false;
253 261
254 return isCandidateForCompositor(*timing.timingFunction.get(), &frames); 262 return isCandidateForCompositor(*timing.timingFunction.get(), &frames);
255 } 263 }
256 264
257 bool CompositorAnimationsImpl::isCandidateForCompositor(const TimingFunction& ti mingFunction, const KeyframeAnimationEffect::KeyframeVector* frames, bool isNest edCall) 265 bool CompositorAnimationsImpl::isCandidateForCompositor(const TimingFunction& ti mingFunction, const KeyframeAnimationEffect::KeyframeVector* frames, bool isNest edCall)
258 { 266 {
259 switch (timingFunction.type()) { 267 switch (timingFunction.type()) {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 } 494 }
487 } 495 }
488 496
489 ASSERT(!values[i].second->dependsOnUnderlyingValue()); 497 ASSERT(!values[i].second->dependsOnUnderlyingValue());
490 RefPtr<AnimatableValue> value = values[i].second->compositeOnto(0); 498 RefPtr<AnimatableValue> value = values[i].second->compositeOnto(0);
491 OwnPtr<PlatformAnimationKeyframeType> keyframe = createPlatformKeyframe< PlatformAnimationKeyframeType>(values[i].first, *value.get(), elementSize); 499 OwnPtr<PlatformAnimationKeyframeType> keyframe = createPlatformKeyframe< PlatformAnimationKeyframeType>(values[i].first, *value.get(), elementSize);
492 addKeyframeWithTimingFunction(curve, *keyframe.get(), keyframeTimingFunc tion); 500 addKeyframeWithTimingFunction(curve, *keyframe.get(), keyframeTimingFunc tion);
493 } 501 }
494 } 502 }
495 503
496 void CompositorAnimationsImpl::getCompositorAnimations( 504 void CompositorAnimationsImpl::getAnimationOnCompositor(
497 const Timing& timing, const KeyframeAnimationEffect& effect, Vector<OwnPtr<b link::WebAnimation> >& animations, const IntSize& elementSize) 505 const Timing& timing, const KeyframeAnimationEffect& effect, Vector<OwnPtr<b link::WebAnimation> >& animations, const IntSize& elementSize)
498 { 506 {
499 CompositorTiming compositorTiming; 507 CompositorTiming compositorTiming;
500 bool timingValid = convertTimingForCompositor(timing, compositorTiming); 508 bool timingValid = convertTimingForCompositor(timing, compositorTiming);
501 ASSERT_UNUSED(timingValid, timingValid); 509 ASSERT_UNUSED(timingValid, timingValid);
502 510
503 RefPtr<TimingFunction> timingFunction = timing.timingFunction; 511 RefPtr<TimingFunction> timingFunction = timing.timingFunction;
504 if (compositorTiming.reverse) 512 if (compositorTiming.reverse)
505 timingFunction = CompositorAnimationsTimingFunctionReverser::reverse(tim ingFunction.get()); 513 timingFunction = CompositorAnimationsTimingFunctionReverser::reverse(tim ingFunction.get());
506 514
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 552
545 animation->setIterations(compositorTiming.adjustedIterationCount); 553 animation->setIterations(compositorTiming.adjustedIterationCount);
546 animation->setTimeOffset(compositorTiming.scaledTimeOffset); 554 animation->setTimeOffset(compositorTiming.scaledTimeOffset);
547 animation->setAlternatesDirection(compositorTiming.alternate); 555 animation->setAlternatesDirection(compositorTiming.alternate);
548 556
549 animations.append(animation.release()); 557 animations.append(animation.release());
550 } 558 }
551 } 559 }
552 560
553 } // namespace WebCore 561 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/animation/CompositorAnimations.h ('k') | Source/core/animation/CompositorAnimationsImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698