Chromium Code Reviews| 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 |