X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fanimated-image%2Frolling-gif-image-cache.cpp;h=04f0f1d650652f078c1113ca1b01394fb9886096;hb=b31764bc76595c1ccd58cf4366dcde2cc78e72cf;hp=ed61adb86881615d36ea469c246974d1c8903eaa;hpb=235a3efd5d00a20adbcae39dfce2c29a6c0344b7;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/animated-image/rolling-gif-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/rolling-gif-image-cache.cpp index ed61adb..04f0f1d 100644 --- a/dali-toolkit/internal/visuals/animated-image/rolling-gif-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/rolling-gif-image-cache.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 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. @@ -74,22 +74,59 @@ RollingGifImageCache::RollingGifImageCache( RollingGifImageCache::~RollingGifImageCache() { - while( !mQueue.IsEmpty() ) + if( mTextureManagerAlive ) { - ImageFrame imageFrame = mQueue.PopFront(); - Dali::Toolkit::TextureManager::RemoveTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl ); + while( !mQueue.IsEmpty() ) + { + ImageFrame imageFrame = mQueue.PopFront(); + Dali::Toolkit::TextureManager::RemoveTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl ); + } } } -TextureSet RollingGifImageCache::FirstFrame() +TextureSet RollingGifImageCache::Frame( uint32_t frameIndex ) { + // If a frame of frameIndex is not loaded, clear the queue and remove all loaded textures. + if( mImageUrls[ frameIndex ].mTextureId == TextureManager::INVALID_TEXTURE_ID ) + { + mFrameIndex = frameIndex; + while( !mQueue.IsEmpty() ) + { + ImageFrame imageFrame = mQueue.PopFront(); + Dali::Toolkit::TextureManager::RemoveTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl ); + mImageUrls[ imageFrame.mFrameNumber ].mTextureId = TextureManager::INVALID_TEXTURE_ID; + } + LoadBatch(); + } + // If the frame is already loaded, remove previous frames of the frame in the queue + // and load new frames amount of removed frames. + else + { + bool popExist = false; + while( !mQueue.IsEmpty() && mQueue.Front().mFrameNumber != frameIndex ) + { + ImageFrame imageFrame = mQueue.PopFront(); + Dali::Toolkit::TextureManager::RemoveTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl ); + mImageUrls[ imageFrame.mFrameNumber ].mTextureId = TextureManager::INVALID_TEXTURE_ID; + popExist = true; + } + if( popExist ) + { + mFrameIndex = ( mQueue.Back().mFrameNumber + 1 ) % mFrameCount; + LoadBatch(); + } + } + return GetFrontTextureSet(); } -TextureSet RollingGifImageCache::NextFrame() +TextureSet RollingGifImageCache::FirstFrame() { - TextureSet textureSet; + return Frame( 0u ); +} +TextureSet RollingGifImageCache::NextFrame() +{ ImageFrame imageFrame = mQueue.PopFront(); Dali::Toolkit::TextureManager::RemoveTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl ); mImageUrls[ imageFrame.mFrameNumber ].mTextureId = TextureManager::INVALID_TEXTURE_ID; @@ -116,7 +153,7 @@ void RollingGifImageCache::LoadBatch() int batchSize = std::min( std::size_t(mBatchSize), mCacheSize - mQueue.Count() ); DALI_LOG_INFO( gAnimImgLogFilter, Debug::Concise, "RollingGifImageCache::LoadBatch() mFrameIndex:%d batchSize:%d\n", mFrameIndex, batchSize ); - if( mGifLoading.LoadNextNFrames( mFrameIndex, batchSize, pixelDataList) ) + if( mGifLoading.LoadNextNFrames( mFrameIndex, batchSize, pixelDataList) ) { unsigned int pixelDataListCount = pixelDataList.size(); @@ -147,12 +184,13 @@ void RollingGifImageCache::LoadBatch() AtlasUploadObserver* atlasObserver = nullptr; ImageAtlasManagerPtr imageAtlasManager = nullptr; Vector4 textureRect; + Dali::ImageDimensions textureRectSize; auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; mTextureManager.LoadTexture( mImageUrls[ imageFrame.mFrameNumber ].mUrl, ImageDimensions(), FittingMode::SCALE_TO_FILL, SamplingMode::BOX_THEN_LINEAR, maskInfo, - synchronousLoading, mImageUrls[ imageFrame.mFrameNumber ].mTextureId, textureRect, + synchronousLoading, mImageUrls[ imageFrame.mFrameNumber ].mTextureId, textureRect, textureRectSize, atlasingStatus, loadingStatus, Dali::WrapMode::Type::DEFAULT, Dali::WrapMode::Type::DEFAULT, NULL, atlasObserver, imageAtlasManager, ENABLE_ORIENTATION_CORRECTION, TextureManager::ReloadPolicy::CACHED, preMultiply );