X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftexture-manager%2Ftexture-cache-manager.cpp;h=24a8ea2f380e3a410ff828eeb7d66517f1fb96d6;hb=5a936aac073676657d48db5c42e5d2ad3f5cac9f;hp=a56116113b0330b5bdb700302744ddd6375fa6f4;hpb=b33712a17095254f5a42eb2458c7e2f840fd8a13;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp b/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp index a561161..24a8ea2 100644 --- a/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp +++ b/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp @@ -481,19 +481,19 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash( const Dali::SamplingMode::Type& samplingMode, const TextureCacheManager::UseAtlas& useAtlas, const TextureCacheManager::TextureId& maskTextureId, - const bool& cropToMask) + const bool& cropToMask, + const std::uint32_t& frameIndex) { - std::vector hashTarget(url.GetUrl().begin(), url.GetUrl().end()); - const size_t urlLength = hashTarget.size(); - const uint16_t width = size.GetWidth(); - const uint16_t height = size.GetWidth(); + std::vector hashTarget; + const uint16_t width = size.GetWidth(); + const uint16_t height = size.GetWidth(); // If either the width or height has been specified, include the resizing options in the hash if(width != 0 || height != 0) { // We are appending 5 bytes to the URL to form the hash input. - hashTarget.resize(urlLength + 5u); - std::uint8_t* hashTargetPtr = &(hashTarget[urlLength]); + hashTarget.resize(5u); + std::uint8_t* hashTargetPtr = &(hashTarget[0u]); // Pack the width and height (4 bytes total). *hashTargetPtr++ = size.GetWidth() & 0xff; @@ -508,19 +508,19 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash( else { // We are not including sizing information, but we still need an extra byte for atlasing. - hashTarget.resize(urlLength + 1u); + hashTarget.resize(1u); // Add the atlasing to the hash input. switch(useAtlas) { case UseAtlas::NO_ATLAS: { - hashTarget[urlLength] = 'f'; + hashTarget[0u] = 'f'; break; } case UseAtlas::USE_ATLAS: { - hashTarget[urlLength] = 't'; + hashTarget[0u] = 't'; break; } } @@ -543,7 +543,23 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash( *hashTargetPtr++ = (cropToMask ? 'C' : 'M'); } - return Dali::CalculateHash(hashTarget); + // Append the frameIndex. We don't do additional job when frameIndex = 0u due to the non-animated image case. + if(frameIndex > 0u) + { + auto textureIdIndex = hashTarget.size(); + hashTarget.resize(hashTarget.size() + sizeof(std::uint32_t)); + std::uint8_t* hashTargetPtr = reinterpret_cast(&(hashTarget[textureIdIndex])); + + // Append the frame index to the end of the URL byte by byte: + std::uint32_t saltedFrameIndex = frameIndex; + for(size_t byteIter = 0; byteIter < sizeof(std::uint8_t); ++byteIter) + { + *hashTargetPtr++ = saltedFrameIndex & 0xff; + saltedFrameIndex >>= 8u; + } + } + + return url.GetUrlHash() ^ Dali::CalculateHash(hashTarget); } TextureCacheManager::TextureCacheIndex TextureCacheManager::FindCachedTexture( @@ -553,10 +569,12 @@ TextureCacheManager::TextureCacheIndex TextureCacheManager::FindCachedTexture( const Dali::FittingMode::Type& fittingMode, const Dali::SamplingMode::Type& samplingMode, const TextureCacheManager::UseAtlas& useAtlas, + const StorageType& storageType, const TextureCacheManager::TextureId& maskTextureId, const bool& cropToMask, const TextureCacheManager::MultiplyOnLoad& preMultiplyOnLoad, - const bool& isAnimatedImage) + const bool& isAnimatedImage, + const std::uint32_t& frameIndex) { // Iterate through our hashes to find a match. const auto& hashIterator = mTextureHashContainer.find(hash); @@ -576,6 +594,8 @@ TextureCacheManager::TextureCacheIndex TextureCacheManager::FindCachedTexture( (cropToMask == textureInfo.cropToMask) && (size == textureInfo.desiredSize) && (isAnimatedImage == textureInfo.isAnimatedImageFormat) && + (storageType == textureInfo.storageType) && + (frameIndex == textureInfo.frameIndex) && ((size.GetWidth() == 0 && size.GetHeight() == 0) || (fittingMode == textureInfo.fittingMode && samplingMode == textureInfo.samplingMode)))