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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 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 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 |
| OLD | NEW |