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<std::uint8_t> 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<std::uint8_t> 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;
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;
}
}
*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<std::uint8_t*>(&(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(
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);
(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)))