[dali_2.1.40] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / texture-manager / texture-cache-manager.cpp
index 01e43a4..c0e7ac1 100644 (file)
@@ -167,22 +167,20 @@ TextureCacheManager::LoadState TextureCacheManager::GetTextureStateInternal(cons
   return loadState;
 }
 
-TextureSet TextureCacheManager::GetTextureSet(const TextureCacheManager::TextureId& textureId)
+Texture TextureCacheManager::GetTexture(const TextureCacheManager::TextureId& textureId, uint32_t textureIndex)
 {
-  TextureSet        textureSet; // empty handle
-  TextureCacheIndex cacheIndex = static_cast<TextureCacheIndex>(mTextureIdConverter[static_cast<std::uint32_t>(textureId)]);
+  Texture        texture; // empty handle
+  TextureCacheIndex cacheIndex = GetCacheIndexFromId(textureId);
 
   switch(static_cast<TextureCacheIndexType>(cacheIndex.detailValue.type))
   {
     case TextureCacheIndexType::TEXTURE_CACHE_INDEX_TYPE_LOCAL:
     {
       TextureInfo& cachedTextureInfo(mTextureInfoContainer[cacheIndex.GetIndex()]);
-      textureSet = cachedTextureInfo.textureSet;
-      break;
-    }
-    case TextureCacheIndexType::TEXTURE_CACHE_INDEX_TYPE_TEXTURE:
-    {
-      textureSet = mExternalTextures[cacheIndex.GetIndex()].textureSet;
+      if(textureIndex < static_cast<uint32_t>(cachedTextureInfo.textures.size()))
+      {
+        texture = cachedTextureInfo.textures[textureIndex];
+      }
       break;
     }
     default:
@@ -191,7 +189,7 @@ TextureSet TextureCacheManager::GetTextureSet(const TextureCacheManager::Texture
     }
   }
 
-  return textureSet;
+  return texture;
 }
 
 TextureSet TextureCacheManager::GetExternalTextureSet(const TextureCacheManager::TextureId& textureId)
@@ -484,17 +482,16 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash(
   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;
@@ -509,19 +506,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;
       }
     }
@@ -560,7 +557,7 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash(
     }
   }
 
-  return Dali::CalculateHash(hashTarget);
+  return url.GetUrlHash() ^ Dali::CalculateHash(hashTarget);
 }
 
 TextureCacheManager::TextureCacheIndex TextureCacheManager::FindCachedTexture(
@@ -570,6 +567,7 @@ 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,
@@ -594,6 +592,7 @@ 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 &&
@@ -644,61 +643,55 @@ TextureCacheManager::TextureCacheIndex TextureCacheManager::AppendCache(const Te
   return cacheIndex;
 }
 
-void TextureCacheManager::RemoveCache(const TextureCacheManager::TextureId& textureId)
+void TextureCacheManager::RemoveCache(TextureCacheManager::TextureInfo& textureInfo)
 {
-  TextureCacheIndex textureInfoIndex = GetCacheIndexFromId(textureId);
-
+  TextureCacheIndex textureInfoIndex = GetCacheIndexFromId(textureInfo.textureId);
   bool removeTextureInfo = false;
 
-  if(textureInfoIndex != INVALID_CACHE_INDEX)
-  {
-    TextureInfo& textureInfo(mTextureInfoContainer[textureInfoIndex.GetIndex()]);
+  DALI_LOG_INFO(gTextureManagerLogFilter, Debug::Concise, "TextureCacheManager::Remove(textureId:%d) url:%s\n  cacheIdx:%d loadState:%s reference count = %d\n", textureInfo.textureId, textureInfo.url.GetUrl().c_str(), textureInfoIndex.GetIndex(), GET_LOAD_STATE_STRING(textureInfo.loadState), textureInfo.referenceCount);
 
-    DALI_LOG_INFO(gTextureManagerLogFilter, Debug::Concise, "TextureCacheManager::Remove(textureId:%d) url:%s\n  cacheIdx:%d loadState:%s reference count = %d\n", textureId, textureInfo.url.GetUrl().c_str(), textureInfoIndex.GetIndex(), GET_LOAD_STATE_STRING(textureInfo.loadState), textureInfo.referenceCount);
+  // Decrement the reference count and check if this is the last user of this Texture.
+  if(--textureInfo.referenceCount <= 0)
+  {
+    // This is the last remove for this Texture.
+    textureInfo.referenceCount = 0;
 
-    // Decrement the reference count and check if this is the last user of this Texture.
-    if(--textureInfo.referenceCount <= 0)
+    // If loaded, we can remove the TextureInfo and the Atlas (if atlased).
+    if(textureInfo.loadState == LoadState::UPLOADED)
     {
-      // This is the last remove for this Texture.
-      textureInfo.referenceCount = 0;
-
-      // If loaded, we can remove the TextureInfo and the Atlas (if atlased).
-      if(textureInfo.loadState == LoadState::UPLOADED)
-      {
-        if(textureInfo.atlas)
-        {
-          textureInfo.atlas.Remove(textureInfo.atlasRect);
-        }
-        removeTextureInfo = true;
-      }
-      else if(textureInfo.loadState == LoadState::LOADING || textureInfo.loadState == LoadState::MASK_APPLYING)
-      {
-        // We mark the textureInfo for removal.
-        // Once the load has completed, this method will be called again.
-        textureInfo.loadState = LoadState::CANCELLED;
-      }
-      else
+      if(textureInfo.atlas)
       {
-        // In other states, we are not waiting for a load so we are safe to remove the TextureInfo data.
-        removeTextureInfo = true;
+        textureInfo.atlas.Remove(textureInfo.atlasRect);
       }
+      removeTextureInfo = true;
+    }
+    else if(textureInfo.loadState == LoadState::LOADING || textureInfo.loadState == LoadState::MASK_APPLYING)
+    {
+      // We mark the textureInfo for removal.
+      // Once the load has completed, this method will be called again.
+      textureInfo.loadState = LoadState::CANCELLED;
+    }
+    else
+    {
+      // In other states, we are not waiting for a load so we are safe to remove the TextureInfo data.
+      removeTextureInfo = true;
+    }
 
-      // If the state allows us to remove the TextureInfo data, we do so.
-      if(removeTextureInfo)
+    // If the state allows us to remove the TextureInfo data, we do so.
+    if(removeTextureInfo)
+    {
+      // If url location is BUFFER, decrease reference count of EncodedImageBuffer.
+      if(textureInfo.url.IsBufferResource())
       {
-        // If url location is BUFFER, decrease reference count of EncodedImageBuffer.
-        if(textureInfo.url.IsBufferResource())
-        {
-          RemoveEncodedImageBuffer(textureInfo.url.GetUrl());
-        }
+        RemoveEncodedImageBuffer(textureInfo.url.GetUrl());
+      }
 
-        // Permanently remove the textureInfo struct.
+      // Permanently remove the textureInfo struct.
 
-        // Step 1. remove current textureId information in mTextureHashContainer.
-        RemoveHashId(textureInfo.hash, textureId);
-        // Step 2. make textureId is not using anymore. After this job, we can reuse textureId.
-        mTextureIdConverter.Remove(textureId);
-      }
+      // Step 1. remove current textureId information in mTextureHashContainer.
+      RemoveHashId(textureInfo.hash, textureInfo.textureId);
+      // Step 2. make textureId is not using anymore. After this job, we can reuse textureId.
+      mTextureIdConverter.Remove(textureInfo.textureId);
     }
   }