Chromium Code Reviews| Index: Source/core/animation/CompositorAnimations.cpp |
| diff --git a/Source/core/animation/CompositorAnimations.cpp b/Source/core/animation/CompositorAnimations.cpp |
| index 813e2340a3f1da9a8af0a0ca40db50bee8b9f5a0..f5566c9a27614275a3e0aa37cc8a4d02df09e4d1 100644 |
| --- a/Source/core/animation/CompositorAnimations.cpp |
| +++ b/Source/core/animation/CompositorAnimations.cpp |
| @@ -43,9 +43,11 @@ |
| #include "core/layout/LayoutBoxModelObject.h" |
| #include "core/layout/LayoutObject.h" |
| #include "core/layout/compositing/CompositedLayerMapping.h" |
| +#include "platform/RuntimeEnabledFeatures.h" |
| #include "platform/geometry/FloatBox.h" |
| #include "public/platform/Platform.h" |
| #include "public/platform/WebCompositorAnimation.h" |
| +#include "public/platform/WebCompositorAnimationPlayer.h" |
| #include "public/platform/WebCompositorSupport.h" |
| #include "public/platform/WebFilterAnimationCurve.h" |
| #include "public/platform/WebFilterKeyframe.h" |
| @@ -260,10 +262,10 @@ bool CompositorAnimations::canStartAnimationOnCompositor(const Element& element) |
| return element.layoutObject() && element.layoutObject()->compositingState() == PaintsIntoOwnBacking; |
| } |
| -bool CompositorAnimations::startAnimationOnCompositor(const Element& element, int group, double startTime, double timeOffset, const Timing& timing, const AnimationPlayer* player, const AnimationEffect& effect, Vector<int>& startedAnimationIds, double playerPlaybackRate) |
| +bool CompositorAnimations::startAnimationOnCompositor(const Element& element, int group, double startTime, double timeOffset, const Timing& timing, const AnimationPlayer& player, const AnimationEffect& effect, Vector<int>& startedAnimationIds, double playerPlaybackRate) |
| { |
| ASSERT(startedAnimationIds.isEmpty()); |
| - ASSERT(isCandidateForAnimationOnCompositor(timing, element, player, effect, playerPlaybackRate)); |
| + ASSERT(isCandidateForAnimationOnCompositor(timing, element, &player, effect, playerPlaybackRate)); |
| ASSERT(canStartAnimationOnCompositor(element)); |
| const KeyframeEffectModelBase& keyframeEffect = toKeyframeEffectModelBase(effect); |
| @@ -276,10 +278,14 @@ bool CompositorAnimations::startAnimationOnCompositor(const Element& element, in |
| ASSERT(!animations.isEmpty()); |
| for (auto& animation : animations) { |
| int id = animation->id(); |
| - if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(animation.release())) { |
| + if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
| + WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
| + ASSERT(compositorPlayer); |
| + compositorPlayer->addAnimation(animation.leakPtr()); |
| + } else if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(animation.release())) { |
| // FIXME: We should know ahead of time whether these animations can be started. |
| for (int startedAnimationId : startedAnimationIds) |
| - cancelAnimationOnCompositor(element, startedAnimationId); |
| + cancelAnimationOnCompositor(element, player, startedAnimationId); |
| startedAnimationIds.clear(); |
| return false; |
| } |
| @@ -289,7 +295,7 @@ bool CompositorAnimations::startAnimationOnCompositor(const Element& element, in |
| return true; |
| } |
| -void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, int id) |
| +void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, const AnimationPlayer& player, int id) |
| { |
| if (!canStartAnimationOnCompositor(element)) { |
| // When an element is being detached, we cancel any associated |
| @@ -299,10 +305,16 @@ void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, i |
| // compositing update. |
| return; |
| } |
| - toLayoutBoxModelObject(element.layoutObject())->layer()->compositedLayerMapping()->mainGraphicsLayer()->removeAnimation(id); |
| + if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
| + WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
| + ASSERT(compositorPlayer); |
| + compositorPlayer->removeAnimation(id); |
| + } else { |
| + toLayoutBoxModelObject(element.layoutObject())->layer()->compositedLayerMapping()->mainGraphicsLayer()->removeAnimation(id); |
| + } |
| } |
| -void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& element, int id, double pauseTime) |
| +void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& element, const AnimationPlayer& player, int id, double pauseTime) |
| { |
| // FIXME: canStartAnimationOnCompositor queries compositingState, which is not necessarily up to date. |
| // https://code.google.com/p/chromium/issues/detail?id=339847 |
| @@ -312,7 +324,49 @@ void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& e |
| ASSERT_NOT_REACHED(); |
| return; |
| } |
| - toLayoutBoxModelObject(element.layoutObject())->layer()->compositedLayerMapping()->mainGraphicsLayer()->pauseAnimation(id, pauseTime); |
| + if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
| + WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
| + ASSERT(compositorPlayer); |
| + compositorPlayer->pauseAnimation(id, pauseTime); |
| + } else { |
| + toLayoutBoxModelObject(element.layoutObject())->layer()->compositedLayerMapping()->mainGraphicsLayer()->pauseAnimation(id, pauseTime); |
| + } |
| +} |
| + |
| +bool CompositorAnimations::canAttachCompositedLayers(const Element& element, const AnimationPlayer& player) |
| +{ |
| + if (!RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) |
| + return false; |
| + |
| + if (!player.compositorPlayer()) |
| + return false; |
| + |
| + if (!element.layoutObject() || !element.layoutObject()->isBoxModelObject()) |
| + return false; |
| + |
| + Layer* layer = toLayoutBoxModelObject(element.layoutObject())->layer(); |
| + |
| + if (!layer || !layer->isAllowedToQueryCompositingState() || !layer->compositedLayerMapping() || !layer->compositedLayerMapping()->mainGraphicsLayer()) |
|
dstockwell
2015/03/26 03:04:39
I think isAllowedToQueryCompositingState being fal
loyso (OOO)
2015/03/26 23:36:14
It allows us to defer the actual attachment.
|
| + return false; |
| + |
| + if (!layer->compositedLayerMapping()->mainGraphicsLayer()->platformLayer()) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| +void CompositorAnimations::attachCompositedLayers(const Element& element, const AnimationPlayer& player) |
| +{ |
| + ASSERT(element.layoutObject()); |
| + |
| + Layer* layer = toLayoutBoxModelObject(element.layoutObject())->layer(); |
| + ASSERT(layer); |
| + |
| + WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
| + ASSERT(compositorPlayer); |
| + |
| + ASSERT(layer->compositedLayerMapping()); |
| + compositorPlayer->attachLayer(layer->compositedLayerMapping()->mainGraphicsLayer()->platformLayer()); |
| } |
| // ----------------------------------------------------------------------- |