From 7f67a1054372e4c5215620269dd0945e09398169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 3 Dec 2023 00:18:39 +0100 Subject: [PATCH] Texture replacement: Prioritize ini file lines over files in the "root". This reverts back to the old behavior, as mentioned in #18465 --- GPU/Common/TextureReplacer.cpp | 56 +++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/GPU/Common/TextureReplacer.cpp b/GPU/Common/TextureReplacer.cpp index be1fc7fff..cc60129d4 100644 --- a/GPU/Common/TextureReplacer.cpp +++ b/GPU/Common/TextureReplacer.cpp @@ -238,6 +238,34 @@ bool TextureReplacer::LoadIniValues(IniFile &ini, VFSBackend *dir, bool isOverri std::map> filenameMap; std::string badFilenames; + // Scan the root of the texture folder/zip and preinitialize the hash map. + std::vector filesInRoot; + if (dir) { + dir->GetFileListing("", &filesInRoot, nullptr); + for (auto file : filesInRoot) { + if (file.isDirectory) + continue; + if (file.name.empty() || file.name[0] == '.') + continue; + Path path(file.name); + std::string ext = path.GetFileExtension(); + + std::string hash = file.name.substr(0, file.name.size() - ext.size()); + if (!((hash.size() >= 26 && hash.size() <= 27 && hash[24] == '_') || hash.size() == 24)) { + continue; + } + // OK, it's hash-like enough to try to parse it into the map. + if (equalsNoCase(ext, ".ktx2") || equalsNoCase(ext, ".png") || equalsNoCase(ext, ".dds") || equalsNoCase(ext, ".zim")) { + ReplacementCacheKey key(0, 0); + int level = 0; // sscanf might fail to pluck the level, but that's ok, we default to 0. sscanf doesn't write to non-matched outputs. + if (sscanf(hash.c_str(), "%16llx%8x_%d", &key.cachekey, &key.hash, &level) >= 1) { + // INFO_LOG(G3D, "hash-like file in root, adding: %s", file.name.c_str()); + filenameMap[key][level] = file.name; + } + } + } + } + if (ini.HasSection("hashes")) { auto hashes = ini.GetOrCreateSection("hashes")->ToMap(); // Format: hashname = filename.png @@ -278,34 +306,6 @@ bool TextureReplacer::LoadIniValues(IniFile &ini, VFSBackend *dir, bool isOverri } } - // Scan the root of the texture folder/zip and preinitialize the hash map. - std::vector filesInRoot; - if (dir) { - dir->GetFileListing("", &filesInRoot, nullptr); - for (auto file : filesInRoot) { - if (file.isDirectory) - continue; - if (file.name.empty() || file.name[0] == '.') - continue; - Path path(file.name); - std::string ext = path.GetFileExtension(); - - std::string hash = file.name.substr(0, file.name.size() - ext.size()); - if (!((hash.size() >= 26 && hash.size() <= 27 && hash[24] == '_') || hash.size() == 24)) { - continue; - } - // OK, it's hash-like enough to try to parse it into the map. - if (equalsNoCase(ext, ".ktx2") || equalsNoCase(ext, ".png") || equalsNoCase(ext, ".dds") || equalsNoCase(ext, ".zim")) { - ReplacementCacheKey key(0, 0); - int level = 0; // sscanf might fail to pluck the level, but that's ok, we default to 0. sscanf doesn't write to non-matched outputs. - if (sscanf(hash.c_str(), "%16llx%8x_%d", &key.cachekey, &key.hash, &level) >= 1) { - // INFO_LOG(G3D, "hash-like file in root, adding: %s", file.name.c_str()); - filenameMap[key][level] = file.name; - } - } - } - } - // Now, translate the filenameMap to the final aliasMap. for (auto &pair : filenameMap) { std::string alias;