-float VectorRasterizeThread::GetCurrentProgress() const
-{
- return ( static_cast< float >( mCurrentFrame ) / static_cast< float >( mTotalFrame ) );
-}
-
-DevelImageVisual::PlayState VectorRasterizeThread::GetPlayState() const
-{
- return mPlayState;
-}
-
-bool VectorRasterizeThread::IsResourceReady() const
-{
- return mResourceReady;
-}
-
-bool VectorRasterizeThread::IsThreadReady()
-{
- ConditionalWait::ScopedLock lock( mConditionalWait );
-
- if( mPlayState != DevelImageVisual::PlayState::PLAYING && !mNeedRender && !mDestroyThread )
- {
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::IsThreadReady: Wait\n" );
-
- mConditionalWait.Wait( lock );
- }
-
- // Keep the thread alive if this thread is NOT to be destroyed
- return !mDestroyThread;
-}
-
-bool VectorRasterizeThread::StartRender()
-{
- //TODO: check the return value
- mVectorRenderer.StartRender();
-
- mTotalFrame = mVectorRenderer.GetTotalFrameNumber();
-
- mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f );
- mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f );
-
- mCurrentFrame = std::max( static_cast< uint32_t >( mTotalFrame * mProgress + 0.5f ), mStartFrame );
-
- mFrameRate = mVectorRenderer.GetFrameRate();
- mFrameDurationNanoSeconds = NANOSECONDS_PER_SECOND / mFrameRate;
-
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d, %f fps]\n", mTotalFrame, mFrameRate );
-
- return true;
-}
-
-void VectorRasterizeThread::Rasterize()
-{
- bool needRender, resourceReady;
-
- {
- ConditionalWait::ScopedLock lock( mConditionalWait );
- needRender = mNeedRender;
- resourceReady = mResourceReady;
- }
-
- auto currentFrameStartTime = std::chrono::system_clock::now();
-
- // Rasterize
- mVectorRenderer.Render( mCurrentFrame );
-
- if( mPlayState == DevelImageVisual::PlayState::PLAYING )
- {
- if( ++mCurrentFrame >= mEndFrame )
- {
- if( mLoopCount < 0 )
- {
- // repeat forever
- mCurrentFrame = mStartFrame;
- }
- else
- {
- mCurrentLoop++;
- if( mCurrentLoop >= mLoopCount )
- {
- // Animation is finished
- mPlayState = DevelImageVisual::PlayState::STOPPED;
-
- // Reset the current frame and the current loop
- mCurrentFrame = mStartFrame;
- mCurrentLoop = 0;
-
- mAnimationFinishedTrigger->Trigger();
-
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: Animation is finished\n" );
- }
- else
- {
- mCurrentFrame = mStartFrame;
- }
- }
- }
- }
-
- if( needRender )
- {
- mNeedRender = false;
- }
-
- if( !resourceReady )
- {
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: Resource ready trigger\n" );
-
- mResourceReadyTrigger->Trigger();
- mResourceReady = true;
- }
-
- auto timeToSleepUntil = currentFrameStartTime + std::chrono::nanoseconds( mFrameDurationNanoSeconds );
-
-#if defined(DEBUG_ENABLED)
- auto sleepDuration = std::chrono::duration_cast< std::chrono::milliseconds >( timeToSleepUntil - std::chrono::system_clock::now() );
-
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [current = %d, sleep duration = %lld]\n", mCurrentFrame, sleepDuration.count() );
-#endif
-
- std::this_thread::sleep_until( timeToSleepUntil );
-}
-