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

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: Rebased. 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::isCandidateForCompositorAnimations(const Timing& timi ng, 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::canStartCompositorAnimations(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::startCompositorAnimations(const Element& element, con st Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimationI ds)
140 { 140 {
141 ASSERT(isCandidateForCompositorAnimation(timing, effect)); 141 ASSERT(startedAnimationIds.isEmpty());
142 ASSERT(canStartCompositorAnimation(element)); 142 ASSERT(isCandidateForCompositorAnimations(timing, effect));
143 ASSERT(canStartCompositorAnimations(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::getCompositorAnimations(timing, keyframeEffect, an imations, 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.
ajuma 2013/11/18 21:21:17 Note that for the old path, there's logic to avoid
dstockwell 2013/11/18 21:34:03 Thanks for taking a look. We have the same logic h
157 for (size_t j = 0; j < startedAnimationIds.size(); ++j)
158 cancelCompositorAnimations(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::cancelCompositorAnimations(const Element& element, in t 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 284 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

Powered by Google App Engine
This is Rietveld 408576698