Index: Source/platform/scroll/ProgrammaticScrollAnimator.cpp |
diff --git a/Source/platform/scroll/ProgrammaticScrollAnimator.cpp b/Source/platform/scroll/ProgrammaticScrollAnimator.cpp |
index 1de1c2a307664d35d6c54faa3c17cc3508d879dc..c7d86e6c06fdb9df690403e28d028c1c23c9c6f1 100644 |
--- a/Source/platform/scroll/ProgrammaticScrollAnimator.cpp |
+++ b/Source/platform/scroll/ProgrammaticScrollAnimator.cpp |
@@ -5,11 +5,14 @@ |
#include "config.h" |
#include "platform/scroll/ProgrammaticScrollAnimator.h" |
+#include "platform/RuntimeEnabledFeatures.h" |
#include "platform/geometry/IntPoint.h" |
#include "platform/graphics/GraphicsLayer.h" |
#include "platform/scroll/ScrollableArea.h" |
#include "public/platform/Platform.h" |
#include "public/platform/WebCompositorAnimation.h" |
+#include "public/platform/WebCompositorAnimationPlayer.h" |
+#include "public/platform/WebCompositorAnimationTimeline.h" |
#include "public/platform/WebCompositorSupport.h" |
#include "public/platform/WebScrollOffsetAnimationCurve.h" |
@@ -27,10 +30,19 @@ ProgrammaticScrollAnimator::ProgrammaticScrollAnimator(ScrollableArea* scrollabl |
, m_compositorAnimationId(0) |
, m_compositorAnimationGroupId(0) |
{ |
+ if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled() && Platform::current()->compositorSupport()) { |
+ m_compositorPlayer = adoptPtr(Platform::current()->compositorSupport()->createAnimationPlayer()); |
+ ASSERT(m_compositorPlayer); |
+ m_compositorPlayer->setAnimationDelegate(this); |
+ } |
} |
ProgrammaticScrollAnimator::~ProgrammaticScrollAnimator() |
{ |
+ if (m_compositorPlayer) { |
+ m_compositorPlayer->setAnimationDelegate(nullptr); |
+ m_compositorPlayer.clear(); |
+ } |
} |
void ProgrammaticScrollAnimator::resetAnimationState() |
@@ -136,8 +148,15 @@ void ProgrammaticScrollAnimator::updateCompositorAnimations() |
// compositor animation that needs to be removed here before the new |
// animation is added below. |
ASSERT(m_runState == RunState::WaitingToCancelOnCompositor || m_runState == RunState::WaitingToSendToCompositor); |
- if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling()) |
- layer->removeAnimation(m_compositorAnimationId); |
+ |
+ if (m_compositorPlayer) { |
+ if (m_compositorPlayer->isLayerAttached()) |
+ m_compositorPlayer->removeAnimation(m_compositorAnimationId); |
+ } else { |
+ if (GraphicsLayer* layer = m_scrollableArea->layerForScrolling()) |
+ layer->removeAnimation(m_compositorAnimationId); |
+ } |
+ |
m_compositorAnimationId = 0; |
m_compositorAnimationGroupId = 0; |
if (m_runState == RunState::WaitingToCancelOnCompositor) { |
@@ -155,7 +174,16 @@ void ProgrammaticScrollAnimator::updateCompositorAnimations() |
int animationId = animation->id(); |
int animationGroupId = animation->group(); |
- if (m_scrollableArea->layerForScrolling()->addAnimation(animation.release())) { |
+ |
+ bool animatonAdded = false; |
Ian Vollick
2015/07/10 03:06:45
nit: animation.
loyso (OOO)
2015/07/22 05:24:23
Done.
|
+ if (m_compositorPlayer && m_compositorPlayer->isLayerAttached()) { |
Ian Vollick
2015/07/10 03:06:45
If we have a compositor player, should we expect t
loyso (OOO)
2015/07/22 05:24:23
If it's not attached, it runs on main thread (!sen
|
+ m_compositorPlayer->addAnimation(animation.leakPtr()); |
+ animatonAdded = true; |
+ } else { |
+ animatonAdded = m_scrollableArea->layerForScrolling()->addAnimation(animation.release()); |
+ } |
+ |
+ if (animatonAdded) { |
sentToCompositor = true; |
m_runState = RunState::RunningOnCompositor; |
m_compositorAnimationId = animationId; |
@@ -174,8 +202,14 @@ void ProgrammaticScrollAnimator::updateCompositorAnimations() |
} |
} |
-void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange() |
+void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange(WebCompositorAnimationTimeline* timeline) |
{ |
+ if (m_compositorPlayer && timeline) { |
+ if (m_compositorPlayer->isLayerAttached()) |
+ m_compositorPlayer->detachLayer(); |
+ timeline->playerDestroyed(*this); |
+ } |
+ |
// If the composited scrolling layer is lost during a composited animation, |
// continue the animation on the main thread. |
if (m_runState == RunState::RunningOnCompositor && !m_scrollableArea->layerForScrolling()) { |
@@ -189,6 +223,11 @@ void ProgrammaticScrollAnimator::layerForCompositedScrollingDidChange() |
notifyPositionChanged(IntPoint(m_targetOffset.x(), m_targetOffset.y())); |
} |
} |
+ |
+ if (m_compositorPlayer && timeline && m_scrollableArea->layerForScrolling()) { |
+ timeline->playerAttached(*this); |
+ m_compositorPlayer->attachLayer(m_scrollableArea->layerForScrolling()->platformLayer()); |
+ } |
} |
void ProgrammaticScrollAnimator::notifyCompositorAnimationFinished(int groupId) |
@@ -212,4 +251,18 @@ void ProgrammaticScrollAnimator::notifyCompositorAnimationFinished(int groupId) |
} |
} |
+void ProgrammaticScrollAnimator::notifyAnimationStarted(double monotonicTime, int group) |
+{ |
+} |
+ |
+void ProgrammaticScrollAnimator::notifyAnimationFinished(double monotonicTime, int group) |
+{ |
+ notifyCompositorAnimationFinished(group); |
+} |
+ |
+WebCompositorAnimationPlayer* ProgrammaticScrollAnimator::compositorPlayer() const |
+{ |
+ return m_compositorPlayer.get(); |
+} |
+ |
} // namespace blink |