From a0f2cce9e7bd65a0d7c9b6a6d125b5cf0af1d21e Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 24 Feb 2022 01:54:23 +0900 Subject: [PATCH] Make TextureHash as buffer Previous hashTarget use std::string, and Dali::CalculateHash function use .c_str() internally. This logic will ignore zero values. For example, when desired_width is 256, TextureHash result will ignore whole informations about desired_size, fittingMode, maskId, etc. This patch Fix that problem so we can seperate un-matched textures and also reduce hash collision. Change-Id: I95526f7144991e630ac0d19abaefc50175b4317a Signed-off-by: Eunki, Hong --- .../internal/texture-manager/texture-cache-manager.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp b/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp index 3fe5105..bdc0b6a 100644 --- a/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp +++ b/dali-toolkit/internal/texture-manager/texture-cache-manager.cpp @@ -328,17 +328,17 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash( const TextureCacheManager::UseAtlas& useAtlas, const TextureCacheManager::TextureId& maskTextureId) { - std::string hashTarget(url); - const size_t urlLength = hashTarget.length(); - const uint16_t width = size.GetWidth(); - const uint16_t height = size.GetWidth(); + std::vector hashTarget(url.begin(), url.end()); + const size_t urlLength = url.length(); + 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); - char* hashTargetPtr = &(hashTarget[urlLength]); + std::uint8_t* hashTargetPtr = &(hashTarget[urlLength]); // Pack the width and height (4 bytes total). *hashTargetPtr++ = size.GetWidth() & 0xff; @@ -373,9 +373,9 @@ TextureCacheManager::TextureHash TextureCacheManager::GenerateHash( if(maskTextureId != INVALID_TEXTURE_ID) { - auto textureIdIndex = hashTarget.length(); - hashTarget.resize(hashTarget.length() + sizeof(TextureId)); - unsigned char* hashTargetPtr = reinterpret_cast(&(hashTarget[textureIdIndex])); + auto textureIdIndex = hashTarget.size(); + hashTarget.resize(hashTarget.size() + sizeof(TextureId)); + std::uint8_t* hashTargetPtr = reinterpret_cast(&(hashTarget[textureIdIndex])); // Append the texture id to the end of the URL byte by byte: // (to avoid SIGBUS / alignment issues) -- 2.7.4