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

Unified Diff: Source/platform/scroll/ProgrammaticScrollAnimator.cpp

Issue 1133513002: Animations: Port ProgrammaticScrollAnimator to use compositor timelines (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@linkhigh
Patch Set: Rebase. Created 5 years, 5 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/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

Powered by Google App Engine
This is Rietveld 408576698