Chromium Code Reviews| OLD | NEW | 
|---|---|
| 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 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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::canStartCompositorAnimation(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::startCompositorAnimation(const Element& element, cons t Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimationId s) | 
| 140 { | 140 { | 
| 141 ASSERT(startedAnimationIds.isEmpty()); | |
| 141 ASSERT(isCandidateForCompositorAnimation(timing, effect)); | 142 ASSERT(isCandidateForCompositorAnimation(timing, effect)); | 
| 142 ASSERT(canStartCompositorAnimation(element)); | 143 ASSERT(canStartCompositorAnimation(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. | |
| 157 for (size_t j = 0; j < startedAnimationIds.size(); ++j) | |
| 158 cancelCompositorAnimation(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::cancelCompositorAnimation(const Element& element, int 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 Loading... | |
| 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 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 // FIXME: Support positive startDelay | 318 // FIXME: Support positive startDelay | 
| 311 if (timing.startDelay > 0.0) | 319 if (timing.startDelay > 0.0) | 
| 312 return false; | 320 return false; | 
| 313 | 321 | 
| 314 // All fill modes are supported (the calling code handles them). | 322 // All fill modes are supported (the calling code handles them). | 
| 315 | 323 | 
| 316 // FIXME: Support non-zero iteration start. | 324 // FIXME: Support non-zero iteration start. | 
| 317 if (timing.iterationStart) | 325 if (timing.iterationStart) | 
| 318 return false; | 326 return false; | 
| 319 | 327 | 
| 320 // FIXME: Compositor only supports finite, non-zero, integer iteration | 328 // FIXME: Compositor only non-zero, integer iteration counts. | 
| 
 
shans
2013/11/18 01:02:06
I liked your old FIXME better than your new FIXME
 
dstockwell
2013/11/18 05:30:34
This is being fixed in a separate patch.
 
 | |
| 321 // counts. | 329 if ((std::floor(timing.iterationCount) != timing.iterationCount) || !timing. iterationCount) | 
| 322 if (!std::isfinite(timing.iterationCount) || (std::floor(timing.iterationCou nt) != timing.iterationCount) || !timing.iterationCount) | |
| 323 return false; | 330 return false; | 
| 324 | 331 | 
| 325 if (!timing.iterationDuration) | 332 if (!timing.iterationDuration) | 
| 326 return false; | 333 return false; | 
| 327 | 334 | 
| 328 // FIXME: Support other playback rates | 335 // FIXME: Support other playback rates | 
| 329 if (timing.playbackRate != 1) | 336 if (timing.playbackRate != 1) | 
| 330 return false; | 337 return false; | 
| 331 | 338 | 
| 332 // All directions are supported. | 339 // All directions are supported. | 
| (...skipping 11 matching lines...) Expand all Loading... | |
| 344 return false; | 351 return false; | 
| 345 | 352 | 
| 346 out.reverse = (timing.direction == Timing::PlaybackDirectionReverse | 353 out.reverse = (timing.direction == Timing::PlaybackDirectionReverse | 
| 347 || timing.direction == Timing::PlaybackDirectionAlternateReverse); | 354 || timing.direction == Timing::PlaybackDirectionAlternateReverse); | 
| 348 out.alternate = (timing.direction == Timing::PlaybackDirectionAlternate | 355 out.alternate = (timing.direction == Timing::PlaybackDirectionAlternate | 
| 349 || timing.direction == Timing::PlaybackDirectionAlternateReverse); | 356 || timing.direction == Timing::PlaybackDirectionAlternateReverse); | 
| 350 if (out.alternate && (skippedIterations % 2)) | 357 if (out.alternate && (skippedIterations % 2)) | 
| 351 out.reverse = !out.reverse; | 358 out.reverse = !out.reverse; | 
| 352 | 359 | 
| 353 out.adjustedIterationCount = std::floor(timing.iterationCount) - skippedIter ations; | 360 out.adjustedIterationCount = std::floor(timing.iterationCount) - skippedIter ations; | 
| 354 ASSERT(out.adjustedIterationCount > 0); | 361 if (!std::isfinite(timing.iterationCount)) | 
| 362 out.adjustedIterationCount = -1; | |
| 363 // ASSERT(out.adjustedIterationCount > 0); | |
| 355 | 364 | 
| 356 out.scaledTimeOffset = scaledStartDelay + skippedIterations * out.scaledDura tion; | 365 out.scaledTimeOffset = scaledStartDelay + skippedIterations * out.scaledDura tion; | 
| 357 ASSERT(out.scaledTimeOffset <= 0); | 366 ASSERT(out.scaledTimeOffset <= 0); | 
| 358 return true; | 367 return true; | 
| 359 } | 368 } | 
| 360 | 369 | 
| 361 namespace { | 370 namespace { | 
| 362 | 371 | 
| 363 template<typename PlatformAnimationKeyframeType> | 372 template<typename PlatformAnimationKeyframeType> | 
| 364 static PassOwnPtr<PlatformAnimationKeyframeType> createPlatformKeyframe(double o ffset, const AnimatableValue&, const IntSize&) | 373 static PassOwnPtr<PlatformAnimationKeyframeType> createPlatformKeyframe(double o ffset, const AnimatableValue&, const IntSize&) | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 case TimingFunction::LinearFunction: | 474 case TimingFunction::LinearFunction: | 
| 466 case TimingFunction::CubicBezierFunction: | 475 case TimingFunction::CubicBezierFunction: | 
| 467 keyframeTimingFunction = &timingFunction; | 476 keyframeTimingFunction = &timingFunction; | 
| 468 break; | 477 break; | 
| 469 | 478 | 
| 470 case TimingFunction::ChainedFunction: { | 479 case TimingFunction::ChainedFunction: { | 
| 471 const ChainedTimingFunction* chained = static_cast<const Chained TimingFunction*>(&timingFunction); | 480 const ChainedTimingFunction* chained = static_cast<const Chained TimingFunction*>(&timingFunction); | 
| 472 // ChainedTimingFunction criteria was checked in isCandidate, | 481 // ChainedTimingFunction criteria was checked in isCandidate, | 
| 473 // assert it is valid. | 482 // assert it is valid. | 
| 474 ASSERT(values.size() == chained->m_segments.size() + 1); | 483 ASSERT(values.size() == chained->m_segments.size() + 1); | 
| 475 ASSERT(values[i].first == chained->m_segments[i].m_min); | 484 // FIXME: first has been scaled, this assertion is not valid | 
| 485 // ASSERT(values[i].first == chained->m_segments[i].m_min); | |
| 
 
shans
2013/11/18 01:02:06
Just remove then?
 
dstockwell
2013/11/18 05:30:34
This is being fixed in a separate patch.
 
 | |
| 476 | 486 | 
| 477 keyframeTimingFunction = chained->m_segments[i].m_timingFunction .get(); | 487 keyframeTimingFunction = chained->m_segments[i].m_timingFunction .get(); | 
| 478 break; | 488 break; | 
| 479 } | 489 } | 
| 480 case TimingFunction::StepsFunction: | 490 case TimingFunction::StepsFunction: | 
| 481 default: | 491 default: | 
| 482 ASSERT_NOT_REACHED(); | 492 ASSERT_NOT_REACHED(); | 
| 483 } | 493 } | 
| 484 } | 494 } | 
| 485 | 495 | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 | 551 | 
| 542 animation->setIterations(compositorTiming.adjustedIterationCount); | 552 animation->setIterations(compositorTiming.adjustedIterationCount); | 
| 543 animation->setTimeOffset(compositorTiming.scaledTimeOffset); | 553 animation->setTimeOffset(compositorTiming.scaledTimeOffset); | 
| 544 animation->setAlternatesDirection(compositorTiming.alternate); | 554 animation->setAlternatesDirection(compositorTiming.alternate); | 
| 545 | 555 | 
| 546 animations.append(animation.release()); | 556 animations.append(animation.release()); | 
| 547 } | 557 } | 
| 548 } | 558 } | 
| 549 | 559 | 
| 550 } // namespace WebCore | 560 } // namespace WebCore | 
| OLD | NEW |