Cleanup texture saving a bit

This commit is contained in:
Henrik Rydgård 2023-03-10 15:39:45 +01:00
parent f459a8f71a
commit 207e2259e7
2 changed files with 30 additions and 26 deletions

View file

@ -671,8 +671,11 @@ public:
int h = 0; int h = 0;
int pitch = 0; // bytes int pitch = 0; // bytes
Path basePath; Path filename;
std::string hashfile; Path saveFilename;
bool createSaveDirectory;
Path saveDirectory;
u32 replacedInfoHash = 0; u32 replacedInfoHash = 0;
bool skipIfExists = false; bool skipIfExists = false;
@ -687,9 +690,6 @@ public:
} }
void Run() override { void Run() override {
const Path filename = basePath / hashfile;
const Path saveFilename = basePath / NEW_TEXTURE_DIR / hashfile;
// Should we skip writing if the newly saved data already exists? // Should we skip writing if the newly saved data already exists?
if (skipIfExists && File::Exists(saveFilename)) { if (skipIfExists && File::Exists(saveFilename)) {
return; return;
@ -699,19 +699,9 @@ public:
if (File::Exists(filename)) if (File::Exists(filename))
return; return;
// Create subfolder as needed. if (createSaveDirectory && !File::Exists(saveDirectory)) {
#ifdef _WIN32 File::CreateFullPath(saveDirectory);
size_t slash = hashfile.find_last_of("/\\"); File::CreateEmptyFile(saveDirectory / ".nomedia");
#else
size_t slash = hashfile.find_last_of("/");
#endif
if (slash != hashfile.npos) {
// Create any directory structure as needed.
const Path saveDirectory = basePath / NEW_TEXTURE_DIR / hashfile.substr(0, slash);
if (!File::Exists(saveDirectory)) {
File::CreateFullPath(saveDirectory);
File::CreateEmptyFile(saveDirectory / ".nomedia");
}
} }
png_image png{}; png_image png{};
@ -771,8 +761,6 @@ void TextureReplacer::NotifyTextureDecoded(const ReplacedTextureDecodeInfo &repl
// Generate a new PNG filename, complete with level. // Generate a new PNG filename, complete with level.
hashfile = HashName(cachekey, replacedInfo.hash, level) + ".png"; hashfile = HashName(cachekey, replacedInfo.hash, level) + ".png";
const Path filename = newTextureDir_ / hashfile;
ReplacementCacheKey replacementKey(cachekey, replacedInfo.hash); ReplacementCacheKey replacementKey(cachekey, replacedInfo.hash);
auto it = savedCache_.find(replacementKey); auto it = savedCache_.find(replacementKey);
bool skipIfExists = false; bool skipIfExists = false;
@ -808,11 +796,27 @@ void TextureReplacer::NotifyTextureDecoded(const ReplacedTextureDecodeInfo &repl
pitch = w * 4; pitch = w * 4;
SaveTextureTask *task = new SaveTextureTask(std::move(saveBuf)); SaveTextureTask *task = new SaveTextureTask(std::move(saveBuf));
task->filename = basePath_ / hashfile;
task->saveFilename = newTextureDir_ / hashfile;
task->createSaveDirectory = false;
// Create subfolder as needed.
#ifdef _WIN32
size_t slash = hashfile.find_last_of("/\\");
#else
size_t slash = hashfile.find_last_of("/");
#endif
if (slash != hashfile.npos) {
// Does this ever happen?
// Create any directory structure as needed.
task->saveDirectory = newTextureDir_ / hashfile.substr(0, slash);
task->createSaveDirectory = true;
}
task->w = w; task->w = w;
task->h = h; task->h = h;
task->pitch = pitch; task->pitch = pitch;
task->basePath = basePath_;
task->hashfile = hashfile;
task->replacedInfoHash = replacedInfo.hash; task->replacedInfoHash = replacedInfo.hash;
task->skipIfExists = skipIfExists; task->skipIfExists = skipIfExists;
g_threadManager.EnqueueTask(task); // We don't care about waiting for the task. It'll be fine. g_threadManager.EnqueueTask(task); // We don't care about waiting for the task. It'll be fine.
@ -923,16 +927,16 @@ bool TextureReplacer::FindFiltering(u64 cachekey, u32 hash, TextureFiltering *fo
return false; return false;
} }
std::string TextureReplacer::LookupHashFile(u64 cachekey, u32 hash, bool *foundReplacement, bool *ignored) { std::string TextureReplacer::LookupHashFile(u64 cachekey, u32 hash, bool *foundAlias, bool *ignored) {
ReplacementCacheKey key(cachekey, hash); ReplacementCacheKey key(cachekey, hash);
auto alias = LookupWildcard(aliases_, key, cachekey, hash, ignoreAddress_); auto alias = LookupWildcard(aliases_, key, cachekey, hash, ignoreAddress_);
if (alias != aliases_.end()) { if (alias != aliases_.end()) {
// Note: this will be blank if explicitly ignored. // Note: this will be blank if explicitly ignored.
*foundReplacement = true; *foundAlias = true;
*ignored = alias->second.empty(); *ignored = alias->second.empty();
return alias->second; return alias->second;
} }
*foundReplacement = false; *foundAlias = false;
*ignored = false; *ignored = false;
return ""; return "";
} }

View file

@ -137,7 +137,7 @@ protected:
void ParseReduceHashRange(const std::string& key, const std::string& value); void ParseReduceHashRange(const std::string& key, const std::string& value);
bool LookupHashRange(u32 addr, int &w, int &h); bool LookupHashRange(u32 addr, int &w, int &h);
float LookupReduceHashRange(int& w, int& h); float LookupReduceHashRange(int& w, int& h);
std::string LookupHashFile(u64 cachekey, u32 hash, bool *foundReplacement, bool *ignored); std::string LookupHashFile(u64 cachekey, u32 hash, bool *foundAlias, bool *ignored);
std::string HashName(u64 cachekey, u32 hash, int level); std::string HashName(u64 cachekey, u32 hash, int level);
void PopulateReplacement(ReplacedTexture *result, u64 cachekey, u32 hash, int w, int h); void PopulateReplacement(ReplacedTexture *result, u64 cachekey, u32 hash, int w, int h);
bool PopulateLevel(ReplacedTextureLevel &level, bool ignoreError); bool PopulateLevel(ReplacedTextureLevel &level, bool ignoreError);