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

Unified Diff: Source/core/animation/CompositorAnimations.cpp

Issue 946323002: Animations: Introduce compositor AnimationPlayer and AnimationTimeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Format. Created 5 years, 9 months 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 side-by-side diff with in-line comments
Download patch
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());
}
// -----------------------------------------------------------------------
« no previous file with comments | « Source/core/animation/CompositorAnimations.h ('k') | Source/core/layout/compositing/DeprecatedPaintLayerCompositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698