+ TextureSet textureSet;
+ bool continueTimer = false;
+
+ if(mImageCache)
+ {
+ bool nextFrame = false;
+ uint32_t frameIndex = mImageCache->GetCurrentFrameIndex();
+
+ if(mIsJumpTo)
+ {
+ mIsJumpTo = false;
+ frameIndex = mFrameIndexForJumpTo;
+ }
+ else if(mActionStatus == DevelAnimatedImageVisual::Action::PAUSE)
+ {
+ return false;
+ }
+ else if(mActionStatus == DevelAnimatedImageVisual::Action::STOP)
+ {
+ frameIndex = 0;
+ if(mStopBehavior == DevelImageVisual::StopBehavior::FIRST_FRAME)
+ {
+ frameIndex = 0;
+ }
+ else if(mStopBehavior == DevelImageVisual::StopBehavior::LAST_FRAME)
+ {
+ frameIndex = mFrameCount - 1;
+ }
+ else
+ {
+ return false; // Do not draw already rendered scene twice.
+ }
+ }
+ else
+ {
+ if(mFrameCount > 1)
+ {
+ nextFrame = true;
+ frameIndex++;
+ if(frameIndex >= mFrameCount)
+ {
+ frameIndex %= mFrameCount;
+ ++mCurrentLoopIndex;
+ }
+
+ if(mLoopCount >= 0 && mCurrentLoopIndex >= mLoopCount)
+ {
+ // This will stop timer
+ mActionStatus = DevelAnimatedImageVisual::Action::STOP;
+ return DisplayNextFrame();
+ }
+ }
+
+ unsigned int delay = mImageCache->GetFrameInterval(frameIndex);
+ if(delay > 0u)
+ {
+ if(mFrameDelayTimer.GetInterval() != delay)
+ {
+ mFrameDelayTimer.SetInterval(delay);
+ }
+ }
+ }
+
+ DALI_LOG_INFO(gAnimImgLogFilter, Debug::Concise, "AnimatedImageVisual::DisplayNextFrame(this:%p) CurrentFrameIndex:%d\n", this, frameIndex);
+
+ if(nextFrame)
+ {
+ textureSet = mImageCache->NextFrame();
+ }
+ else
+ {
+ textureSet = mImageCache->Frame(frameIndex);
+ }
+
+ continueTimer = (mActionStatus == DevelAnimatedImageVisual::Action::PLAY) ? true : false;
+ }
+
+ if(textureSet)
+ {
+ SetImageSize(textureSet);
+ if(mImpl->mRenderer)
+ {
+ mImpl->mRenderer.SetTextures(textureSet);
+ }
+ }
+
+ return continueTimer;
+}
+
+TextureSet AnimatedImageVisual::SetLoadingFailed()
+{
+ DALI_LOG_INFO(gAnimImgLogFilter, Debug::Concise, "ResourceReady(ResourceStatus::FAILED)\n");
+ ResourceReady(Toolkit::Visual::ResourceStatus::FAILED);
+
+ Actor actor = mPlacementActor.GetHandle();
+ Vector2 imageSize = Vector2::ZERO;
+ if(actor)
+ {
+ imageSize = actor.GetProperty(Actor::Property::SIZE).Get<Vector2>();
+ }
+ mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize);
+ TextureSet textureSet = mImpl->mRenderer.GetTextures();
+
+ if(mFrameDelayTimer)