From: Eunki, Hong Date: Fri, 12 Apr 2024 13:07:07 +0000 (+0900) Subject: [Tizen] Force call KeepRendering when lottie animation stopped, or frame changed X-Git-Tag: accepted/tizen/8.0/unified/20240418.161559~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fbb452ac8d0731a9a4c687698871fd00eed1172c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Force call KeepRendering when lottie animation stopped, or frame changed Change-Id: Ie9c44a8a3997a644080c934d36e99c8aee804bf2 Signed-off-by: Eunki, Hong --- 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 fb390be..ac87ef8 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 @@ -411,6 +411,7 @@ void AnimatedVectorImageVisual::OnInitialize(void) { mVectorAnimationTask->ResourceReadySignal().Connect(this, &AnimatedVectorImageVisual::OnResourceReady); mVectorAnimationTask->SetAnimationFinishedCallback(MakeCallback(this, &AnimatedVectorImageVisual::OnAnimationFinished)); + mVectorAnimationTask->SetForceRenderOnceCallback(MakeCallback(this, &AnimatedVectorImageVisual::OnForceRendering)); EncodedImageBuffer encodedImageBuffer; @@ -730,6 +731,14 @@ void AnimatedVectorImageVisual::OnAnimationFinished(uint32_t playStateId) } } +void AnimatedVectorImageVisual::OnForceRendering(uint32_t playStateId) +{ + if(!mCoreShutdown) + { + Stage::GetCurrent().KeepRendering(0.0f); // Trigger event processing + } +} + void AnimatedVectorImageVisual::SendAnimationData() { if(DALI_UNLIKELY(mImpl == nullptr)) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h index fc7d7a4..7e7b04d 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h @@ -188,6 +188,13 @@ private: void OnAnimationFinished(uint32_t playStateId); /** + * @brief Event callback from rasterize thread. This is called when we want to ensure rendering next frame. + * + * @param[in] argument Not using arguments + */ + void OnForceRendering(uint32_t argument); + + /** * @brief Send animation data to the rasterize thread. */ void SendAnimationData(); 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 4f4e97d..423d3fc 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 @@ -98,6 +98,7 @@ VectorAnimationTask::VectorAnimationTask(VisualFactoryCache& factoryCache) mForward(true), mUpdateFrameNumber(false), mNeedAnimationFinishedTrigger(true), + mNeedForceRenderOnceTrigger(false), mAnimationDataUpdated(false), mDestroyTask(false), mLoadRequest(false), @@ -138,6 +139,11 @@ void VectorAnimationTask::Finalize() mVectorAnimationThread.RemoveEventTriggerCallbacks(mAnimationFinishedCallback.get()); mAnimationFinishedCallback.reset(); } + if(mForceRenderOnceCallback) + { + mVectorAnimationThread.RemoveEventTriggerCallbacks(mForceRenderOnceCallback.get()); + mForceRenderOnceCallback.reset(); + } if(mLoadCompletedCallback) { mVectorAnimationThread.RemoveEventTriggerCallbacks(mLoadCompletedCallback.get()); @@ -376,6 +382,9 @@ void VectorAnimationTask::PauseAnimation() { mPlayState = PlayState::PAUSED; + // Ensure to render paused frame. + mNeedForceRenderOnceTrigger = true; + DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::PauseAnimation: Pause [%p]\n", this); } } @@ -386,6 +395,12 @@ void VectorAnimationTask::SetAnimationFinishedCallback(CallbackBase* callback) mAnimationFinishedCallback = std::unique_ptr(callback); } +void VectorAnimationTask::SetForceRenderOnceCallback(CallbackBase* callback) +{ + Mutex::ScopedLock lock(mMutex); + mForceRenderOnceCallback = std::unique_ptr(callback); +} + void VectorAnimationTask::SetLoopCount(int32_t count) { if(mLoopCount != count) @@ -467,10 +482,22 @@ void VectorAnimationTask::SetPlayRange(const Property::Array& playRange) if(mStartFrame > mCurrentFrame) { mCurrentFrame = mStartFrame; + + if(mPlayState != PlayState::PLAYING) + { + // Ensure to render current frame. + mNeedForceRenderOnceTrigger = true; + } } else if(mEndFrame < mCurrentFrame) { mCurrentFrame = mEndFrame; + + if(mPlayState != PlayState::PLAYING) + { + // Ensure to render current frame. + mNeedForceRenderOnceTrigger = true; + } } DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetPlayRange: [%d, %d] [%s] [%p]\n", mStartFrame, mEndFrame, mImageUrl.GetUrl().c_str(), this); @@ -496,6 +523,12 @@ void VectorAnimationTask::SetCurrentFrameNumber(uint32_t frameNumber) mCurrentFrame = frameNumber; mUpdateFrameNumber = false; + if(mPlayState != PlayState::PLAYING) + { + // Ensure to render current frame. + mNeedForceRenderOnceTrigger = true; + } + DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetCurrentFrameNumber: frame number = %d [%p]\n", mCurrentFrame, this); } else @@ -693,6 +726,8 @@ bool VectorAnimationTask::Rasterize() mForward = true; mCurrentLoop = 0; + mNeedForceRenderOnceTrigger = true; + if(mVectorRenderer) { // Notify the Renderer that rendering is stopped. @@ -711,6 +746,17 @@ bool VectorAnimationTask::Rasterize() DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Animation is finished [current = %d] [%p]\n", currentFrame, this); } + // Forcely trigger render once if need. + if(mNeedForceRenderOnceTrigger) + { + Mutex::ScopedLock lock(mMutex); + if(mForceRenderOnceCallback) + { + mVectorAnimationThread.AddEventTriggerCallback(mForceRenderOnceCallback.get(), mAppliedPlayStateId); + } + mNeedForceRenderOnceTrigger = false; + } + if(mPlayState != PlayState::PAUSED && mPlayState != PlayState::STOPPED) { mKeepAnimation = true; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h index eb48a13..46976a5 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h @@ -179,6 +179,12 @@ public: void SetAnimationFinishedCallback(CallbackBase* callback); /** + * @brief This callback is called when we want to force render next frame. + * @param[in] callback The force render once callback + */ + void SetForceRenderOnceCallback(CallbackBase* callback); + + /** * @brief Gets the playing range in frame number. * @param[out] startFrame The frame number to specify minimum progress. * @param[out] endFrame The frame number to specify maximum progress. @@ -393,6 +399,7 @@ private: Mutex mMutex; ResourceReadySignalType mResourceReadySignal; std::unique_ptr mAnimationFinishedCallback{}; + std::unique_ptr mForceRenderOnceCallback{}; std::unique_ptr mLoadCompletedCallback{}; mutable Property::Map mCachedLayerInfo; mutable Property::Map mCachedMarkerInfo; @@ -416,6 +423,7 @@ private: bool mForward : 1; bool mUpdateFrameNumber : 1; bool mNeedAnimationFinishedTrigger : 1; + bool mNeedForceRenderOnceTrigger : 1; bool mAnimationDataUpdated : 1; bool mDestroyTask : 1; bool mLoadRequest : 1;