diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp b/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp index cc94782d2a..19caaf11f9 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacementLoaders.cpp @@ -19,8 +19,8 @@ struct LoaderDefinition GSTextureReplacements::ReplacementTextureLoader loader; }; -static bool PNGLoader(const std::string& filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); -static bool DDSLoader(const std::string& filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); +static bool PNGLoader(const char* filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); +static bool DDSLoader(const char* filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); static constexpr LoaderDefinition s_loaders[] = { {"png", PNGLoader}, @@ -146,7 +146,7 @@ static void ConvertTexture_R8G8B8(u32 width, u32 height, std::vector& data, // PNG Handlers //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool PNGLoader(const std::string& filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image) +bool PNGLoader(const char* filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image) { png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!png_ptr) @@ -163,7 +163,7 @@ bool PNGLoader(const std::string& filename, GSTextureReplacements::ReplacementTe png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); }); - auto fp = FileSystem::OpenManagedCFile(filename.c_str(), "rb"); + auto fp = FileSystem::OpenManagedCFile(filename, "rb"); if (!fp) return false; @@ -568,7 +568,7 @@ static bool ParseDDSHeader(std::FILE* fp, DDSLoadInfo* info) return true; } -static bool ReadDDSMipLevel(std::FILE* fp, const std::string& filename, u32 mip_level, const DDSLoadInfo& info, u32 width, u32 height, std::vector& data, u32& pitch, u32 size) +static bool ReadDDSMipLevel(std::FILE* fp, const char* filename, u32 mip_level, const DDSLoadInfo& info, u32 width, u32 height, std::vector& data, u32& pitch, u32 size) { // D3D11 cannot handle block compressed textures where the first mip level is // not a multiple of the block size. @@ -578,7 +578,7 @@ static bool ReadDDSMipLevel(std::FILE* fp, const std::string& filename, u32 mip_ Console.Error( "Invalid dimensions for DDS texture %s. For compressed textures of this format, " "the width/height of the first mip level must be a multiple of %u.", - filename.c_str(), info.block_size); + filename, info.block_size); return false; } @@ -593,9 +593,9 @@ static bool ReadDDSMipLevel(std::FILE* fp, const std::string& filename, u32 mip_ return true; } -bool DDSLoader(const std::string& filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image) +bool DDSLoader(const char* filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image) { - auto fp = FileSystem::OpenManagedCFile(filename.c_str(), "rb"); + auto fp = FileSystem::OpenManagedCFile(filename, "rb"); if (!fp) return false; diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp b/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp index 41c98cac85..da8b873edd 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacements.cpp @@ -102,7 +102,7 @@ namespace GSTextureReplacements { static TextureName CreateTextureName(const GSTextureCache::HashCacheKey& hash, u32 miplevel); static GSTextureCache::HashCacheKey HashCacheKeyFromTextureName(const TextureName& tn); - static std::optional ParseReplacementName(const std::string& filename); + static std::optional ParseReplacementName(const char* filename); static std::string GetGameTextureDirectory(); static std::string GetDumpFilename(const TextureName& name, u32 level); template @@ -189,7 +189,7 @@ GSTextureCache::HashCacheKey GSTextureReplacements::HashCacheKeyFromTextureName( return key; } -std::optional GSTextureReplacements::ParseReplacementName(const std::string& filename) +std::optional GSTextureReplacements::ParseReplacementName(const char* filename) { TextureName ret; ret.miplevel = 0; @@ -197,7 +197,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std GSTextureCache::SourceRegion full_region; char extension_dot; - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_REGION_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, + if (std::sscanf(filename, TEXTURE_FILENAME_REGION_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, &ret.region_width, &ret.region_height, &ret.bits, &extension_dot) == 6 && extension_dot == '.') { @@ -205,7 +205,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std return ret; } - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_REGION_FORMAT_STRING "%c", &ret.TEX0Hash, + if (std::sscanf(filename, TEXTURE_FILENAME_REGION_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.region_width, &ret.region_height, &ret.bits, &extension_dot) == 5 && extension_dot == '.') { @@ -215,7 +215,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std } // Allow loading of dumped textures from older versions that included the full region bits. - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_OLD_REGION_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, + if (std::sscanf(filename, TEXTURE_FILENAME_OLD_REGION_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, &full_region.bits, &ret.bits, &extension_dot) == 5 && extension_dot == '.') { @@ -225,7 +225,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std return ret; } - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_OLD_REGION_FORMAT_STRING "%c", &ret.TEX0Hash, &full_region.bits, + if (std::sscanf(filename, TEXTURE_FILENAME_OLD_REGION_FORMAT_STRING "%c", &ret.TEX0Hash, &full_region.bits, &ret.bits, &extension_dot) == 4 && extension_dot == '.') { @@ -239,7 +239,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std ret.region_width = 0; ret.region_height = 0; - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, &ret.bits, + if (std::sscanf(filename, TEXTURE_FILENAME_CLUT_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.CLUTHash, &ret.bits, &extension_dot) == 4 && extension_dot == '.') { @@ -247,8 +247,7 @@ std::optional GSTextureReplacements::ParseReplacementName(const std return ret; } - if (std::sscanf(filename.c_str(), TEXTURE_FILENAME_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.bits, &extension_dot) == - 3 && + if (std::sscanf(filename, TEXTURE_FILENAME_FORMAT_STRING "%c", &ret.TEX0Hash, &ret.bits, &extension_dot) == 3 && extension_dot == '.') { ret.RemoveUnusedBits(); @@ -416,11 +415,10 @@ void GSTextureReplacements::ReloadReplacementMap() if (!FileSystem::FindFiles(replacement_dir.c_str(), "*", FILESYSTEM_FIND_FILES | FILESYSTEM_FIND_HIDDEN_FILES | FILESYSTEM_FIND_RECURSIVE, &files)) return; - std::string filename; for (FILESYSTEM_FIND_DATA& fd : files) { // file format we can handle? - filename = Path::GetFileName(fd.FileName); + const char* filename = Path::GetFileName(fd.FileName).data(); // GetFileName takes a substring from the end, so the null terminator is preserved if (!GetLoader(filename)) continue; @@ -429,7 +427,7 @@ void GSTextureReplacements::ReloadReplacementMap() if (!name.has_value()) continue; - DbgCon.WriteLn("Found %ux%u replacement '%.*s'", name->Width(), name->Height(), static_cast(filename.size()), filename.data()); + DbgCon.WriteLn("Found %ux%u replacement '%s'", name->Width(), name->Height(), filename); s_replacement_texture_filenames.emplace(name.value(), std::move(fd.FileName)); // zero out the CLUT hash, because we need this for checking if there's any replacements with this hash when using paltex diff --git a/pcsx2/GS/Renderers/HW/GSTextureReplacements.h b/pcsx2/GS/Renderers/HW/GSTextureReplacements.h index ef176ed376..9387e26617 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureReplacements.h +++ b/pcsx2/GS/Renderers/HW/GSTextureReplacements.h @@ -54,7 +54,7 @@ namespace GSTextureReplacements u32 GetLoadedTextureCount(); /// Loader will take a filename and interpret the format (e.g. DDS, PNG, etc). - using ReplacementTextureLoader = bool (*)(const std::string& filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); + using ReplacementTextureLoader = bool (*)(const char* filename, GSTextureReplacements::ReplacementTexture* tex, bool only_base_image); ReplacementTextureLoader GetLoader(const std::string_view filename); /// Saves an image buffer to a PNG file (for dumping).