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=038b608484bccc4907c83b452d3dd796a0801788;hp=25d0743afc48957e61cebedc2750365ee51fdc53;hb=9768810e114ae68868a124aa8506f2f4e64fe9d1;hpb=e1f3e2cd23303685a5cb9e8babf4ea11d58c95e9 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 25d0743..038b608 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. @@ -61,10 +61,8 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) mConditionalWait(), mResourceReadyTrigger(), mAnimationFinishedTrigger(), - mPlayRange( 0.0f, 1.0f ), mPlayState( DevelImageVisual::PlayState::STOPPED ), mFrameDurationNanoSeconds( 0 ), - mProgress( 0.0f ), mFrameRate( 60.0f ), mCurrentFrame( 0 ), mTotalFrame( 0 ), @@ -80,7 +78,7 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) mCurrentFrameUpdated( false ), mLogFactory( Dali::Adaptor::Get().GetLogFactory() ) { - mVectorRenderer = VectorAnimationRenderer::New( mUrl ); + Initialize(); } VectorRasterizeThread::~VectorRasterizeThread() @@ -105,13 +103,12 @@ void VectorRasterizeThread::Run() SetThreadName( "VectorImageThread" ); mLogFactory.InstallLogFunction(); - //TODO: check the return value - StartRender(); - while( !mDestroyThread ) { Rasterize(); } + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Run: End of thread\n" ); } void VectorRasterizeThread::SetRenderer( Renderer renderer ) @@ -142,6 +139,7 @@ void VectorRasterizeThread::SetSize( uint32_t width, uint32_t height ) void VectorRasterizeThread::PlayAnimation() { ConditionalWait::ScopedLock lock( mConditionalWait ); + if( mPlayState != DevelImageVisual::PlayState::PLAYING ) { mPlayState = DevelImageVisual::PlayState::PLAYING; @@ -208,85 +206,84 @@ void VectorRasterizeThread::SetLoopCount( int32_t count ) ConditionalWait::ScopedLock lock( mConditionalWait ); mLoopCount = count; - } -} -int32_t VectorRasterizeThread::GetLoopCount() const -{ - return mLoopCount; + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetLoopCount: [%d]\n", count ); + } } -void VectorRasterizeThread::SetPlayRange( Vector2 range ) +void VectorRasterizeThread::SetPlayRange( uint32_t startFrame, uint32_t endFrame ) { - // Make sure the range specified is between 0.0 and 1.0 - if( range.x >= 0.0f && range.x <= 1.0f && range.y >= 0.0f && range.y <= 1.0f ) + // Make sure the range specified is between 0 and the total frame number + if( ( startFrame < mTotalFrame ) && ( endFrame < mTotalFrame ) ) { - Vector2 orderedRange( range ); // If the range is not in order swap values - if( range.x > range.y ) + if( startFrame > endFrame ) { - orderedRange = Vector2( range.y, range.x ); + uint32_t temp = startFrame; + startFrame = endFrame; + endFrame = temp; } - if( mPlayRange != orderedRange ) + if( startFrame != mStartFrame || endFrame != mEndFrame ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mPlayRange = orderedRange; + mStartFrame = startFrame; + mEndFrame = endFrame; - if( mTotalFrame != 0 ) + // If the current frame is out of the range, change the current frame also. + if( mStartFrame > mCurrentFrame ) { - mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); - mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); - - // If the current frame is out of the range, change the current frame also. - if( mStartFrame > mCurrentFrame ) - { - mCurrentFrame = mStartFrame; + mCurrentFrame = mStartFrame; - mCurrentFrameUpdated = true; - mResourceReady = false; - } - else if( mEndFrame < mCurrentFrame ) - { - mCurrentFrame = mEndFrame; + mCurrentFrameUpdated = true; + mResourceReady = false; + } + else if( mEndFrame < mCurrentFrame ) + { + mCurrentFrame = mEndFrame; - mCurrentFrameUpdated = true; - mResourceReady = false; - } + mCurrentFrameUpdated = true; + mResourceReady = false; } + + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetPlayRangeInFrame: [%d, %d]\n", mStartFrame, mEndFrame ); } } } -Vector2 VectorRasterizeThread::GetPlayRange() const -{ - return mPlayRange; -} - -void VectorRasterizeThread::SetCurrentProgress( float progress ) +void VectorRasterizeThread::SetCurrentFrameNumber( uint32_t frameNumber ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - if( progress >= mPlayRange.x && progress <= mPlayRange.y ) + if( frameNumber >= mStartFrame && frameNumber <= mEndFrame ) { - mProgress = progress; - - if( mTotalFrame != 0 ) - { - mCurrentFrame = static_cast< uint32_t >( mTotalFrame * progress + 0.5f ); - mCurrentFrameUpdated = true; - } + mCurrentFrame = frameNumber; + mCurrentFrameUpdated = true; mResourceReady = false; - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetCurrentProgress: progress = %f (%d)\n", progress, mCurrentFrame ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetCurrentFrameNumber: frame number = %f (%d)\n", mCurrentFrame ); } + else + { + DALI_LOG_ERROR( "Invalid frame number [%d (%d, %d)]\n", frameNumber, mStartFrame, mEndFrame ); + } +} + +uint32_t VectorRasterizeThread::GetCurrentFrameNumber() const +{ + return mCurrentFrame; } -float VectorRasterizeThread::GetCurrentProgress() const +uint32_t VectorRasterizeThread::GetTotalFrameNumber() const { - return ( static_cast< float >( mCurrentFrame ) / static_cast< float >( mTotalFrame ) ); + return mTotalFrame; +} + +void VectorRasterizeThread::GetDefaultSize( uint32_t& width, uint32_t& height ) const +{ + mVectorRenderer.GetDefaultSize( width, height ); } DevelImageVisual::PlayState VectorRasterizeThread::GetPlayState() const @@ -299,24 +296,23 @@ bool VectorRasterizeThread::IsResourceReady() const return mResourceReady; } -bool VectorRasterizeThread::StartRender() +void VectorRasterizeThread::Initialize() { - //TODO: check the return value - mVectorRenderer.StartRender(); + mVectorRenderer = VectorAnimationRenderer::New( mUrl ); 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 ); + mEndFrame = mTotalFrame; 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 ); + uint32_t width, height; + mVectorRenderer.GetDefaultSize( width, height ); + + SetSize( width, height ); - return true; + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Initialize: file = %s [%d frames, %f fps]\n", mUrl.c_str(), mTotalFrame, mFrameRate ); } void VectorRasterizeThread::Rasterize() @@ -374,6 +370,8 @@ void VectorRasterizeThread::Rasterize() { mPlayState = DevelImageVisual::PlayState::STOPPED; + ResetToStart( mCurrentFrameUpdated, mCurrentFrame, startFrame, mConditionalWait ); + // Animation is finished mAnimationFinishedTrigger->Trigger(); @@ -399,7 +397,7 @@ void VectorRasterizeThread::Rasterize() #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() ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: [current = %d, sleep duration = %lld]\n", currentFrame, sleepDuration.count() ); #endif std::this_thread::sleep_until( timeToSleepUntil );