X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fanimated-image%2Frolling-image-cache.cpp;h=dee6149c16216cea1ba056366d24df1aaf022767;hp=8abe05998f349ba0f763ab6cc1a8a81ea624b3e9;hb=8c45458b64211285df3df591dfcb628126a1bc0e;hpb=bfd6c56d4d17e2bf752845693e2df370444a6ebf diff --git a/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp index 8abe059..dee6149 100644 --- a/dali-toolkit/internal/visuals/animated-image/rolling-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/rolling-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. @@ -18,6 +18,7 @@ #include // INTERNAL HEADERS +#include // For ImageAtlasManagerPtr #include // EXTERNAL HEADERS @@ -45,6 +46,9 @@ Debug::Filter* gAnimImgLogFilter = Debug::Filter::New(Debug::NoLogging, false, " #else #define LOG_CACHE #endif + +const bool ENABLE_ORIENTATION_CORRECTION( true ); + } namespace Dali @@ -57,7 +61,8 @@ namespace Internal RollingImageCache::RollingImageCache( TextureManager& textureManager, UrlList& urlList, ImageCache::FrameReadyObserver& observer, uint16_t cacheSize, uint16_t batchSize ) -: ImageCache( textureManager, urlList, observer, batchSize ), +: ImageCache( textureManager, observer, batchSize ), + mImageUrls( urlList ), mQueue( cacheSize ) { LoadBatch(); @@ -65,18 +70,55 @@ RollingImageCache::RollingImageCache( RollingImageCache::~RollingImageCache() { - while( !mQueue.IsEmpty() ) + if( mTextureManagerAlive ) { - ImageFrame imageFrame = mQueue.PopFront(); - mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId ); + while( !mQueue.IsEmpty() ) + { + ImageFrame imageFrame = mQueue.PopFront(); + mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId, this ); + } } } -TextureSet RollingImageCache::FirstFrame() +TextureSet RollingImageCache::Frame( uint32_t frameIndex ) { - TextureSet textureSet = GetFrontTextureSet(); + // If a frame of frameIndex is not loaded, clear the queue and remove all loaded textures. + if( mImageUrls[ frameIndex ].mTextureId == TextureManager::INVALID_TEXTURE_ID ) + { + mUrlIndex = frameIndex; + while( !mQueue.IsEmpty() ) + { + ImageFrame imageFrame = mQueue.PopFront(); + mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId, this ); + mImageUrls[ imageFrame.mUrlIndex ].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().mUrlIndex != frameIndex ) + { + ImageFrame imageFrame = mQueue.PopFront(); + mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId, this ); + mImageUrls[ imageFrame.mUrlIndex ].mTextureId = TextureManager::INVALID_TEXTURE_ID; + popExist = true; + } + if( popExist ) + { + mUrlIndex = ( mQueue.Back().mUrlIndex + 1 ) % mImageUrls.size(); + LoadBatch(); + } + } - if( ! textureSet ) + TextureSet textureSet; + if( IsFrontReady() == true ) + { + textureSet = GetFrontTextureSet(); + } + else { mWaitingForReadyFrame = true; } @@ -84,28 +126,50 @@ TextureSet RollingImageCache::FirstFrame() return textureSet; } +TextureSet RollingImageCache::FirstFrame() +{ + return Frame( 0u ); +} + TextureSet RollingImageCache::NextFrame() { TextureSet textureSet; - - ImageFrame imageFrame = mQueue.PopFront(); - mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId ); - mImageUrls[ imageFrame.mUrlIndex ].mTextureId = TextureManager::INVALID_TEXTURE_ID; - - if( IsFrontReady() == true ) + if(!mQueue.IsEmpty()) { - textureSet = GetFrontTextureSet(); + uint32_t frameIndex = mQueue.Front().mUrlIndex; + if(IsFrontReady()) + { + frameIndex = (frameIndex + 1) % mImageUrls.size(); + } + textureSet = Frame(frameIndex); } else { - mWaitingForReadyFrame = true; + DALI_LOG_ERROR("Cache is empty."); } - LoadBatch(); - return textureSet; } +uint32_t RollingImageCache::GetFrameInterval( uint32_t frameIndex ) const +{ + return 0u; +} + +int32_t RollingImageCache::GetCurrentFrameIndex() const +{ + if(mQueue.IsEmpty()) + { + return -1; + } + return mQueue.Front().mUrlIndex; +} + +int32_t RollingImageCache::GetTotalFrameCount() const +{ + return mImageUrls.size(); +} + bool RollingImageCache::IsFrontReady() const { return ( !mQueue.IsEmpty() && mQueue.Front().mReady ); @@ -116,7 +180,7 @@ void RollingImageCache::LoadBatch() // Try and load up to mBatchSize images, until the cache is filled. // Once the cache is filled, as frames progress, the old frame is // cleared, but not erased, and another image is loaded - bool frontFrameReady = IsFrontReady();; + bool frontFrameReady = IsFrontReady(); for( unsigned int i=0; i< mBatchSize && !mQueue.IsFull(); ++i ) { @@ -136,10 +200,25 @@ void RollingImageCache::LoadBatch() // need to account for this inside the UploadComplete method using mRequestingLoad. mRequestingLoad = true; - mImageUrls[ imageFrame.mUrlIndex ].mTextureId = - mTextureManager.RequestLoad( url, ImageDimensions(), FittingMode::SCALE_TO_FILL, - SamplingMode::BOX_THEN_LINEAR, TextureManager::NO_ATLAS, - this ); + bool synchronousLoading = false; + bool atlasingStatus = false; + bool loadingStatus = false; + TextureManager::MaskingDataPointer maskInfo = nullptr; + AtlasUploadObserver* atlasObserver = nullptr; + ImageAtlasManagerPtr imageAtlasManager = nullptr; + Vector4 textureRect; + Dali::ImageDimensions textureRectSize; + auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; + + mTextureManager.LoadTexture( + url, ImageDimensions(), FittingMode::SCALE_TO_FILL, + SamplingMode::BOX_THEN_LINEAR, maskInfo, + synchronousLoading, mImageUrls[ imageFrame.mUrlIndex ].mTextureId, textureRect, textureRectSize, + atlasingStatus, loadingStatus, Dali::WrapMode::Type::DEFAULT, + Dali::WrapMode::Type::DEFAULT, this, + atlasObserver, imageAtlasManager, ENABLE_ORIENTATION_CORRECTION, TextureManager::ReloadPolicy::CACHED, + preMultiply ); + mRequestingLoad = false; } @@ -183,7 +262,8 @@ void RollingImageCache::UploadComplete( int32_t textureId, TextureSet textureSet, bool useAtlasing, - const Vector4& atlasRect ) + const Vector4& atlasRect, + bool preMultiplied ) { DALI_LOG_INFO(gAnimImgLogFilter,Debug::Concise,"AnimatedImageVisual::UploadComplete(textureId:%d) start\n", textureId); LOG_CACHE; @@ -207,6 +287,17 @@ void RollingImageCache::UploadComplete( LOG_CACHE; } +void RollingImageCache::LoadComplete( + bool loadSuccess, + Devel::PixelBuffer pixelBuffer, + const VisualUrl& url, + bool preMultiplied ) +{ + // LoadComplete is called if this TextureUploadObserver requested to load + // an image that will be returned as a type of PixelBuffer by using a method + // TextureManager::LoadPixelBuffer. +} + } //namespace Internal } //namespace Toolkit } //namespace Dali