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-rasterize-thread.cpp;h=a640b19cccb819063e6c3c40879294a4beca9313;hp=52c65414f5cef8016a84e69b2118bd0c2694b1fe;hb=2c6a6697e24d39ef061f134b39f30acc5c47b0cb;hpb=3ca7994488b0b5e21bbb0d262c5fa2e4c731308b diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp index 52c6541..a640b19 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,8 @@ #include #include #include - -// INTERNAL INCLUDES +#include +#include namespace Dali { @@ -37,37 +37,20 @@ namespace Internal namespace { -constexpr auto LOOP_FOREVER = -1; - #if defined(DEBUG_ENABLED) Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" ); #endif } // unnamed namespace -VectorRasterizeThread::VectorRasterizeThread( const std::string& url, Renderer renderer, uint32_t width, uint32_t height ) -: mUrl( url ), - mVectorRenderer(), +VectorRasterizeThread::VectorRasterizeThread() +: mRasterizeTasks(), mConditionalWait(), - mMutex(), - mResourceReadyTrigger( NULL ), - mPlayRange( 0.0f, 1.0f ), - mCurrentFrame( 0 ), - mTotalFrame( 0 ), - mStartFrame( 0 ), - mEndFrame( 0 ), - mWidth( width ), - mHeight( height ), - mLoopCount( LOOP_FOREVER ), - mCurrentLoop( 0 ), - mNeedRender( false ), - mPlaying( false ), - mPaused( false ), + mCompletedCallback(), mDestroyThread( false ), - mResourceReady( false ), + mIsThreadStarted( false ), mLogFactory( Dali::Adaptor::Get().GetLogFactory() ) { - mVectorRenderer = VectorAnimationRenderer::New( mUrl, renderer, width, height ); } VectorRasterizeThread::~VectorRasterizeThread() @@ -77,205 +60,81 @@ VectorRasterizeThread::~VectorRasterizeThread() ConditionalWait::ScopedLock lock( mConditionalWait ); mDestroyThread = true; mConditionalWait.Notify( lock ); - - // This should be called in the main thread to stop waiting for the dequeuable buffer. - mVectorRenderer.StopRender(); } - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::~VectorRasterizeThread: Join\n" ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::~VectorRasterizeThread: Join [%p]\n", this ); Join(); - - delete mResourceReadyTrigger; } -void VectorRasterizeThread::Run() -{ - SetThreadName( "VectorImageThread" ); - mLogFactory.InstallLogFunction(); - - //TODO: check the return value - StartRender(); - - while( IsThreadReady() ) - { - Rasterize(); - } -} - -void VectorRasterizeThread::SetSize( uint32_t width, uint32_t height ) +void VectorRasterizeThread::SetCompletedCallback( CallbackBase* callback ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mVectorRenderer.SetSize( width, height ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetSize: width = %d, height = %d\n", width, height ); + mCompletedCallback = std::unique_ptr< CallbackBase >( callback ); } -void VectorRasterizeThread::StartAnimation() +void VectorRasterizeThread::AddTask( VectorAnimationTaskPtr task ) { - ConditionalWait::ScopedLock lock( mConditionalWait ); - if( !mPlaying ) + if( !mIsThreadStarted ) { - mPlaying = true; - mPaused = false; - mConditionalWait.Notify( lock ); - - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartAnimation: Start\n" ); + Start(); + mIsThreadStarted = true; } -} -void VectorRasterizeThread::StopAnimation() -{ + // Lock while adding task to the queue ConditionalWait::ScopedLock lock( mConditionalWait ); - if( mPlaying ) - { - mPlaying = false; - mPaused = false; - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StopAnimation: Stop\n" ); - } -} - -void VectorRasterizeThread::PauseAnimation() -{ - ConditionalWait::ScopedLock lock( mConditionalWait ); - if( mPlaying && !mPaused ) + if( mRasterizeTasks.end() == std::find( mRasterizeTasks.begin(), mRasterizeTasks.end(), task ) ) { - mPaused = true; + mRasterizeTasks.push_back( task ); - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::PauseAnimation: Pause\n" ); - } -} - -void VectorRasterizeThread::ResumeAnimation() -{ - ConditionalWait::ScopedLock lock( mConditionalWait ); - if( mPlaying && mPaused ) - { - mPaused = false; + // wake up the animation thread mConditionalWait.Notify( lock ); - - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::ResumeAnimation: Resume\n" ); } } -void VectorRasterizeThread::RenderFrame() -{ - ConditionalWait::ScopedLock lock( mConditionalWait ); - mNeedRender = true; - mConditionalWait.Notify( lock ); - - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::RenderFrame: Render\n" ); -} - -void VectorRasterizeThread::SetResourceReadyCallback( EventThreadCallback* callback ) -{ - ConditionalWait::ScopedLock lock( mConditionalWait ); - mResourceReadyTrigger = callback; -} - -void VectorRasterizeThread::SetLoopCount( int16_t count ) -{ - ConditionalWait::ScopedLock lock( mConditionalWait ); - - mLoopCount = count; - - // Reset progress - mCurrentLoop = 0; - mCurrentFrame = mStartFrame; -} - -void VectorRasterizeThread::SetPlayRange( Vector2 range ) +void VectorRasterizeThread::Run() { - ConditionalWait::ScopedLock lock( mConditionalWait ); - - mPlayRange = range; + SetThreadName( "VectorRasterizeThread" ); + mLogFactory.InstallLogFunction(); - if( mTotalFrame != 0 ) + while( !mDestroyThread ) { - mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); - mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); + Rasterize(); } } -bool VectorRasterizeThread::IsThreadReady() +void VectorRasterizeThread::Rasterize() { - ConditionalWait::ScopedLock lock( mConditionalWait ); - - if( ( !mPlaying || mPaused ) && !mNeedRender && !mDestroyThread ) + VectorAnimationTaskPtr nextTask; { - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::IsThreadReady: Wait\n" ); + // Lock while popping task out from the queue + ConditionalWait::ScopedLock lock( mConditionalWait ); - if( !mPlaying ) + // conditional wait + if( mRasterizeTasks.empty() ) { - mCurrentFrame = mStartFrame; - mCurrentLoop = 0; + mConditionalWait.Wait( lock ); } - 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 = mStartFrame; - - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::StartRender: Renderer is started [%d (%d, %d)]\n", mTotalFrame, mStartFrame, mEndFrame ); - - return true; -} - -void VectorRasterizeThread::Rasterize() -{ - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [%d]\n", mCurrentFrame ); - - // Rasterize - mVectorRenderer.Render( mCurrentFrame ); - - if( mPlaying && !mPaused ) - { - if( ++mCurrentFrame >= mEndFrame ) + // pop out the next task from the queue + if( !mRasterizeTasks.empty() ) { - if( mLoopCount < 0 ) - { - // repeat forever - mCurrentFrame = mStartFrame; - } - else - { - mCurrentLoop++; - if( mCurrentLoop >= mLoopCount ) - { - // Animation is finished - mPlaying = false; - } - else - { - mCurrentFrame = mStartFrame; - } - } + std::vector< VectorAnimationTaskPtr >::iterator next = mRasterizeTasks.begin(); + nextTask = *next; + mRasterizeTasks.erase( next ); } } - mNeedRender = false; - - if( !mResourceReady ) + if( nextTask ) { - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: Resource ready trigger\n" ); + bool keepAnimation = nextTask->Rasterize(); - mResourceReadyTrigger->Trigger(); - mResourceReady = true; + if( mCompletedCallback ) + { + CallbackBase::Execute( *mCompletedCallback, nextTask, keepAnimation ); + } } }