From 8a7019e1f821666758a00c261279c597f40930c2 Mon Sep 17 00:00:00 2001 From: Rangi Date: Sat, 12 Sep 2026 12:52:35 -0400 Subject: [PATCH] Only register colors inside the `-L/--slice` region, including transparent color Fixes #2074 --- src/gfx/process.cpp | 9 +++++++-- test/gfx/trans_outside_slice.flags | 1 + test/gfx/trans_outside_slice.out.2bpp | 1 + test/gfx/trans_outside_slice.out.attrmap | Bin 0 -> 1 bytes test/gfx/trans_outside_slice.out.pal | Bin 0 -> 8 bytes test/gfx/trans_outside_slice.out.tilemap | Bin 0 -> 1 bytes test/gfx/trans_outside_slice.png | Bin 0 -> 419 bytes 7 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 test/gfx/trans_outside_slice.flags create mode 100644 test/gfx/trans_outside_slice.out.2bpp create mode 100644 test/gfx/trans_outside_slice.out.attrmap create mode 100644 test/gfx/trans_outside_slice.out.pal create mode 100644 test/gfx/trans_outside_slice.out.tilemap create mode 100644 test/gfx/trans_outside_slice.png diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index cfab0a5b..270e2a2e 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -179,8 +179,13 @@ struct Image { std::unordered_set, decltype(hashPair)> fusions; // Register colors from `png` into `colors` - for (uint32_t y = 0; y < png.height; ++y) { - for (uint32_t x = 0; x < png.width; ++x) { + uint32_t const pxLeft = options.inputSlice.width ? options.inputSlice.left : 0; + uint32_t const pxTop = options.inputSlice.height ? options.inputSlice.top : 0; + uint32_t const pxRight = options.inputSlice.width ? options.inputSlice.right() : png.width; + uint32_t const pxBottom = + options.inputSlice.height ? options.inputSlice.bottom() : png.height; + for (uint32_t y = pxTop; y < pxBottom; ++y) { + for (uint32_t x = pxLeft; x < pxRight; ++x) { if (Rgba const &color = pixel(x, y); color.isAmbiguous()) { // Report ambiguously transparent or opaque colors if (uint32_t css = color.toCSS(); ambiguous.find(css) == ambiguous.end()) { diff --git a/test/gfx/trans_outside_slice.flags b/test/gfx/trans_outside_slice.flags new file mode 100644 index 00000000..d26d028a --- /dev/null +++ b/test/gfx/trans_outside_slice.flags @@ -0,0 +1 @@ +-L 8,8:1,1 diff --git a/test/gfx/trans_outside_slice.out.2bpp b/test/gfx/trans_outside_slice.out.2bpp new file mode 100644 index 00000000..920ab83e --- /dev/null +++ b/test/gfx/trans_outside_slice.out.2bpp @@ -0,0 +1 @@ +<Ì<Ì<Ì<Ì<Ì<Ì<Ì<Ì \ No newline at end of file diff --git a/test/gfx/trans_outside_slice.out.attrmap b/test/gfx/trans_outside_slice.out.attrmap new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/test/gfx/trans_outside_slice.out.pal b/test/gfx/trans_outside_slice.out.pal new file mode 100644 index 0000000000000000000000000000000000000000..8d370931ecb88e04fff8bc452b901d4f51ce98c5 GIT binary patch literal 8 Pcmey*{D4`WfuRNf4qO6( literal 0 HcmV?d00001 diff --git a/test/gfx/trans_outside_slice.out.tilemap b/test/gfx/trans_outside_slice.out.tilemap new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/test/gfx/trans_outside_slice.png b/test/gfx/trans_outside_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..567a503309d77dcfe2fc16f6df4b6bb097ffa8b6 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkF1yemk zJwqd5M)wk+q8+Ibo@t(*S_~XO4l9EcBP#K~;uzxL{dTG$7lQ&1v-JP}&v$H5knL&a zbIQ|lv}_3wWSaEmCKtn(oYXH5%)~r&COCYx+4O8hu;ql%|9`(e*Wcif)R?mS^x^-F ctm=RCXDrhd)OuA`^&4c3r>mdKI;Vst03}mgmH+?% literal 0 HcmV?d00001