From bd00c140e430f256b125e87b430a15125dc245d9 Mon Sep 17 00:00:00 2001 From: Sunghyun Kim Date: Tue, 8 Dec 2020 13:39:04 +0900 Subject: [PATCH] Revert "[Tizen] Fix Animated Image Visual issue of using same file in multiple visual" This reverts commit 927bdfc87f83076300cc3df30252af9b0ba4bc90. --- .../internal/visuals/texture-manager-impl.cpp | 32 ++++++++++++++++++---- .../internal/visuals/texture-manager-impl.h | 10 +++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/dali-toolkit/internal/visuals/texture-manager-impl.cpp b/dali-toolkit/internal/visuals/texture-manager-impl.cpp index ea0abc1..2d82b41 100644 --- a/dali-toolkit/internal/visuals/texture-manager-impl.cpp +++ b/dali-toolkit/internal/visuals/texture-manager-impl.cpp @@ -458,15 +458,16 @@ TextureManager::TextureId TextureManager::RequestLoadInternal( TextureHash textureHash = INITIAL_CACHE_NUMBER; int cacheIndex = INVALID_CACHE_INDEX; - if(storageType != StorageType::RETURN_PIXEL_BUFFER && !isAnimatedImage) + if(storageType != StorageType::RETURN_PIXEL_BUFFER) { - textureHash = GenerateHash(url.GetUrl(), desiredSize, fittingMode, samplingMode, useAtlas, maskTextureId); + textureHash = GenerateHash(url.GetUrl(), desiredSize, fittingMode, samplingMode, useAtlas, maskTextureId, isAnimatedImage, frameIndex); // Look up the texture by hash. Note: The extra parameters are used in case of a hash collision. - cacheIndex = FindCachedTexture(textureHash, url.GetUrl(), desiredSize, fittingMode, samplingMode, useAtlas, maskTextureId, preMultiplyOnLoad); + cacheIndex = FindCachedTexture(textureHash, url.GetUrl(), desiredSize, fittingMode, samplingMode, useAtlas, maskTextureId, preMultiplyOnLoad, isAnimatedImage, frameIndex); } TextureManager::TextureId textureId = INVALID_TEXTURE_ID; + // Check if the requested Texture exists in the cache. if( cacheIndex != INVALID_CACHE_INDEX ) { @@ -1174,7 +1175,9 @@ TextureManager::TextureHash TextureManager::GenerateHash( const FittingMode::Type fittingMode, const Dali::SamplingMode::Type samplingMode, const UseAtlas useAtlas, - TextureId maskTextureId) + TextureId maskTextureId, + bool isAnimationImage, + uint32_t frameIndex ) { std::string hashTarget( url ); const size_t urlLength = hashTarget.length(); @@ -1219,6 +1222,19 @@ TextureManager::TextureHash TextureManager::GenerateHash( } } + if( isAnimationImage ) + { + auto textureIdIndex = hashTarget.length(); + hashTarget.resize( hashTarget.length() + sizeof( uint32_t ) ); + char* hashTargetPtr = &( hashTarget[ textureIdIndex ] ); + + for( size_t byteIter = 0; byteIter < sizeof( uint32_t ); ++byteIter ) + { + *hashTargetPtr++ = frameIndex & 0xff; + frameIndex >>= 8u; + } + } + if( maskTextureId != INVALID_TEXTURE_ID ) { auto textureIdIndex = hashTarget.length(); @@ -1245,7 +1261,9 @@ int TextureManager::FindCachedTexture( const Dali::SamplingMode::Type samplingMode, const bool useAtlas, TextureId maskTextureId, - TextureManager::MultiplyOnLoad preMultiplyOnLoad) + TextureManager::MultiplyOnLoad preMultiplyOnLoad, + bool isAnimatedImage, + uint32_t frameIndex ) { // Default to an invalid ID, in case we do not find a match. int cacheIndex = INVALID_CACHE_INDEX; @@ -1265,7 +1283,9 @@ int TextureManager::FindCachedTexture( ( size == textureInfo.desiredSize ) && ( ( size.GetWidth() == 0 && size.GetHeight() == 0 ) || ( fittingMode == textureInfo.fittingMode && - samplingMode == textureInfo.samplingMode ) ) ) + samplingMode == textureInfo.samplingMode ) ) && + ( isAnimatedImage == ( ( textureInfo.animatedImageLoading ) ? true : false ) ) && + ( frameIndex == textureInfo.frameIndex ) ) { // 1. If preMultiplyOnLoad is MULTIPLY_ON_LOAD, then textureInfo.preMultiplyOnLoad should be true. The premultiplication result can be different. // 2. If preMultiplyOnLoad is LOAD_WITHOUT_MULTIPLY, then textureInfo.preMultiplied should be false. diff --git a/dali-toolkit/internal/visuals/texture-manager-impl.h b/dali-toolkit/internal/visuals/texture-manager-impl.h index 28e0869..a3da3fc 100644 --- a/dali-toolkit/internal/visuals/texture-manager-impl.h +++ b/dali-toolkit/internal/visuals/texture-manager-impl.h @@ -752,12 +752,14 @@ private: * @param[in] samplingMode The SamplingMode to use * @param[in] useAtlas True if atlased * @param[in] maskTextureId The masking texture id (or INVALID_TEXTURE_ID) + * @param[in] isAnimatedImage The boolean value to know whether the request is for animated image or not + * @param[in] frameIndex The frame index of a frame to be loaded frame * @return A hash of the provided data for caching. */ TextureHash GenerateHash( const std::string& url, const ImageDimensions size, const FittingMode::Type fittingMode, const Dali::SamplingMode::Type samplingMode, const UseAtlas useAtlas, - TextureId maskTextureId ); + TextureId maskTextureId, bool isAnimatedImage, uint32_t frameIndex ); /** * @brief Looks up a cached texture by its hash. @@ -770,6 +772,8 @@ private: * @param[in] useAtlas True if atlased * @param[in] maskTextureId Optional texture ID to use to mask this image * @param[in] preMultiplyOnLoad if the image's color should be multiplied by it's alpha. Set to OFF if there is no alpha. + * @param[in] isAnimatedImage The boolean value to know whether the request is for animated image or not + * @param[in] frameIndex The frame index of a frame to be loaded frame * @return A TextureId of a cached Texture if found. Or INVALID_TEXTURE_ID if not found. */ TextureManager::TextureId FindCachedTexture( @@ -780,7 +784,9 @@ private: const Dali::SamplingMode::Type samplingMode, const bool useAtlas, TextureId maskTextureId, - MultiplyOnLoad preMultiplyOnLoad); + MultiplyOnLoad preMultiplyOnLoad, + bool isAnimatedImage, + uint32_t frameIndex ); private: -- 2.7.4