Index: Source/core/animation/CompositorAnimations.cpp |
diff --git a/Source/core/animation/CompositorAnimations.cpp b/Source/core/animation/CompositorAnimations.cpp |
index 34976b7ce2068945390d66300f65d0c073c87d99..a671df9ffe5ba94b60db1d5af70834ddfa28c858 100644 |
--- a/Source/core/animation/CompositorAnimations.cpp |
+++ b/Source/core/animation/CompositorAnimations.cpp |
@@ -43,9 +43,11 @@ |
#include "core/layout/LayoutObject.h" |
#include "core/layout/compositing/CompositedDeprecatedPaintLayerMapping.h" |
#include "core/paint/DeprecatedPaintLayer.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" |
@@ -263,10 +265,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); |
@@ -279,10 +281,14 @@ bool CompositorAnimations::startAnimationOnCompositor(const Element& element, in |
ASSERT(!animations.isEmpty()); |
for (auto& animation : animations) { |
int id = animation->id(); |
- if (!layer->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()->addAnimation(animation.release())) { |
+ if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
+ WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
+ ASSERT(compositorPlayer); |
+ compositorPlayer->addAnimation(animation.leakPtr()); |
+ } else if (!layer->compositedDeprecatedPaintLayerMapping()->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; |
} |
@@ -292,7 +298,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 |
@@ -302,10 +308,16 @@ void CompositorAnimations::cancelAnimationOnCompositor(const Element& element, i |
// compositing update. |
return; |
} |
- toLayoutBoxModelObject(element.layoutObject())->layer()->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()->removeAnimation(id); |
+ if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
+ WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
+ ASSERT(compositorPlayer); |
+ compositorPlayer->removeAnimation(id); |
+ } else { |
+ toLayoutBoxModelObject(element.layoutObject())->layer()->compositedDeprecatedPaintLayerMapping()->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 |
@@ -315,7 +327,51 @@ void CompositorAnimations::pauseAnimationForTestingOnCompositor(const Element& e |
ASSERT_NOT_REACHED(); |
return; |
} |
- toLayoutBoxModelObject(element.layoutObject())->layer()->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()->pauseAnimation(id, pauseTime); |
+ if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { |
+ WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
+ ASSERT(compositorPlayer); |
+ compositorPlayer->pauseAnimation(id, pauseTime); |
+ } else { |
+ toLayoutBoxModelObject(element.layoutObject())->layer()->compositedDeprecatedPaintLayerMapping()->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; |
+ |
+ DeprecatedPaintLayer* layer = toLayoutBoxModelObject(element.layoutObject())->layer(); |
+ |
+ if (!layer || !layer->isAllowedToQueryCompositingState() |
+ || !layer->compositedDeprecatedPaintLayerMapping() |
+ || !layer->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()) |
+ return false; |
+ |
+ if (!layer->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()->platformLayer()) |
+ return false; |
+ |
+ return true; |
+} |
+ |
+void CompositorAnimations::attachCompositedLayers(const Element& element, const AnimationPlayer& player) |
+{ |
+ ASSERT(element.layoutObject()); |
+ |
+ DeprecatedPaintLayer* layer = toLayoutBoxModelObject(element.layoutObject())->layer(); |
+ ASSERT(layer); |
+ |
+ WebCompositorAnimationPlayer* compositorPlayer = player.compositorPlayer(); |
+ ASSERT(compositorPlayer); |
+ |
+ ASSERT(layer->compositedDeprecatedPaintLayerMapping()); |
+ compositorPlayer->attachLayer(layer->compositedDeprecatedPaintLayerMapping()->mainGraphicsLayer()->platformLayer()); |
} |
// ----------------------------------------------------------------------- |