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

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

Issue 23874019: Web Animations CSS: Start running animations on the compositor (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Cleanup isRunning* and shouldCompositeForAnimation Created 7 years, 1 month 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/Animation.cpp
diff --git a/Source/core/animation/Animation.cpp b/Source/core/animation/Animation.cpp
index 37715b2c7c078f8c8db951c3607040a4a8d75178..6e8f93b5310951781701df809f089200d2dcaa7f 100644
--- a/Source/core/animation/Animation.cpp
+++ b/Source/core/animation/Animation.cpp
@@ -32,6 +32,8 @@
#include "core/animation/Animation.h"
#include "core/animation/ActiveAnimations.h"
+#include "core/animation/CompositorAnimations.h"
+#include "core/animation/KeyframeAnimationEffect.h"
#include "core/animation/Player.h"
#include "core/dom/Element.h"
@@ -61,7 +63,6 @@ void Animation::willDetach()
{
if (m_target)
m_target->activeAnimations()->players().remove(player());
-
if (m_activeInAnimationStack)
clearEffects();
}
@@ -92,6 +93,7 @@ void Animation::clearEffects()
ASSERT(player());
ASSERT(m_activeInAnimationStack);
ensureAnimationStack(m_target.get()).remove(this);
+ cancelCompositorAnimations();
m_activeInAnimationStack = false;
m_compositableValues.clear();
m_target->setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer);
@@ -112,14 +114,18 @@ bool Animation::updateChildrenAndEffects() const
return false;
}
-double Animation::calculateTimeToEffectChange(double localTime, double) const
+double Animation::calculateTimeToEffectChange(double localTime, double timeToNextIteration) const
{
const double activeStartTime = startTime() + specified().startDelay;
-
switch (phase()) {
case PhaseBefore:
return activeStartTime - localTime;
case PhaseActive:
+ if (isRunningCompositorAnimation()) {
+ // Need service to apply fill / fire events.
+ const double activeEndTime = activeStartTime + activeDuration();
+ return isNull(timeToNextIteration) ? activeEndTime - localTime : timeToNextIteration;
Steve Block 2013/11/18 05:03:03 Does this assume that timeToNextIteration is alway
dstockwell 2013/11/18 06:11:20 Done.
+ }
return 0;
case PhaseAfter:
// If this Animation is still in effect then it will need to update
@@ -133,4 +139,52 @@ double Animation::calculateTimeToEffectChange(double localTime, double) const
}
}
+bool Animation::isCandidateForCompositorAnimation() const
+{
+ if (!effect() || !m_target)
+ return false;
+ return CompositorAnimations::instance()->isCandidateForCompositorAnimation(specified(), *effect());
+}
+
+bool Animation::startCompositorAnimations()
+{
+ ASSERT(!isRunningCompositorAnimation());
+ if (!isCandidateForCompositorAnimation())
+ return false;
+ if (!CompositorAnimations::instance()->canStartCompositorAnimation(*m_target.get()))
+ return false;
+ if (CompositorAnimations::instance()->startCompositorAnimation(*m_target.get(), specified(), *effect(), m_acceleratedAnimationIds)) {
Steve Block 2013/11/18 05:03:03 Given that startCompositorAnimation() returns a ve
dstockwell 2013/11/18 06:11:20 Done.
+ ASSERT(!m_acceleratedAnimationIds.isEmpty());
+ return true;
Steve Block 2013/11/18 05:03:03 Can you invert this 'if' to make all the early-out
dstockwell 2013/11/18 06:11:20 Done.
+ }
+ return false;
+}
+
+bool Animation::isRunningCompositorAnimation() const
+{
+ return !m_acceleratedAnimationIds.isEmpty();
+}
+
+bool Animation::isRunningCompositorAnimation(CSSPropertyID property) const
+{
+ return isRunningCompositorAnimation() && affects(property);
+}
+
+bool Animation::affects(CSSPropertyID property) const
+{
+ return toKeyframeAnimationEffect(m_effect.get())->affects(property);
Steve Block 2013/11/18 05:03:03 Hmm, why isn't affects() on AnimationEffect, rathe
dstockwell 2013/11/18 06:11:20 Done.
+}
+
+void Animation::cancelCompositorAnimations()
+{
+ if (!isRunningCompositorAnimation())
+ return;
+ if (!m_target || !m_target->renderer())
+ return;
+ for (size_t i = 0; i < m_acceleratedAnimationIds.size(); ++i) {
+ CompositorAnimations::instance()->cancelCompositorAnimation(*m_target.get(), m_acceleratedAnimationIds[i]);
+ }
+ m_acceleratedAnimationIds.clear();
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698