X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fanimated-vector-image%2Fvector-animation-task.cpp;h=2f29ac0236475a5dbc86ef61c1cc1732e0ec7ad9;hp=d9d6d5aeafea14e079f270ae4c272216926c809c;hb=84e46fe870f4ae2f7dbbda3b789735c388235544;hpb=748ee13d35cadcf27bb10bd1d82e44db2d707838 diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp index d9d6d5a..2f29ac0 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp @@ -37,7 +37,7 @@ namespace Internal namespace { constexpr auto LOOP_FOREVER = -1; -constexpr auto NANOSECONDS_PER_SECOND(1e+9); +constexpr auto MICROSECONDS_PER_SECOND(1e+6); #if defined(DEBUG_ENABLED) Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_VECTOR_ANIMATION"); @@ -56,12 +56,13 @@ VectorAnimationTask::VectorAnimationTask(VisualFactoryCache& factoryCache) mStopBehavior(DevelImageVisual::StopBehavior::CURRENT_FRAME), mLoopingMode(DevelImageVisual::LoopingMode::RESTART), mNextFrameStartTime(), - mFrameDurationNanoSeconds(0), + mFrameDurationMicroSeconds(MICROSECONDS_PER_SECOND / 60.0f), mFrameRate(60.0f), mCurrentFrame(0), mTotalFrame(0), mStartFrame(0), mEndFrame(0), + mDroppedFrames(0), mWidth(0), mHeight(0), mAnimationDataIndex(0), @@ -109,8 +110,8 @@ bool VectorAnimationTask::Load(const std::string& url) mEndFrame = mTotalFrame - 1; - mFrameRate = mVectorRenderer.GetFrameRate(); - mFrameDurationNanoSeconds = NANOSECONDS_PER_SECOND / mFrameRate; + mFrameRate = mVectorRenderer.GetFrameRate(); + mFrameDurationMicroSeconds = MICROSECONDS_PER_SECOND / mFrameRate; uint32_t width, height; mVectorRenderer.GetDefaultSize(width, height); @@ -387,7 +388,7 @@ bool VectorAnimationTask::Rasterize() if(mPlayState == PlayState::PLAYING && mUpdateFrameNumber) { - mCurrentFrame = mForward ? mCurrentFrame + 1 : mCurrentFrame - 1; + mCurrentFrame = mForward ? mCurrentFrame + mDroppedFrames + 1 : mCurrentFrame - mDroppedFrames - 1; Dali::ClampInPlace(mCurrentFrame, mStartFrame, mEndFrame); } @@ -521,22 +522,36 @@ uint32_t VectorAnimationTask::GetStoppedFrame(uint32_t startFrame, uint32_t endF return frame; } -std::chrono::time_point VectorAnimationTask::CalculateNextFrameTime(bool renderNow) +VectorAnimationTask::TimePoint VectorAnimationTask::CalculateNextFrameTime(bool renderNow) { // std::chrono::time_point template has second parameter duration which defaults to the std::chrono::system_clock supported // duration. In some C++11 implementations it is a milliseconds duration, so it fails to compile unless mNextFrameStartTime // is casted to use the default duration. - mNextFrameStartTime = std::chrono::time_point_cast::duration>( - mNextFrameStartTime + std::chrono::nanoseconds(mFrameDurationNanoSeconds)); - auto current = std::chrono::system_clock::now(); - if(renderNow || mNextFrameStartTime < current) + mNextFrameStartTime = std::chrono::time_point_cast(mNextFrameStartTime + std::chrono::microseconds(mFrameDurationMicroSeconds)); + auto current = std::chrono::system_clock::now(); + if(renderNow) { mNextFrameStartTime = current; + mDroppedFrames = 0; } + else if(mNextFrameStartTime < current) + { + uint32_t droppedFrames = 0; + + while(current > std::chrono::time_point_cast(mNextFrameStartTime + std::chrono::microseconds(mFrameDurationMicroSeconds)) && droppedFrames < mTotalFrame) + { + droppedFrames++; + mNextFrameStartTime = std::chrono::time_point_cast(mNextFrameStartTime + std::chrono::microseconds(mFrameDurationMicroSeconds)); + } + + mNextFrameStartTime = current; + mDroppedFrames = droppedFrames; + } + return mNextFrameStartTime; } -std::chrono::time_point VectorAnimationTask::GetNextFrameTime() +VectorAnimationTask::TimePoint VectorAnimationTask::GetNextFrameTime() { return mNextFrameStartTime; }