Skip to content
This repository was archived by the owner on Feb 15, 2024. It is now read-only.

Commit e9b90f2

Browse files
committed
FSB: extend "missing texture" to corrupted png files
1 parent d5b5451 commit e9b90f2

File tree

1 file changed

+32
-15
lines changed

1 file changed

+32
-15
lines changed

src/fsb.cpp

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,34 @@ namespace fsb
1717
{
1818
// check and handle lodepng error
1919
// @param i error code
20-
static void checkError(const unsigned int i)
20+
static inline unsigned int checkError(const unsigned int i)
2121
{
2222
if (i != 0)
2323
{
2424
output<level_t::error>("FSB: png error: {}", lodepng_error_text(i));
2525
}
2626
checkpoint();
27+
return i;
28+
}
29+
30+
static inline void texture_not_found(const std::filesystem::path& path, const bool overworldsky, const std::filesystem::path& save_dir, const std::u8string& sourcefile)
31+
{
32+
std::vector<uint8_t> buffer;
33+
lodepng::State state;
34+
state.info_png.color.colortype = LCT_RGBA;
35+
state.info_png.color.bitdepth = 8;
36+
state.encoder.auto_convert = false;
37+
38+
mcpppp::output<level_t::info>("(warn) FSB: File not found: {}.png", c8tomb(sourcefile));
39+
std::filesystem::create_directories(save_dir);
40+
lodepng::encode(buffer, { 0, 0, 0, 1 }, 1, 1, state);
41+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_top" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
42+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_bottom" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
43+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_north" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
44+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_south" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
45+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_west" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
46+
lodepng::save_file(buffer, c8tomb((save_dir / (sourcefile + u8"_east" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
47+
checkpoint();
2748
}
2849

2950
// convert optifine image format (1 image for all 6 sides) into fsb image format (1 image per side)
@@ -58,9 +79,16 @@ namespace fsb
5879
state.info_raw.bitdepth = 8;
5980

6081
// don't let decode modify original state (later used for encoding)
82+
// TODO: if unable to load/decode, create 1x1 transparent image
6183
auto state_copy = state;
6284
checkError(lodepng::load_file(buffer, c8tomb(entry.path().generic_u8string())));
63-
checkError(lodepng::decode(image, w, h, state_copy, buffer));
85+
unsigned int err = checkError(lodepng::decode(image, w, h, state_copy, buffer));
86+
if (err)
87+
{
88+
output<level_t::error>("FSB: corrupted png file, skipping: {}", c8tomb(entry.path().generic_u8string()));
89+
texture_not_found(path, overworldsky, path / output_path, filename);
90+
return;
91+
}
6492
if (w % 3 != 0 || h % 2 != 0)
6593
{
6694
output<level_t::info>("(warn) FSB: Wrong dimensions: {}\nwill be cropped to proper dimensions", c8tomb(entry.path().generic_u8string()));
@@ -423,7 +451,7 @@ namespace fsb
423451
const std::filesystem::directory_entry image = std::filesystem::directory_entry(std::filesystem::path(image_noext).replace_extension(".png"));
424452
if (image.exists())
425453
{
426-
png(path, overworldsky, u8"assets/fabricskyboxes/sky/" + sourcefolder, image, image_noext.filename().u8string());
454+
png(path, overworldsky, u8"assets/fabricskyboxes/sky/" + sourcefolder, image, sourcefile);
427455
}
428456
else
429457
{
@@ -434,18 +462,7 @@ namespace fsb
434462
{
435463
fsb_save_dir /= sourcefolder;
436464
}
437-
output<level_t::info>("(warn) FSB: File not found: {}.png", c8tomb(sourcefolder + sourcefile));
438-
std::filesystem::create_directories(fsb_save_dir);
439-
lodepng::encode(buffer, { 0, 0, 0, 1 }, 1, 1, state);
440-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_top" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
441-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_bottom" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
442-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_north" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
443-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_south" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
444-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_west" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
445-
lodepng::save_file(buffer, c8tomb((fsb_save_dir / (sourcefile + u8"_east" + (overworldsky ? u8"" : u8"_end") + u8".png")).generic_u8string()));
446-
buffer.clear();
447-
buffer.shrink_to_fit();
448-
checkpoint();
465+
texture_not_found(path, overworldsky, fsb_save_dir, sourcefile);
449466
}
450467
mcpppp::conv::fixpathchars(sourcefolder);
451468
mcpppp::conv::fixpathchars(sourcefile);

0 commit comments

Comments
 (0)