From aa9a64dbcc00526cf61dfad20677be5ed372e11d Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 17:42:11 +0200 Subject: [PATCH 1/6] fix(image) linux: fix ICE --- src/image/image.cpp | 202 ++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 100 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index 76f32e490..d0987bad5 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -21,13 +21,14 @@ import :ppm; import :qoi; import :tga; -namespace stdr = std::ranges; +namespace stdr = std::ranges; namespace stdfs = std::filesystem; namespace stormkit::image { namespace details { using namespace stormkit::literals; - inline constexpr auto KTX_HEADER = into(as_bytes, { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }); + inline constexpr auto + KTX_HEADER = into(as_bytes, { 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A }); inline constexpr auto PNG_HEADER = into(as_bytes, { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }); @@ -180,7 +181,7 @@ namespace stormkit::image { ///////////////////////////////////// ///////////////////////////////////// - auto image::load_from_file(const stdfs::path &filepath_, image_codec codec) noexcept -> result { + auto image::load_from_file(const stdfs::path& filepath_, image_codec codec) noexcept -> result { const auto filepath = stdfs::canonical(filepath_); EXPECTS(codec != image_codec::UNKNOWN); @@ -196,40 +197,40 @@ namespace stormkit::image { TryTo(filedata, io::readfile(filepath)); if (codec == image_codec::AUTODETECT) codec = details::filename_to_codec(filepath); switch (codec) { - case image_codec::JPEG: { - TryTo(result, details::load_jpg(filedata)); - *this = std::move(result); - return {}; + case image_codec::JPEG: { + TryTo(result, details::load_jpg(filedata)); + *this = std::move(result); + return {}; } - case image_codec::PNG: { - TryTo(result, details::load_png(filedata)); - *this = std::move(result); - return {}; + case image_codec::PNG: { + TryTo(result, details::load_png(filedata)); + *this = std::move(result); + return {}; } - case image_codec::TARGA: { - TryTo(result, details::load_tga(filedata)); - *this = std::move(result); - return {}; + case image_codec::TARGA: { + TryTo(result, details::load_tga(filedata)); + *this = std::move(result); + return {}; } - case image_codec::PPM: { - TryTo(result, details::load_ppm(filedata)); - *this = std::move(result); - return {}; + case image_codec::PPM: { + TryTo(result, details::load_ppm(filedata)); + *this = std::move(result); + return {}; } - case image_codec::HDR: { - TryTo(result, details::load_hdr(filedata)); - *this = std::move(result); - return {}; + case image_codec::HDR: { + TryTo(result, details::load_hdr(filedata)); + *this = std::move(result); + return {}; } - case image_codec::KTX: { - TryTo(result, details::load_ktx(filedata)); - *this = std::move(result); - return {}; + case image_codec::KTX: { + TryTo(result, details::load_ktx(filedata)); + *this = std::move(result); + return {}; } - case image_codec::QOI: { - TryTo(result, details::load_qoi(filedata)); - *this = std::move(result); - return {}; + case image_codec::QOI: { + TryTo(result, details::load_qoi(filedata)); + *this = std::move(result); + return {}; } default: break; } @@ -260,40 +261,40 @@ namespace stormkit::image { // "Failed to load image\n > Invalid format" }; if (codec == image_codec::AUTODETECT) codec = details::header_to_codec(data); switch (codec) { - case image_codec::JPEG: { - TryTo(result, details::load_jpg(data)); - *this = std::move(result); - return {}; + case image_codec::JPEG: { + TryTo(result, details::load_jpg(data)); + *this = std::move(result); + return {}; } - case image_codec::PNG: { - TryTo(result, details::load_png(data)); - *this = std::move(result); - return {}; + case image_codec::PNG: { + TryTo(result, details::load_png(data)); + *this = std::move(result); + return {}; } - case image_codec::TARGA: { - TryTo(result, details::load_tga(data)); - *this = std::move(result); - return {}; + case image_codec::TARGA: { + TryTo(result, details::load_tga(data)); + *this = std::move(result); + return {}; } - case image_codec::PPM: { - TryTo(result, details::load_ppm(data)); - *this = std::move(result); - return {}; + case image_codec::PPM: { + TryTo(result, details::load_ppm(data)); + *this = std::move(result); + return {}; } - case image_codec::HDR: { - TryTo(result, details::load_hdr(data)); - *this = std::move(result); - return {}; + case image_codec::HDR: { + TryTo(result, details::load_hdr(data)); + *this = std::move(result); + return {}; } - case image_codec::KTX: { - TryTo(result, details::load_ktx(data)); - *this = std::move(result); - return {}; + case image_codec::KTX: { + TryTo(result, details::load_ktx(data)); + *this = std::move(result); + return {}; } - case image_codec::QOI: { - TryTo(result, details::load_qoi(data)); - *this = std::move(result); - return {}; + case image_codec::QOI: { + TryTo(result, details::load_qoi(data)); + *this = std::move(result); + return {}; } default: break; } @@ -303,7 +304,7 @@ namespace stormkit::image { ///////////////////////////////////// ///////////////////////////////////// - auto image::save_to_file(const stdfs::path &filepath_, image_codec codec, image_codec_format format) const noexcept + auto image::save_to_file(const stdfs::path& filepath_, image_codec codec, image_codec_format format) const noexcept -> result { auto filepath = stdfs::canonical(filepath_.parent_path()) / filepath_.filename(); @@ -314,26 +315,26 @@ namespace stormkit::image { EXPECTS(stdfs::exists(filepath.root_directory())); switch (codec) { - case image_codec::JPEG: { - return details::save_jpg(*this, filepath); + case image_codec::JPEG: { + return details::save_jpg(*this, filepath); } - case image_codec::PNG: { - return details::save_png(*this, filepath); + case image_codec::PNG: { + return details::save_png(*this, filepath); } - case image_codec::TARGA: { - return details::save_tga(*this, filepath); + case image_codec::TARGA: { + return details::save_tga(*this, filepath); } - case image_codec::PPM: { - return details::save_ppm(*this, format, filepath); + case image_codec::PPM: { + return details::save_ppm(*this, format, filepath); } - case image_codec::HDR: { - return details::save_hdr(*this, filepath); + case image_codec::HDR: { + return details::save_hdr(*this, filepath); } - case image_codec::KTX: { - return details::save_ktx(*this, filepath); + case image_codec::KTX: { + return details::save_ktx(*this, filepath); } - case image_codec::QOI: { - return details::save_qoi(*this, filepath); + case image_codec::QOI: { + return details::save_qoi(*this, filepath); } default: break; } @@ -351,33 +352,34 @@ namespace stormkit::image { auto output = dynarray {}; switch (codec) { - case image_codec::JPEG: { - TryTo(result, details::save_jpg(*this)); - return {std::move(result)}; + case image_codec::JPEG: { + TryTo(result, details::save_jpg(*this)); + return { std::move(result) }; } - case image_codec::PNG: { - TryTo(result, details::save_png(*this)); - return {std::move(result)}; + case image_codec::PNG: { + TryTo(result, details::save_png(*this)); + return { std::move(result) }; } - case image_codec::TARGA: { - TryTo(result, details::save_tga(*this)); - return {std::move(result)}; + case image_codec::TARGA: { + TryTo(result, details::save_tga(*this)); + return { std::move(result) }; } - case image_codec::PPM: { - TryTo(result, details::save_ppm(*this, format)); - return {std::move(result)}; + case image_codec::PPM: { + TryTo(result, (details::save_ppm(*this, format))); + + return { std::move(result) }; } - case image_codec::HDR: { - TryTo(result, details::save_hdr(*this)); - return {std::move(result)}; + case image_codec::HDR: { + TryTo(result, details::save_hdr(*this)); + return { std::move(result) }; } - case image_codec::KTX: { - TryTo(result, details::save_ktx(*this)); - return {std::move(result)}; + case image_codec::KTX: { + TryTo(result, details::save_ktx(*this)); + return { std::move(result) }; } - case image_codec::QOI: { - TryTo(result, details::save_qoi(*this)); - return {std::move(result)}; + case image_codec::QOI: { + TryTo(result, details::save_qoi(*this)); + return { std::move(result) }; } default: break; } @@ -439,13 +441,13 @@ namespace stormkit::image { for (auto [layer, face, level, i] : multi_range(new_image.layers(), new_image.faces(), new_image.layers(), pixel_count)) { const auto new_from_image = details::map(pixel(as(i), layer, face, level), - m_data.bytes_per_channel, - new_image.bytes_per_channel()); + m_data.bytes_per_channel, + new_image.bytes_per_channel()); auto new_to_image = new_image.pixel(as(i), layer, face, level); stdr::copy_n(stdr::begin(new_from_image), - std::min(m_data.channel_count, new_image.channel_count()), - stdr::begin(new_to_image)); + std::min(m_data.channel_count, new_image.channel_count()), + stdr::begin(new_to_image)); } return new_image; @@ -538,7 +540,7 @@ namespace stormkit::image { }; image_data.data.resize(stdr::size(m_data.data)); - auto new_image = image{ std::move(image_data) }; + auto new_image = image { std::move(image_data) }; for (auto [layer, face, mip, x, y, z] : multi_range(m_data.layers, From 55774f3a4762119098b9af2308d67dc321547b87 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 17:59:58 +0200 Subject: [PATCH 2/6] . --- src/image/image.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index d0987bad5..1207c3c8c 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -365,9 +365,10 @@ namespace stormkit::image { return { std::move(result) }; } case image_codec::PPM: { - TryTo(result, (details::save_ppm(*this, format))); - - return { std::move(result) }; + auto result = details::save_ppm(*this, format); + if (not result.has_value()) return std::unexpected { std::move(result.error()) }; + // TryTo(result, (details::save_ppm(*this, format))); + return { std::move(result.value()) }; } case image_codec::HDR: { TryTo(result, details::save_hdr(*this)); From 2e34a603d75bd9931c6ce7e179eb33498408dfff Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 18:14:19 +0200 Subject: [PATCH 3/6] . --- src/image/image.cpp | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index 1207c3c8c..8e418eca6 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -349,39 +349,14 @@ namespace stormkit::image { EXPECTS(codec != image_codec::AUTODETECT); EXPECTS(not std::empty(m_data.data)); - auto output = dynarray {}; - switch (codec) { - case image_codec::JPEG: { - TryTo(result, details::save_jpg(*this)); - return { std::move(result) }; - } - case image_codec::PNG: { - TryTo(result, details::save_png(*this)); - return { std::move(result) }; - } - case image_codec::TARGA: { - TryTo(result, details::save_tga(*this)); - return { std::move(result) }; - } - case image_codec::PPM: { - auto result = details::save_ppm(*this, format); - if (not result.has_value()) return std::unexpected { std::move(result.error()) }; - // TryTo(result, (details::save_ppm(*this, format))); - return { std::move(result.value()) }; - } - case image_codec::HDR: { - TryTo(result, details::save_hdr(*this)); - return { std::move(result) }; - } - case image_codec::KTX: { - TryTo(result, details::save_ktx(*this)); - return { std::move(result) }; - } - case image_codec::QOI: { - TryTo(result, details::save_qoi(*this)); - return { std::move(result) }; - } + case image_codec::JPEG: return details::save_jpg(*this); + case image_codec::PNG: return details::save_png(*this); + case image_codec::TARGA: return details::save_tga(*this); + case image_codec::PPM: return details::save_ppm(*this, format); + case image_codec::HDR: return details::save_hdr(*this); + case image_codec::KTX: return details::save_ktx(*this); + case image_codec::QOI: return details::save_qoi(*this); default: break; } From 9b86bf32584df7f9f64cbcf25158c12df6bbee76 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 18:20:29 +0200 Subject: [PATCH 4/6] . --- src/image/image.cpp | 50 ++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index 8e418eca6..4edfd4d40 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -314,32 +314,20 @@ namespace stormkit::image { EXPECTS(not std::empty(m_data.data)); EXPECTS(stdfs::exists(filepath.root_directory())); + auto out = result { std::unexpect, status_code(image_status_code::INVALID_FORMAT) }; + switch (codec) { - case image_codec::JPEG: { - return details::save_jpg(*this, filepath); - } - case image_codec::PNG: { - return details::save_png(*this, filepath); - } - case image_codec::TARGA: { - return details::save_tga(*this, filepath); - } - case image_codec::PPM: { - return details::save_ppm(*this, format, filepath); - } - case image_codec::HDR: { - return details::save_hdr(*this, filepath); - } - case image_codec::KTX: { - return details::save_ktx(*this, filepath); - } - case image_codec::QOI: { - return details::save_qoi(*this, filepath); - } + case image_codec::JPEG: out = details::save_jpg(*this, filepath); + case image_codec::PNG: out = details::save_png(*this, filepath); + case image_codec::TARGA: out = details::save_tga(*this, filepath); + case image_codec::PPM: out = details::save_ppm(*this, format, filepath); + case image_codec::HDR: out = details::save_hdr(*this, filepath); + case image_codec::KTX: out = details::save_ktx(*this, filepath); + case image_codec::QOI: out = details::save_qoi(*this, filepath); default: break; } - return std::unexpected { status_code(image_status_code::INVALID_FORMAT) }; + return out; } ///////////////////////////////////// @@ -349,18 +337,20 @@ namespace stormkit::image { EXPECTS(codec != image_codec::AUTODETECT); EXPECTS(not std::empty(m_data.data)); + auto out = result> { std::unexpect, status_code(image_status_code::INVALID_FORMAT) }; + switch (codec) { - case image_codec::JPEG: return details::save_jpg(*this); - case image_codec::PNG: return details::save_png(*this); - case image_codec::TARGA: return details::save_tga(*this); - case image_codec::PPM: return details::save_ppm(*this, format); - case image_codec::HDR: return details::save_hdr(*this); - case image_codec::KTX: return details::save_ktx(*this); - case image_codec::QOI: return details::save_qoi(*this); + case image_codec::JPEG: out = details::save_jpg(*this); + case image_codec::PNG: out = details::save_png(*this); + case image_codec::TARGA: out = details::save_tga(*this); + case image_codec::PPM: out = details::save_ppm(*this, format); + case image_codec::HDR: out = details::save_hdr(*this); + case image_codec::KTX: out = details::save_ktx(*this); + case image_codec::QOI: out = details::save_qoi(*this); default: break; } - return std::unexpected { status_code(image_status_code::INVALID_FORMAT) }; + return out; } ///////////////////////////////////// From 16abc87231734a3c357f754fb1b7e12a28c48147 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 18:32:01 +0200 Subject: [PATCH 5/6] . --- src/image/image.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index 4edfd4d40..b1fd57819 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -317,13 +317,16 @@ namespace stormkit::image { auto out = result { std::unexpect, status_code(image_status_code::INVALID_FORMAT) }; switch (codec) { - case image_codec::JPEG: out = details::save_jpg(*this, filepath); - case image_codec::PNG: out = details::save_png(*this, filepath); - case image_codec::TARGA: out = details::save_tga(*this, filepath); - case image_codec::PPM: out = details::save_ppm(*this, format, filepath); - case image_codec::HDR: out = details::save_hdr(*this, filepath); - case image_codec::KTX: out = details::save_ktx(*this, filepath); - case image_codec::QOI: out = details::save_qoi(*this, filepath); + case image_codec::JPEG: out = details::save_jpg(*this, filepath); break; + case image_codec::PNG: out = details::save_png(*this, filepath); break; + case image_codec::TARGA: out = details::save_tga(*this, filepath); break; + case image_codec::PPM: out = details::save_ppm(*this, format, filepath); break; + case image_codec::HDR: + out = details::save_hdr(*this, filepath); + break case image_codec::KTX: + out = details::save_ktx(*this, filepath); + break; + case image_codec::QOI: out = details::save_qoi(*this, filepath); break; default: break; } @@ -340,13 +343,13 @@ namespace stormkit::image { auto out = result> { std::unexpect, status_code(image_status_code::INVALID_FORMAT) }; switch (codec) { - case image_codec::JPEG: out = details::save_jpg(*this); - case image_codec::PNG: out = details::save_png(*this); - case image_codec::TARGA: out = details::save_tga(*this); - case image_codec::PPM: out = details::save_ppm(*this, format); - case image_codec::HDR: out = details::save_hdr(*this); - case image_codec::KTX: out = details::save_ktx(*this); - case image_codec::QOI: out = details::save_qoi(*this); + case image_codec::JPEG: out = details::save_jpg(*this); break; + case image_codec::PNG: out = details::save_png(*this); break; + case image_codec::TARGA: out = details::save_tga(*this); break; + case image_codec::PPM: out = details::save_ppm(*this, format); break; + case image_codec::HDR: out = details::save_hdr(*this); break; + case image_codec::KTX: out = details::save_ktx(*this); break; + case image_codec::QOI: out = details::save_qoi(*this); break; default: break; } From 188d14a3245855a60b6c1dc526ce6395a1abc375 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Sun, 27 Sep 2026 18:32:33 +0200 Subject: [PATCH 6/6] . --- src/image/image.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/image/image.cpp b/src/image/image.cpp index b1fd57819..401f4345a 100644 --- a/src/image/image.cpp +++ b/src/image/image.cpp @@ -321,11 +321,8 @@ namespace stormkit::image { case image_codec::PNG: out = details::save_png(*this, filepath); break; case image_codec::TARGA: out = details::save_tga(*this, filepath); break; case image_codec::PPM: out = details::save_ppm(*this, format, filepath); break; - case image_codec::HDR: - out = details::save_hdr(*this, filepath); - break case image_codec::KTX: - out = details::save_ktx(*this, filepath); - break; + case image_codec::HDR: out = details::save_hdr(*this, filepath); break; + case image_codec::KTX: out = details::save_ktx(*this, filepath); break; case image_codec::QOI: out = details::save_qoi(*this, filepath); break; default: break; }