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=01b6898403615ea15e9025dead7fee85c5f9e728;hp=59e4e85f4a3727419e0677ee3612d0091698b5bd;hb=HEAD;hpb=5c53bc6e76a1633a69c1a3d30c63677772eb3fd6 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 59e4e85..ac448c0 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 @@ -73,7 +73,7 @@ VectorAnimationTask::VectorAnimationTask(VisualFactoryCache& factoryCache) mVectorRenderer(VectorAnimationRenderer::New()), mAnimationData(), mVectorAnimationThread(factoryCache.GetVectorAnimationManager().GetVectorAnimationThread()), - mConditionalWait(), + mMutex(), mResourceReadySignal(), mLoadCompletedCallback(MakeCallback(this, &VectorAnimationTask::OnLoadCompleted)), mCachedLayerInfo(), @@ -92,11 +92,13 @@ VectorAnimationTask::VectorAnimationTask(VisualFactoryCache& factoryCache) mWidth(0), mHeight(0), mAnimationDataIndex(0), + mAppliedPlayStateId(0u), mLoopCount(LOOP_FOREVER), mCurrentLoop(0), mForward(true), mUpdateFrameNumber(false), mNeedAnimationFinishedTrigger(true), + mNeedForceRenderOnceTrigger(false), mAnimationDataUpdated(false), mDestroyTask(false), mLoadRequest(false), @@ -106,6 +108,7 @@ VectorAnimationTask::VectorAnimationTask(VisualFactoryCache& factoryCache) mLayerInfoCached(false), mMarkerInfoCached(false), mEnableFrameCache(false), + mNotifyAfterRasterization(false), mSizeUpdated(false) { mVectorRenderer.UploadCompletedSignal().Connect(this, &VectorAnimationTask::OnUploadCompleted); @@ -128,23 +131,25 @@ bool VectorAnimationTask::IsReady() void VectorAnimationTask::Finalize() { - ConditionalWait::ScopedLock lock(mConditionalWait); - - // Release some objects in the main thread - if(mAnimationFinishedCallback) - { - mVectorAnimationThread.RemoveEventTriggerCallbacks(mAnimationFinishedCallback.get()); - mAnimationFinishedCallback.reset(); - } - if(mLoadCompletedCallback) { - mVectorAnimationThread.RemoveEventTriggerCallbacks(mLoadCompletedCallback.get()); - mLoadCompletedCallback.reset(); + Mutex::ScopedLock lock(mMutex); + + // Release some objects in the main thread + if(mAnimationFinishedCallback) + { + mVectorAnimationThread.RemoveEventTriggerCallbacks(mAnimationFinishedCallback.get()); + mAnimationFinishedCallback.reset(); + } + if(mLoadCompletedCallback) + { + mVectorAnimationThread.RemoveEventTriggerCallbacks(mLoadCompletedCallback.get()); + mLoadCompletedCallback.reset(); + } + + mDestroyTask = true; } mVectorRenderer.Finalize(); - - mDestroyTask = true; } void VectorAnimationTask::TaskCompleted(VectorAnimationTaskPtr task) @@ -209,10 +214,10 @@ bool VectorAnimationTask::Load(bool synchronousLoading) DALI_LOG_ERROR("VectorAnimationTask::Load: Load failed [%s]\n", mImageUrl.GetUrl().c_str()); mLoadRequest = false; { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); if(!synchronousLoading && mLoadCompletedCallback) { - mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get()); + mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get(), 0u); } } #ifdef TRACE_ENABLED @@ -240,10 +245,10 @@ bool VectorAnimationTask::Load(bool synchronousLoading) mLoadRequest = false; { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); if(!synchronousLoading && mLoadCompletedCallback) { - mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get()); + mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get(), 0u); } } @@ -268,8 +273,6 @@ bool VectorAnimationTask::Load(bool synchronousLoading) void VectorAnimationTask::SetRenderer(Renderer renderer) { - ConditionalWait::ScopedLock lock(mConditionalWait); - mVectorRenderer.SetRenderer(renderer); DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetRenderer [%p]\n", this); @@ -290,7 +293,7 @@ void VectorAnimationTask::RequestLoad(const VisualUrl& url, EncodedImageBuffer e { Load(true); - OnLoadCompleted(); + OnLoadCompleted(0u); } } @@ -301,7 +304,7 @@ bool VectorAnimationTask::IsLoadRequested() const void VectorAnimationTask::SetAnimationData(const AnimationData& data) { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::SetAnimationData [%p]\n", this); @@ -375,13 +378,16 @@ 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); } } void VectorAnimationTask::SetAnimationFinishedCallback(CallbackBase* callback) { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); mAnimationFinishedCallback = std::unique_ptr(callback); } @@ -466,10 +472,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); @@ -495,6 +513,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 @@ -580,7 +604,7 @@ bool VectorAnimationTask::Rasterize() mKeepAnimation = false; { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); if(mDestroyTask) { // The task will be destroyed. We don't need rasterization. @@ -692,6 +716,8 @@ bool VectorAnimationTask::Rasterize() mForward = true; mCurrentLoop = 0; + mNeedForceRenderOnceTrigger = true; + if(mVectorRenderer) { // Notify the Renderer that rendering is stopped. @@ -700,16 +726,24 @@ bool VectorAnimationTask::Rasterize() // Animation is finished { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); if(mNeedAnimationFinishedTrigger && mAnimationFinishedCallback) { - mVectorAnimationThread.AddEventTriggerCallback(mAnimationFinishedCallback.get()); + mVectorAnimationThread.AddEventTriggerCallback(mAnimationFinishedCallback.get(), mAppliedPlayStateId); } } DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationTask::Rasterize: Animation is finished [current = %d] [%p]\n", currentFrame, this); } + // Forcely trigger render once if need. + if(mNotifyAfterRasterization || mNeedForceRenderOnceTrigger) + { + Mutex::ScopedLock lock(mMutex); + mVectorAnimationThread.RequestForceRenderOnce(); + mNeedForceRenderOnceTrigger = false; + } + if(mPlayState != PlayState::PAUSED && mPlayState != PlayState::STOPPED) { mKeepAnimation = true; @@ -803,7 +837,7 @@ void VectorAnimationTask::ApplyAnimationData() uint32_t index; { - ConditionalWait::ScopedLock lock(mConditionalWait); + Mutex::ScopedLock lock(mMutex); if(!mAnimationDataUpdated || mAnimationData[mAnimationDataIndex].size() != 0) { @@ -844,6 +878,11 @@ void VectorAnimationTask::ApplyAnimationData() SetCurrentFrameNumber(animationData.currentFrame); } + if(animationData.resendFlag & VectorAnimationTask::RESEND_NOTIFY_AFTER_RASTERIZATION) + { + mNotifyAfterRasterization = animationData.notifyAfterRasterization; + } + if(animationData.resendFlag & VectorAnimationTask::RESEND_NEED_RESOURCE_READY) { mVectorRenderer.InvalidateBuffer(); @@ -859,6 +898,7 @@ void VectorAnimationTask::ApplyAnimationData() if(animationData.resendFlag & VectorAnimationTask::RESEND_PLAY_STATE) { + mAppliedPlayStateId = animationData.playStateId; if(animationData.playState == DevelImageVisual::PlayState::PLAYING) { PlayAnimation(); @@ -883,7 +923,7 @@ void VectorAnimationTask::OnUploadCompleted() mResourceReadySignal.Emit(ResourceStatus::READY); } -void VectorAnimationTask::OnLoadCompleted() +void VectorAnimationTask::OnLoadCompleted(uint32_t /* not used */) { if(!mLoadFailed) {