193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)/* 293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved. 393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * 493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * modification, are permitted provided that the following conditions are 693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * met: 793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * 893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 1093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 1193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 1293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * in the documentation and/or other materials provided with the 1393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * distribution. 1493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 1593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 1693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * this software without specific prior written permission. 1793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * 1893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) */ 3093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "config.h" 32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/animation/AnimationPlayer.h" 3393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 3451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/animation/Animation.h" 35d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/AnimationTimeline.h" 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Document.h" 37a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/events/AnimationPlayerEvent.h" 38a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "core/frame/UseCounter.h" 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/TraceEvent.h" 40fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch#include "wtf/MathExtras.h" 4193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)namespace { 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static unsigned nextSequenceNumber() 4793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) static unsigned next = 0; 49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return ++next; 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 5393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 54d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtrWillBeRawPtr<AnimationPlayer> AnimationPlayer::create(ExecutionContext* executionContext, AnimationTimeline& timeline, AnimationNode* content) 55d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 569e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) RefPtrWillBeRawPtr<AnimationPlayer> player = adoptRefWillBeNoop(new AnimationPlayer(executionContext, timeline, content)); 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci player->uncancel(); 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci timeline.document()->compositorPendingAnimations().add(player.get()); 59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) player->suspendIfNeeded(); 60d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return player.release(); 61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 62d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 63d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)AnimationPlayer::AnimationPlayer(ExecutionContext* executionContext, AnimationTimeline& timeline, AnimationNode* content) 64d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) : ActiveDOMObject(executionContext) 65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) , m_playbackRate(1) 6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_startTime(nullValue()) 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_holdTime(0) 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_sequenceNumber(nextSequenceNumber()) 6993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) , m_content(content) 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_timeline(&timeline) 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_paused(false) 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_held(true) 73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) , m_isPausedForTesting(false) 74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) , m_outdated(true) 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_finished(true) 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_compositorState(nullptr) 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_compositorPending(true) 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_currentTimePending(false) 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_idle(true) 8093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (m_content) { 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_content->player()) { 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_content->player()->cancel(); 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_content->player()->setSource(0); 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 8683750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch m_content->attach(this); 87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 8893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 8993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)AnimationPlayer::~AnimationPlayer() 9183750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch{ 92d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 9383750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch if (m_content) 9483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch m_content->detach(); 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_timeline) 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_timeline->playerDestroyed(this); 97d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 9883750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch} 9983750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch 100d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::sourceEnd() const 10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 10210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return m_content ? m_content->endTimeInternal() : 0; 10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool AnimationPlayer::limited(double currentTime) const 10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return (m_playbackRate < 0 && currentTime <= 0) || (m_playbackRate > 0 && currentTime >= sourceEnd()); 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setCurrentTimeInternal(double newCurrentTime, TimingUpdateReason reason) 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(std::isfinite(newCurrentTime)); 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) bool oldHeld = m_held; 115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) bool outdated = false; 1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool isLimited = limited(newCurrentTime); 1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_held = m_paused || !m_playbackRate || isLimited || std::isnan(m_startTime); 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_held) { 119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!oldHeld || m_holdTime != newCurrentTime) 120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) outdated = true; 12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_holdTime = newCurrentTime; 1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_paused || !m_playbackRate) { 123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_startTime = nullValue(); 1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (isLimited && std::isnan(m_startTime) && reason == TimingUpdateForAnimationFrame) { 1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = calculateStartTime(newCurrentTime); 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } else { 12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_holdTime = nullValue(); 1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = calculateStartTime(newCurrentTime); 1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(false); 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) outdated = true; 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) } 133c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 134c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (outdated) { 135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) setOutdated(); 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Update timing to reflect updated animation clock due to tick 1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::updateCurrentTimingState(TimingUpdateReason reason) 14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_held) { 1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(m_holdTime, reason); 144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!limited(calculateCurrentTime())) 147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return; 148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_held = true; 149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_holdTime = m_playbackRate < 0 ? 0 : sourceEnd(); 15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::startTime(bool& isNull) const 1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double result = startTime(); 1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci isNull = std::isnan(result); 1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return result; 1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::startTime() const 1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetStartTime); 1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_startTime * 1000; 1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::currentTime(bool& isNull) 1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double result = currentTime(); 1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci isNull = std::isnan(result); 1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return result; 1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 172d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::currentTime() 17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetCurrentTime); 1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_currentTimePending || m_idle) 1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return std::numeric_limits<double>::quiet_NaN(); 17710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return currentTimeInternal() * 1000; 17810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 17910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 18010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochdouble AnimationPlayer::currentTimeInternal() 18110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateCurrentTimingState(TimingUpdateOnDemand); 18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_held) 18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_holdTime; 185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return calculateCurrentTime(); 18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::preCommit(bool startOnCompositor) 1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_compositorState && m_compositorState->pendingAction == Start) { 1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Still waiting for a start time. 1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool softChange = m_compositorState && (paused() || m_compositorState->playbackRate != m_playbackRate); 1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool hardChange = m_compositorState && (m_compositorState->sourceChanged || (m_compositorState->startTime != m_startTime && !std::isnan(m_compositorState->startTime) && !std::isnan(m_startTime))); 1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: softChange && !hardChange should generate a Pause/ThenStart, 1997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // not a Cancel, but we can't communicate these to the compositor yet. 2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool changed = softChange || hardChange; 2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool shouldCancel = (!playing() && m_compositorState) || changed; 2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool shouldStart = playing() && (!m_compositorState || changed); 2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (shouldCancel) { 2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cancelAnimationOnCompositor(); 2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState = nullptr; 2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!shouldStart) { 2127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (shouldStart && startOnCompositor && maybeStartAnimationOnCompositor()) { 2167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState = adoptPtr(new CompositorState(*this)); 2177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::postCommit(double timelineTime) 2217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorPending = false; 2237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_compositorState || m_compositorState->pendingAction == None) 2257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 2267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (m_compositorState->pendingAction) { 2287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Start: 2297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!std::isnan(m_compositorState->startTime)) { 2307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_startTime == m_compositorState->startTime); 2317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState->pendingAction = None; 2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Pause: 2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case PauseThenStart: 2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(std::isnan(m_startTime)); 2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState->pendingAction = None; 2387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal((timelineTime - m_compositorState->startTime) * m_playbackRate, TimingUpdateForAnimationFrame); 2397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 2407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 2427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_NOT_REACHED(); 2437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::notifyCompositorStartTime(double timelineTime) 2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_compositorState) { 2497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_compositorState->pendingAction == Start); 2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(std::isnan(m_compositorState->startTime)); 2517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double initialCompositorHoldTime = m_compositorState->holdTime; 2537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState->pendingAction = None; 254f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch m_compositorState->startTime = timelineTime + currentTimeInternal() / -m_playbackRate; 2557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (paused() || m_compositorState->playbackRate != m_playbackRate || m_compositorState->sourceChanged) { 2577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Paused state, playback rate, or source changed while starting. 2587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 2597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_startTime == timelineTime) { 2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // The start time was set to the incoming compositor start time. 2637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Unlikely, but possible. 2647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Depending on what changed above this might still be pending. 2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Maybe... 2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!std::isnan(m_startTime) || currentTimeInternal() != initialCompositorHoldTime) { 2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // A new start time or current time was set while starting. 2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (playing()) { 2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(std::isnan(m_startTime)); 2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_held); 2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_playbackRate == 0) { 2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setStartTimeInternal(timelineTime); 2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setStartTimeInternal(timelineTime + currentTimeInternal() / -m_playbackRate); 2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: This avoids marking this player as outdated needlessly when a start time 2887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // is notified, but we should refactor how outdating works to avoid this. 2897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_outdated = false; 2907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 2937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::calculateStartTime(double currentTime) const 2967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 2977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_timeline->effectiveTime() - currentTime / m_playbackRate; 2987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 2997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 300c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)double AnimationPlayer::calculateCurrentTime() const 30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 302c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(!m_held); 303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (isNull(m_startTime) || !m_timeline) 304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return 0; 305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return (m_timeline->effectiveTime() - m_startTime) * m_playbackRate; 30610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 30710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void AnimationPlayer::setCurrentTime(double newCurrentTime) 30910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 3107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetCurrentTime); 31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!std::isfinite(newCurrentTime)) 31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand); 31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setStartTime(double startTime) 32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetStartTime); 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_paused || m_idle) 323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!std::isfinite(startTime)) 32509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (startTime == m_startTime) 327a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return; 328c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 3317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setStartTimeInternal(startTime / 1000); 3327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 3337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setStartTimeInternal(double newStartTime) 3357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 3367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!m_paused); 3377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(std::isfinite(newStartTime)); 3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(newStartTime != m_startTime); 3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 340323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) bool hadStartTime = hasStartTime(); 341323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) double previousCurrentTime = currentTimeInternal(); 34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_startTime = newStartTime; 3437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_held && m_playbackRate) { 3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // If held, the start time would still be derrived from the hold time. 3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Force a new, limited, current time. 3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_held = false; 3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double currentTime = calculateCurrentTime(); 3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_playbackRate > 0 && currentTime > sourceEnd()) { 3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci currentTime = sourceEnd(); 3507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else if (m_playbackRate < 0 && currentTime < 0) { 3517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci currentTime = 0; 3527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 3537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(currentTime, TimingUpdateOnDemand); 3547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 355c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) double newCurrentTime = currentTimeInternal(); 356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 357c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (previousCurrentTime != newCurrentTime) { 358323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) setOutdated(); 359323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } else if (!hadStartTime && m_timeline) { 360323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Even though this player is not outdated, time to effect change is 361323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // infinity until start time is set. 362323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_timeline->wake(); 363323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) } 36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::setSource(AnimationNode* newSource) 36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_content == newSource) 36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 3707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(true); 3727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 37310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch double storedCurrentTime = currentTimeInternal(); 37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_content) 37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_content->detach(); 376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_content = newSource; 37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (newSource) { 37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: This logic needs to be updated once groups are implemented 3797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (newSource->player()) { 380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) newSource->player()->cancel(); 3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci newSource->player()->setSource(0); 3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) newSource->attach(this); 3847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setOutdated(); 38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 3867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); 3877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 3887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciString AnimationPlayer::playState() 3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 3917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (playStateInternal()) { 3927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Idle: 3937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return "idle"; 3947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Pending: 3957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return "pending"; 3967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Running: 3977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return "running"; 3987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Paused: 3997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return "paused"; 4007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case Finished: 4017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return "finished"; 4027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci default: 4037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT_NOT_REACHED(); 4047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return ""; 4057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 4067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAnimationPlayer::AnimationPlayState AnimationPlayer::playStateInternal() 4097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_idle) 4117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return Idle; 4127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_currentTimePending || (isNull(m_startTime) && !m_paused && m_playbackRate != 0)) 4137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return Pending; 4147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_paused) 4157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return Paused; 4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (finished()) 4177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return Finished; 4187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return Running; 41909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 42009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::pause() 42209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 42309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_paused) 42409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 4257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (playing()) { 4267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 4277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = true; 4287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 42909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_paused = true; 4307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand); 43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 433d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::unpause() 43409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 43509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_paused) 43609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 4377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = true; 4397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unpauseInternal(); 4407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::unpauseInternal() 4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_paused) 4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 44609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_paused = false; 4477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(currentTimeInternal(), TimingUpdateOnDemand); 44809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 44909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 450d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::play() 45109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!playing()) 4537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = nullValue(); 4547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci uncancel(); 4577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unpauseInternal(); 45809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!m_content) 45909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 46010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch double currentTime = this->currentTimeInternal(); 46109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_playbackRate > 0 && (currentTime < 0 || currentTime >= sourceEnd())) 4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(0, TimingUpdateOnDemand); 46309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else if (m_playbackRate < 0 && (currentTime <= 0 || currentTime > sourceEnd())) 4647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); 4657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(false); 46609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 46709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::reverse() 46909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_playbackRate) { 47109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 47209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci uncancel(); 4757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPlaybackRateInternal(-m_playbackRate); 4767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci play(); 47709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 479d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::finish(ExceptionState& exceptionState) 48009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_playbackRate || m_idle) { 48209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 48309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 4847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infinity()) { 4857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci exceptionState.throwDOMException(InvalidStateError, "AnimationPlayer has source content whose end time is infinity."); 4867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 4877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 4887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (playing()) { 4897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 4907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 4917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci uncancel(); 4937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double newCurrentTime = m_playbackRate < 0 ? 0 : sourceEnd(); 4957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(newCurrentTime, TimingUpdateOnDemand); 4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!paused()) { 4977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = calculateStartTime(newCurrentTime); 4987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 50109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(finished()); 50209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 50309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 504aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochconst AtomicString& AnimationPlayer::interfaceName() const 505aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{ 506aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch return EventTargetNames::AnimationPlayer; 507aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch} 508aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 509aafa69cb17c9d6606c07663ade5f81388a2c5986Ben MurdochExecutionContext* AnimationPlayer::executionContext() const 510aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{ 511d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ActiveDOMObject::executionContext(); 512d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 513d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 514d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool AnimationPlayer::hasPendingActivity() const 515d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 516d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return m_pendingFinishedEvent || (!m_finished && hasEventListeners(EventTypeNames::finish)); 517d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 518d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 519d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::stop() 520d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 5217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(true); 522d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_pendingFinishedEvent = nullptr; 523d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 524d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 525d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)bool AnimationPlayer::dispatchEvent(PassRefPtrWillBeRawPtr<Event> event) 526d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 527d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (m_pendingFinishedEvent == event) 528d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_pendingFinishedEvent = nullptr; 529d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return EventTargetWithInlineData::dispatchEvent(event); 530aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch} 531aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 5327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble AnimationPlayer::playbackRate() const 5337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 5347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerGetPlaybackRate); 5357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_playbackRate; 5367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 5377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 538d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::setPlaybackRate(double playbackRate) 53909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 5407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UseCounter::count(executionContext(), UseCounter::AnimationPlayerSetPlaybackRate); 54109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!std::isfinite(playbackRate)) 54209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return; 5437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (playbackRate == m_playbackRate) 5447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 5457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPlaybackRateInternal(playbackRate); 5477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 5487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setPlaybackRateInternal(double playbackRate) 5507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 5517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(std::isfinite(playbackRate)); 5527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(playbackRate != m_playbackRate); 5537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 5547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 5557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!finished() && !paused() && hasStartTime()) 5567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = true; 5577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 55810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch double storedCurrentTime = currentTimeInternal(); 559a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if ((m_playbackRate < 0 && playbackRate >= 0) || (m_playbackRate > 0 && playbackRate <= 0)) 5607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(false); 5617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_playbackRate = playbackRate; 5637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = std::numeric_limits<double>::quiet_NaN(); 5647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(storedCurrentTime, TimingUpdateOnDemand); 56509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 56609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::setOutdated() 56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 569d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_outdated = true; 57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_timeline) 571d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_timeline->setOutdatedAnimationPlayer(this); 57251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 57351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 57410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool AnimationPlayer::canStartAnimationOnCompositor() 57551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 576fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch if (m_playbackRate == 0 || (std::isinf(sourceEnd()) && m_playbackRate < 0)) 577a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return false; 578a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 5797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_timeline && m_content && m_content->isAnimation() && playing(); 58010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 58110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 58210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool AnimationPlayer::maybeStartAnimationOnCompositor() 58310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 58410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!canStartAnimationOnCompositor()) 58551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return false; 58651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 587f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch bool reversed = m_playbackRate < 0; 588f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch 5897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double startTime = timeline()->zeroTime() + startTimeInternal(); 590f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch if (reversed) { 591f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch startTime -= sourceEnd() / fabs(m_playbackRate); 592f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch } 593f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch 5947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double timeOffset = 0; 5957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (std::isnan(startTime)) { 596f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch timeOffset = reversed ? sourceEnd() - currentTimeInternal() : currentTimeInternal(); 597fdbb120d0a4a87db74bcb608de226c85a7d1c920Ben Murdoch timeOffset = timeOffset / fabs(m_playbackRate); 5987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 5997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return toAnimation(m_content.get())->maybeStartAnimationOnCompositor(startTime, timeOffset, m_playbackRate); 60010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch} 60110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setCompositorPending(bool sourceChanged) 60310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{ 6047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: Animation could notify this directly? 6057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!hasActiveAnimationsOnCompositor()) { 6067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState.release(); 6077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 6087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_compositorPending) { 6097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorPending = true; 6107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (sourceChanged && m_compositorState) 6117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_compositorState->sourceChanged = true; 61210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch timeline()->document()->compositorPendingAnimations().add(this); 6137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 61451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 61551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool AnimationPlayer::hasActiveAnimationsOnCompositor() 61751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 61851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!m_content || !m_content->isAnimation()) 61951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return false; 62010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch 62151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return toAnimation(m_content.get())->hasActiveAnimationsOnCompositor(); 62251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 62351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 624d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::cancelAnimationOnCompositor() 62551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 62651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (hasActiveAnimationsOnCompositor()) 62751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) toAnimation(m_content.get())->cancelAnimationOnCompositor(); 62893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 62993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 630323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool AnimationPlayer::update(TimingUpdateReason reason) 63193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){ 6326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (!m_timeline) 63393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return false; 63493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 6357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateCurrentTimingState(reason); 636c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_outdated = false; 637c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 6386f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (m_content) { 6397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double inheritedTime = m_idle || isNull(m_timeline->currentTimeInternal()) ? nullValue() : currentTimeInternal(); 6407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Special case for end-exclusivity when playing backwards. 6417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (inheritedTime == 0 && m_playbackRate < 0) 6427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci inheritedTime = -1; 643323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_content->updateInheritedTime(inheritedTime, reason); 6446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 64509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if ((m_idle || finished()) && !m_finished) { 6477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (reason == TimingUpdateForAnimationFrame && (m_idle || hasStartTime())) { 648323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) const AtomicString& eventType = EventTypeNames::finish; 649323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) if (executionContext() && hasEventListeners(eventType)) { 6507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci double eventCurrentTime = currentTimeInternal() * 1000; 6517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_pendingFinishedEvent = AnimationPlayerEvent::create(eventType, eventCurrentTime, timeline()->currentTime()); 652d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_pendingFinishedEvent->setTarget(this); 653d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_pendingFinishedEvent->setCurrentTarget(this); 654d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_timeline->document()->enqueueAnimationFrameEvent(m_pendingFinishedEvent); 6556f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 6567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(true); 657a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 658a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch } 6596f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ASSERT(!m_outdated); 6607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return !m_finished; 66193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 66293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 663d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)double AnimationPlayer::timeToEffectChange() 66409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(!m_outdated); 6666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (m_held || !hasStartTime()) 66709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return std::numeric_limits<double>::infinity(); 6686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (!m_content) 66910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch return -currentTimeInternal() / m_playbackRate; 67009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_playbackRate > 0) 67109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return m_content->timeToForwardsEffectChange() / m_playbackRate; 6726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return m_content->timeToReverseEffectChange() / -m_playbackRate; 67309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 67409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::setFinished(bool finished) 6767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 6777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_finished && !finished) { 6787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_content) { 6797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_EVENT_ASYNC_BEGIN1("blink", "Animation", this, "Name", TRACE_STR_COPY(m_content->name().utf8().data())); 6807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } else { 6817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_EVENT_ASYNC_BEGIN0("blink", "Animation", this); 6827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 6837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 6847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_finished && finished) { 6857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_EVENT_ASYNC_END0("blink", "Animation", this); 6867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 6877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_finished = finished; 6887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 6897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 690d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::cancel() 691f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){ 6927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_idle) 6937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 6947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 6957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_holdTime = currentTimeInternal(); 6967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_held = true; 6977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_idle = true; 6987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_startTime = nullValue(); 6997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_currentTimePending = false; 7007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCompositorPending(); 7017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 7027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid AnimationPlayer::uncancel() 7047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 7057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!m_idle) 7067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 7077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 7087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_idle = false; 7097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_held = true; 7107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_holdTime = 0; 7117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setFinished(false); 712d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 713d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 7147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 715d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN) 7166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochbool AnimationPlayer::canFree() const 7176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 7186f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ASSERT(m_content); 7196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return hasOneRef() && m_content->isAnimation() && m_content->hasOneRef(); 7206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch} 721d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif 7226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 723a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool AnimationPlayer::addEventListener(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture) 724a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{ 725a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch if (eventType == EventTypeNames::finish) 726a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch UseCounter::count(executionContext(), UseCounter::AnimationPlayerFinishEvent); 727a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return EventTargetWithInlineData::addEventListener(eventType, listener, useCapture); 728a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 729a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch 730d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void AnimationPlayer::pauseForTesting(double pauseTime) 731f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){ 73251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) RELEASE_ASSERT(!paused()); 7337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setCurrentTimeInternal(pauseTime, TimingUpdateOnDemand); 7347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (hasActiveAnimationsOnCompositor()) 73510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch toAnimation(m_content.get())->pauseAnimationForTestingOnCompositor(currentTimeInternal()); 736f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) m_isPausedForTesting = true; 73709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) pause(); 73893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} 73993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 740d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void AnimationPlayer::trace(Visitor* visitor) 741d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 742d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_content); 743d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_timeline); 744d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) visitor->trace(m_pendingFinishedEvent); 745d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) EventTargetWithInlineData::trace(visitor); 746d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 747d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 74893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)} // namespace 749