Index: Source/core/animation/AnimationTimeline.cpp |
diff --git a/Source/core/animation/AnimationTimeline.cpp b/Source/core/animation/AnimationTimeline.cpp |
index 725edd1987b2ccee0a632405c42dbb9b500fd267..643a29e0c26a01abc53642435d015adc5d1c6f4a 100644 |
--- a/Source/core/animation/AnimationTimeline.cpp |
+++ b/Source/core/animation/AnimationTimeline.cpp |
@@ -63,6 +63,9 @@ PassRefPtrWillBeRawPtr<AnimationTimeline> AnimationTimeline::create(Document* do |
AnimationTimeline::AnimationTimeline(Document* document, PassOwnPtrWillBeRawPtr<PlatformTiming> timing) |
: m_document(document) |
, m_zeroTime(0) |
+ , m_currentTimeSnapshot(0) |
+ , m_rawCurrentTimeSnapshot(0) |
+ , m_playbackRate(1) |
{ |
if (!timing) |
m_timing = adoptPtrWillBeNoop(new AnimationTimelineTiming(this)); |
@@ -184,7 +187,8 @@ double AnimationTimeline::currentTimeInternal(bool& isNull) |
isNull = true; |
return std::numeric_limits<double>::quiet_NaN(); |
} |
- double result = m_document->animationClock().currentTime() - zeroTime(); |
+ // New currentTime = currentTime when the playback rate was last changed + time delta since then * playback rate |
+ double result = m_currentTimeSnapshot + (m_document->animationClock().currentTime() - m_rawCurrentTimeSnapshot - zeroTime()) * playbackRate(); |
isNull = std::isnan(result); |
return result; |
} |
@@ -230,6 +234,19 @@ void AnimationTimeline::setOutdatedAnimationPlayer(AnimationPlayer* player) |
m_timing->serviceOnNextFrame(); |
} |
+void AnimationTimeline::setPlaybackRate(double playbackRate) |
+{ |
+ // FIXME: need to invalidate compositor animations |
+ m_currentTimeSnapshot = currentTimeInternal(); |
+ m_rawCurrentTimeSnapshot = m_document->animationClock().currentTime() - zeroTime(); |
+ m_playbackRate = playbackRate; |
+} |
+ |
+double AnimationTimeline::playbackRate() const |
+{ |
+ return m_playbackRate; |
+} |
+ |
#if !ENABLE(OILPAN) |
void AnimationTimeline::detachFromDocument() |
{ |