From 52f294c7dc6b1bbd3265489a2d8f70659ed88931 Mon Sep 17 00:00:00 2001 From: Heeyong Song Date: Tue, 3 Sep 2019 17:44:46 +0900 Subject: [PATCH] (Vector) Fix some issues - Reset the current loop count when the loop count sets. - Do not trigger the animation finished callback if StopAnimation is called. - Fix Coverity issue Change-Id: I1db350c6d9daae37429f2c3573902f0d68a19f94 --- .../utc-Dali-AnimatedVectorImageVisual.cpp | 4 +-- .../animated-vector-image-visual.cpp | 39 ++++++++++++++-------- .../vector-rasterize-thread.cpp | 27 +++++++++++---- .../vector-rasterize-thread.h | 2 ++ 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index 49f665b..87ff376 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -943,8 +943,8 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void) // Stop DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes ); - // Trigger count is 1 - animation finished - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); + application.Render( 16 ); map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER ); diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index d26787e..5b0c1c4 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -242,18 +242,22 @@ void AnimatedVectorImageVisual::DoSetProperty( Property::Index index, const Prop } case Toolkit::DevelImageVisual::Property::STOP_BEHAVIOR: { - int32_t stopBehavior; - Scripting::GetEnumerationProperty( value, STOP_BEHAVIOR_TABLE, STOP_BEHAVIOR_TABLE_COUNT, stopBehavior ); - mStopBehavior = DevelImageVisual::StopBehavior::Type( stopBehavior ); - mResendFlag |= RESEND_STOP_BEHAVIOR; + int32_t stopBehavior = mStopBehavior; + if( Scripting::GetEnumerationProperty( value, STOP_BEHAVIOR_TABLE, STOP_BEHAVIOR_TABLE_COUNT, stopBehavior ) ) + { + mStopBehavior = DevelImageVisual::StopBehavior::Type( stopBehavior ); + mResendFlag |= RESEND_STOP_BEHAVIOR; + } break; } case Toolkit::DevelImageVisual::Property::LOOPING_MODE: { - int32_t loopingMode; - Scripting::GetEnumerationProperty( value, LOOPING_MODE_TABLE, LOOPING_MODE_TABLE_COUNT, loopingMode ); - mLoopingMode = DevelImageVisual::LoopingMode::Type( loopingMode ); - mResendFlag |= RESEND_LOOPING_MODE; + int32_t loopingMode = mLoopingMode; + if( Scripting::GetEnumerationProperty( value, LOOPING_MODE_TABLE, LOOPING_MODE_TABLE_COUNT, loopingMode ) ) + { + mLoopingMode = DevelImageVisual::LoopingMode::Type( loopingMode ); + mResendFlag |= RESEND_LOOPING_MODE; + } break; } } @@ -393,9 +397,13 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons if( mVectorRasterizeThread.GetPlayState() != DevelImageVisual::PlayState::STOPPED ) { mVectorRasterizeThread.StopAnimation(); + } - OnAnimationFinished(); + if( mImpl->mRenderer ) + { + mImpl->mRenderer.SetProperty( DevelRenderer::Property::RENDERING_BEHAVIOR, DevelRenderer::Rendering::IF_REQUIRED ); } + mActionStatus = DevelAnimatedVectorImageVisual::Action::STOP; break; } @@ -445,12 +453,17 @@ void AnimatedVectorImageVisual::OnUploadCompleted() void AnimatedVectorImageVisual::OnAnimationFinished() { - if( mImpl->mEventObserver ) + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnAnimationFinished: action state = %d [%p]\n", mActionStatus, this ); + + if( mActionStatus != DevelAnimatedVectorImageVisual::Action::STOP ) { - mImpl->mEventObserver->NotifyVisualEvent( *this, DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED ); - } + mActionStatus = DevelAnimatedVectorImageVisual::Action::STOP; - mActionStatus = DevelAnimatedVectorImageVisual::Action::STOP; + if( mImpl->mEventObserver ) + { + mImpl->mEventObserver->NotifyVisualEvent( *this, DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED ); + } + } if( mImpl->mRenderer ) { 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 c5f207c..2c39333 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 @@ -44,7 +44,8 @@ constexpr auto NANOSECONDS_PER_SECOND( 1e+9 ); Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" ); #endif -inline void ResetValue( bool& updated, uint32_t& value, uint32_t newValue, ConditionalWait& conditionalWait ) +template< typename T > +inline void ResetValue( bool& updated, T& value, T newValue, ConditionalWait& conditionalWait ) { ConditionalWait::ScopedLock lock( conditionalWait ); if( !updated ) @@ -78,8 +79,10 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) mDestroyThread( false ), mResourceReady( false ), mCurrentFrameUpdated( false ), + mCurrentLoopUpdated( false ), mForward( true ), mUpdateFrameNumber( false ), + mNeedAnimationFinishedTrigger( true ), mLogFactory( Dali::Adaptor::Get().GetLogFactory() ) { Initialize(); @@ -158,6 +161,7 @@ void VectorRasterizeThread::StopAnimation() if( mPlayState != PlayState::STOPPED && mPlayState != PlayState::STOPPING ) { mNeedRender = true; + mNeedAnimationFinishedTrigger = false; mPlayState = PlayState::STOPPING; mConditionalWait.Notify( lock ); @@ -202,6 +206,8 @@ void VectorRasterizeThread::SetLoopCount( int32_t count ) ConditionalWait::ScopedLock lock( mConditionalWait ); mLoopCount = count; + mCurrentLoop = 0; + mCurrentLoopUpdated = true; DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetLoopCount: [%d] [%p]\n", count, this ); } @@ -362,9 +368,9 @@ void VectorRasterizeThread::Initialize() void VectorRasterizeThread::Rasterize() { - bool stopped = false; + bool stopped = false, needAnimationFinishedTrigger; uint32_t currentFrame, startFrame, endFrame; - int32_t loopCount; + int32_t loopCount, currentLoopCount; { ConditionalWait::ScopedLock lock( mConditionalWait ); @@ -384,11 +390,15 @@ void VectorRasterizeThread::Rasterize() startFrame = mStartFrame; endFrame = mEndFrame; loopCount = mLoopCount; + currentLoopCount = mCurrentLoop; + needAnimationFinishedTrigger = mNeedAnimationFinishedTrigger; mResourceReady = true; mNeedRender = false; mCurrentFrameUpdated = false; + mCurrentLoopUpdated = false; mUpdateFrameNumber = true; + mNeedAnimationFinishedTrigger = true; } auto currentFrameStartTime = std::chrono::system_clock::now(); @@ -412,7 +422,7 @@ void VectorRasterizeThread::Rasterize() } else { - if( loopCount < 0 || ++mCurrentLoop < loopCount ) // repeat forever or before the last loop + if( loopCount < 0 || ++currentLoopCount < loopCount ) // repeat forever or before the last loop { ResetValue( mCurrentFrameUpdated, mCurrentFrame, startFrame, mConditionalWait ); // If the current frame is changed in the event thread, don't overwrite it. mUpdateFrameNumber = false; @@ -421,11 +431,12 @@ void VectorRasterizeThread::Rasterize() { animationFinished = true; // end of animation } + ResetValue( mCurrentLoopUpdated, mCurrentLoop, currentLoopCount, mConditionalWait ); } } else if( currentFrame == startFrame && !mForward ) // first frame { - if( loopCount < 0 || ++mCurrentLoop < loopCount ) // repeat forever or before the last loop + if( loopCount < 0 || ++currentLoopCount < loopCount ) // repeat forever or before the last loop { mForward = true; } @@ -433,6 +444,7 @@ void VectorRasterizeThread::Rasterize() { animationFinished = true; // end of animation } + ResetValue( mCurrentLoopUpdated, mCurrentLoop, currentLoopCount, mConditionalWait ); } if( animationFinished ) @@ -462,7 +474,10 @@ void VectorRasterizeThread::Rasterize() mCurrentLoop = 0; // Animation is finished - mAnimationFinishedTrigger->Trigger(); + if( needAnimationFinishedTrigger ) + { + mAnimationFinishedTrigger->Trigger(); + } DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::Rasterize: Animation is finished [current = %d] [%p]\n", currentFrame, this ); } diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h index 0855f14..f50a66d 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h @@ -233,8 +233,10 @@ private: bool mDestroyThread; ///< Whether the thread be destroyed bool mResourceReady; bool mCurrentFrameUpdated; + bool mCurrentLoopUpdated; bool mForward; bool mUpdateFrameNumber; + bool mNeedAnimationFinishedTrigger; const Dali::LogFactoryInterface& mLogFactory; ///< The log factory }; -- 2.7.4