Chromium Code Reviews| Index: Source/core/animation/AnimationClock.cpp |
| diff --git a/Source/core/animation/AnimationClock.cpp b/Source/core/animation/AnimationClock.cpp |
| index 649220690e67a27adf18592ac5d9a46d000c9ff2..3faae36ec8297090a7c285fa5f9ed8c245a23b71 100644 |
| --- a/Source/core/animation/AnimationClock.cpp |
| +++ b/Source/core/animation/AnimationClock.cpp |
| @@ -28,26 +28,52 @@ |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| +#include <math.h> |
| #include "config.h" |
| #include "core/animation/AnimationClock.h" |
| +#include "wtf/CurrentTime.h" |
| + |
| +namespace { |
| + |
| +// FIXME: This is an approximation of time between frames, used when |
| +// ticking the animation clock outside of animation frame callbacks. |
| +// Ideally this would be generated by the compositor. |
| +const double approximateFrameTime = 1 / 60.0; |
| + |
| +} |
| namespace WebCore { |
| +unsigned AnimationClock::s_currentTask = 0; |
| + |
| void AnimationClock::updateTime(double time) |
| { |
| if (time > m_time) |
| m_time = time; |
| - m_frozen = true; |
| + m_currentTask = s_currentTask; |
| } |
| double AnimationClock::currentTime() |
| { |
| - if (!m_frozen) { |
| - double newTime = m_monotonicallyIncreasingTime(); |
| - if (newTime >= m_time + minTimeBeforeUnsynchronizedAnimationClockTick) |
| - m_time = newTime; |
| + if (m_currentTask != s_currentTask) { |
| + double currentTime = m_monotonicallyIncreasingTime(); |
| + if (m_time < currentTime) { |
|
esprehn
2014/05/07 06:07:06
How can the currentTime ever be less than m_time?
dstockwell
2014/05/07 06:14:48
Because we're advancing to the *next* frame time.
|
| + // Advance to the first estimated frame at or after the current time. |
| + unsigned advanceCount = ceil((currentTime - m_time) / approximateFrameTime); |
| + double newTime = m_time + advanceCount * approximateFrameTime; |
| + ASSERT(newTime >= currentTime); |
| + ASSERT(newTime <= currentTime + approximateFrameTime); |
| + updateTime(newTime); |
| + } |
| } |
| return m_time; |
| } |
| +void AnimationClock::resetTimeForTesting() |
| +{ |
| + m_time = 0; |
| + m_currentTask = 0; |
| + s_currentTask = 0; |
| +} |
| + |
| } |