mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-10-11 22:49:56 +00:00
GS: Use C strings for filenames in texture loading
This commit is contained in:
@@ -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<u8>& 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<u8>& 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<u8>& 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;
|
||||
|
||||
|
||||
@@ -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<TextureName> ParseReplacementName(const std::string& filename);
|
||||
static std::optional<TextureName> ParseReplacementName(const char* filename);
|
||||
static std::string GetGameTextureDirectory();
|
||||
static std::string GetDumpFilename(const TextureName& name, u32 level);
|
||||
template <GSTexture::Format format>
|
||||
@@ -189,7 +189,7 @@ GSTextureCache::HashCacheKey GSTextureReplacements::HashCacheKeyFromTextureName(
|
||||
return key;
|
||||
}
|
||||
|
||||
std::optional<TextureName> GSTextureReplacements::ParseReplacementName(const std::string& filename)
|
||||
std::optional<TextureName> GSTextureReplacements::ParseReplacementName(const char* filename)
|
||||
{
|
||||
TextureName ret;
|
||||
ret.miplevel = 0;
|
||||
@@ -197,7 +197,7 @@ std::optional<TextureName> 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<TextureName> 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<TextureName> 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<TextureName> 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<TextureName> 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<TextureName> 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<int>(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
|
||||
|
||||
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user