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

Side by Side Diff: Source/core/animation/AnimationPlayer.cpp

Issue 961993003: Web Animations: Fix Player's timing update when source content becomes longer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: test Created 5 years, 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/animation/AnimationPlayer.h ('k') | Source/core/animation/css/CSSAnimations.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 159
160 if (outdated) { 160 if (outdated) {
161 setOutdated(); 161 setOutdated();
162 } 162 }
163 } 163 }
164 164
165 // Update timing to reflect updated animation clock due to tick 165 // Update timing to reflect updated animation clock due to tick
166 void AnimationPlayer::updateCurrentTimingState(TimingUpdateReason reason) 166 void AnimationPlayer::updateCurrentTimingState(TimingUpdateReason reason)
167 { 167 {
168 if (m_held) { 168 if (m_held) {
169 // Add hystersis due to floating point error accumulation 169 double newCurrentTime = m_holdTime;
170 if (!isNull(m_startTime) && m_timeline && !limited(calculateCurrentTime( ) + 0.001 * m_playbackRate) && playStateInternal() == Finished) { 170 if (playStateInternal() == Finished && !isNull(m_startTime) && m_timelin e) {
171 m_held = false; 171 // Add hystersis due to floating point error accumulation
172 setCurrentTimeInternal(calculateCurrentTime(), reason); 172 if (!limited(calculateCurrentTime() + 0.001 * m_playbackRate)) {
173 return; 173 // The current time became unlimited, eg. due to a backwards
174 // seek of the timeline.
175 newCurrentTime = calculateCurrentTime();
176 } else if (!limited(m_holdTime)) {
177 // The hold time became unlimited, eg. due to the source content
178 // becoming longer.
179 newCurrentTime = clampTo<double>(calculateCurrentTime(), 0, sour ceEnd());
180 }
174 } 181 }
175 setCurrentTimeInternal(m_holdTime, reason); 182 setCurrentTimeInternal(newCurrentTime, reason);
176 return; 183 } else if (limited(calculateCurrentTime())) {
184 m_held = true;
185 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd();
177 } 186 }
178 if (!limited(calculateCurrentTime()))
179 return;
180 m_held = true;
181 m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd();
182 } 187 }
183 188
184 double AnimationPlayer::startTime(bool& isNull) const 189 double AnimationPlayer::startTime(bool& isNull) const
185 { 190 {
186 double result = startTime(); 191 double result = startTime();
187 isNull = std::isnan(result); 192 isNull = std::isnan(result);
188 return result; 193 return result;
189 } 194 }
190 195
191 double AnimationPlayer::startTime() const 196 double AnimationPlayer::startTime() const
(...skipping 23 matching lines...) Expand all
215 double AnimationPlayer::currentTimeInternal() const 220 double AnimationPlayer::currentTimeInternal() const
216 { 221 {
217 double result = m_held ? m_holdTime : calculateCurrentTime(); 222 double result = m_held ? m_holdTime : calculateCurrentTime();
218 #if ENABLE(ASSERT) 223 #if ENABLE(ASSERT)
219 const_cast<AnimationPlayer*>(this)->updateCurrentTimingState(TimingUpdateOnD emand); 224 const_cast<AnimationPlayer*>(this)->updateCurrentTimingState(TimingUpdateOnD emand);
220 ASSERT(result == (m_held ? m_holdTime : calculateCurrentTime())); 225 ASSERT(result == (m_held ? m_holdTime : calculateCurrentTime()));
221 #endif 226 #endif
222 return result; 227 return result;
223 } 228 }
224 229
230 double AnimationPlayer::unlimitedCurrentTimeInternal() const
231 {
232 #if ENABLE(ASSERT)
233 currentTimeInternal();
234 #endif
235 return playStateInternal() == Paused || isNull(m_startTime)
236 ? currentTimeInternal()
237 : calculateCurrentTime();
238 }
239
225 void AnimationPlayer::preCommit(int compositorGroup, bool startOnCompositor) 240 void AnimationPlayer::preCommit(int compositorGroup, bool startOnCompositor)
226 { 241 {
227 PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand, DoNotSetCompos itorPending); 242 PlayStateUpdateScope updateScope(*this, TimingUpdateOnDemand, DoNotSetCompos itorPending);
228 243
229 bool softChange = m_compositorState && (paused() || m_compositorState->playb ackRate != m_playbackRate); 244 bool softChange = m_compositorState && (paused() || m_compositorState->playb ackRate != m_playbackRate);
230 bool hardChange = m_compositorState && (m_compositorState->sourceChanged || m_compositorState->startTime != m_startTime); 245 bool hardChange = m_compositorState && (m_compositorState->sourceChanged || m_compositorState->startTime != m_startTime);
231 246
232 // FIXME: softChange && !hardChange should generate a Pause/ThenStart, 247 // FIXME: softChange && !hardChange should generate a Pause/ThenStart,
233 // not a Cancel, but we can't communicate these to the compositor yet. 248 // not a Cancel, but we can't communicate these to the compositor yet.
234 249
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 visitor->trace(m_content); 945 visitor->trace(m_content);
931 visitor->trace(m_timeline); 946 visitor->trace(m_timeline);
932 visitor->trace(m_pendingFinishedEvent); 947 visitor->trace(m_pendingFinishedEvent);
933 visitor->trace(m_finishedPromise); 948 visitor->trace(m_finishedPromise);
934 visitor->trace(m_readyPromise); 949 visitor->trace(m_readyPromise);
935 EventTargetWithInlineData::trace(visitor); 950 EventTargetWithInlineData::trace(visitor);
936 ActiveDOMObject::trace(visitor); 951 ActiveDOMObject::trace(visitor);
937 } 952 }
938 953
939 } // namespace 954 } // namespace
OLDNEW
« no previous file with comments | « Source/core/animation/AnimationPlayer.h ('k') | Source/core/animation/css/CSSAnimations.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698