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=e0c08bdcff00a0266117f8b74fe72c645423f480;hp=db42b6772a8357ce79093e974e4242df17979766;hb=7115ceaa86e5621764815fb7ac5d1c087bf962b7;hpb=185db7fdcfdd0e78434d56d9e4c046451932372f 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 db42b67..e0c08bd 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -20,6 +20,8 @@ // EXTERNAL INCLUDES #include +#include +#include // INTERNAL INCLUDES #include @@ -92,6 +94,19 @@ VectorAnimationTask::~VectorAnimationTask() DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::~VectorAnimationTask: destructor [%p]\n", this ); } +void VectorAnimationTask::Finalize() +{ + ConditionalWait::ScopedLock lock( mConditionalWait ); + + // Release some objects in the main thread + if( mAnimationFinishedTrigger ) + { + mAnimationFinishedTrigger.reset(); + } + + mVectorRenderer.Finalize(); +} + void VectorAnimationTask::SetRenderer( Renderer renderer ) { ConditionalWait::ScopedLock lock( mConditionalWait ); @@ -170,7 +185,10 @@ void VectorAnimationTask::RenderFrame() void VectorAnimationTask::SetAnimationFinishedCallback( EventThreadCallback* callback ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mAnimationFinishedTrigger = std::unique_ptr< EventThreadCallback >( callback ); + if( callback ) + { + mAnimationFinishedTrigger = std::unique_ptr< EventThreadCallback >( callback ); + } } void VectorAnimationTask::SetLoopCount( int32_t count ) @@ -187,10 +205,60 @@ void VectorAnimationTask::SetLoopCount( int32_t count ) } } -void VectorAnimationTask::SetPlayRange( uint32_t startFrame, uint32_t endFrame ) +void VectorAnimationTask::SetPlayRange( Property::Array& playRange ) { + ConditionalWait::ScopedLock lock( mConditionalWait ); + + bool valid = false; + uint32_t startFrame = 0, endFrame = 0; + size_t count = playRange.Count(); + + if( count >= 2 ) + { + int32_t start = 0, end = 0; + if( playRange.GetElementAt( 0 ).Get( start ) && playRange.GetElementAt( 1 ).Get( end ) ) + { + startFrame = static_cast< uint32_t >( start ); + endFrame = static_cast< uint32_t >( end ); + valid = true; + } + else + { + std::string startMarker, endMarker; + if( playRange.GetElementAt( 0 ).Get( startMarker ) && playRange.GetElementAt( 1 ).Get( endMarker ) ) + { + if( mVectorRenderer ) + { + uint32_t frame; // We don't use this later + if( mVectorRenderer.GetMarkerInfo( startMarker, startFrame, frame ) && mVectorRenderer.GetMarkerInfo( endMarker, frame, endFrame ) ) + { + valid = true; + } + } + } + } + } + else if( count == 1 ) + { + std::string marker; + if( playRange.GetElementAt( 0 ).Get( marker ) ) + { + if( mVectorRenderer ) + { + mVectorRenderer.GetMarkerInfo( marker, startFrame, endFrame ); + valid = true; + } + } + } + + if( !valid ) + { + DALI_LOG_ERROR( "VectorAnimationTask::SetPlayRange: Invalid range [%p]\n", this ); + return; + } + // Make sure the range specified is between 0 and the total frame number - if( ( startFrame < mTotalFrame ) && ( endFrame < mTotalFrame ) ) + if( startFrame < mTotalFrame && endFrame < mTotalFrame ) { // If the range is not in order swap values if( startFrame > endFrame ) @@ -202,8 +270,6 @@ void VectorAnimationTask::SetPlayRange( uint32_t startFrame, uint32_t endFrame ) if( startFrame != mStartFrame || endFrame != mEndFrame ) { - ConditionalWait::ScopedLock lock( mConditionalWait ); - mStartFrame = startFrame; mEndFrame = endFrame; @@ -226,6 +292,11 @@ void VectorAnimationTask::SetPlayRange( uint32_t startFrame, uint32_t endFrame ) DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetPlayRange: [%d, %d] [%p]\n", mStartFrame, mEndFrame, this ); } } + else + { + DALI_LOG_ERROR( "VectorAnimationTask::SetPlayRange: Invalid range (%d, %d) [%p]\n", startFrame, endFrame, this ); + return; + } } void VectorAnimationTask::GetPlayRange( uint32_t& startFrame, uint32_t& endFrame ) @@ -276,6 +347,7 @@ void VectorAnimationTask::SetCurrentFrameNumber( uint32_t frameNumber ) mCurrentFrame = frameNumber; mCurrentFrameUpdated = true; + mUpdateFrameNumber = false; mResourceReady = false; DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetCurrentFrameNumber: frame number = %d [%p]\n", mCurrentFrame, this ); @@ -348,7 +420,7 @@ void VectorAnimationTask::Initialize() bool VectorAnimationTask::Rasterize() { - bool stopped = false, needAnimationFinishedTrigger; + bool stopped = false, needAnimationFinishedTrigger, resourceReady; uint32_t currentFrame, startFrame, endFrame; int32_t loopCount, currentLoopCount; PlayState playState; @@ -359,6 +431,7 @@ bool VectorAnimationTask::Rasterize() if( mPlayState == PlayState::PLAYING && mUpdateFrameNumber ) { mCurrentFrame = mForward ? mCurrentFrame + 1 : mCurrentFrame - 1; + Dali::ClampInPlace( mCurrentFrame, mStartFrame, mEndFrame ); } currentFrame = mCurrentFrame; @@ -368,6 +441,7 @@ bool VectorAnimationTask::Rasterize() currentLoopCount = mCurrentLoop; needAnimationFinishedTrigger = mNeedAnimationFinishedTrigger; playState = mPlayState; + resourceReady = mResourceReady; mResourceReady = true; mCurrentFrameUpdated = false; @@ -434,15 +508,27 @@ bool VectorAnimationTask::Rasterize() } // Rasterize - bool renderSuccess = mVectorRenderer.Render( currentFrame ); - if( !renderSuccess ) + bool renderSuccess = false; + if( mVectorRenderer ) { - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Rendering failed. Try again later.[%d] [%p]\n", currentFrame, this ); - mUpdateFrameNumber = false; + renderSuccess = mVectorRenderer.Render( currentFrame ); + if( !renderSuccess ) + { + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Rendering failed. Try again later.[%d] [%p]\n", currentFrame, this ); + mUpdateFrameNumber = false; + + if( !resourceReady ) + { + ConditionalWait::ScopedLock lock( mConditionalWait ); + mResourceReady = false; + } + } } if( stopped && renderSuccess ) { + ConditionalWait::ScopedLock lock( mConditionalWait ); + mPlayState = PlayState::STOPPED; mForward = true; mCurrentLoop = 0;