diff --git a/src/gfx/reverse.cpp b/src/gfx/reverse.cpp index 47eeb843..1206b698 100644 --- a/src/gfx/reverse.cpp +++ b/src/gfx/reverse.cpp @@ -216,12 +216,13 @@ void reverse() { } palettes.clear(); - std::array buf; // 4 colors + std::array buf; // max 4 colors + assume(buf.size() >= sizeof(uint16_t) * options.nbColorsPerPal); for (;;) { if (size_t nbRead = file->sgetn(reinterpret_cast(buf.data()), buf.size()); nbRead == 0) { break; - } else if (nbRead != buf.size()) { + } else if (nbRead != sizeof(uint16_t) * options.nbColorsPerPal) { fatal( "Palette data size (%zu) is not a multiple of %zu bytes\n", palettes.size() * buf.size() + nbRead, @@ -599,7 +600,7 @@ void reverse() { if (Rgba const &pixel = *color; pngColorType == PNG_COLOR_TYPE_GRAY) { gray = gray << pngDepth | (pixel.red & ((1 << pngDepth) - 1)); } else if (pngColorType == PNG_COLOR_TYPE_PALETTE) { - *ptr++ = palOfs * 4 + colorID; + *ptr++ = palOfs * options.nbColorsPerPal + colorID; } else { *ptr++ = pixel.red; *ptr++ = pixel.green; diff --git a/test/gfx/reverse_small_palette.2bpp b/test/gfx/reverse_small_palette.2bpp new file mode 100644 index 00000000..20ab0d57 Binary files /dev/null and b/test/gfx/reverse_small_palette.2bpp differ diff --git a/test/gfx/reverse_small_palette.flags b/test/gfx/reverse_small_palette.flags new file mode 100644 index 00000000..11ddc83c --- /dev/null +++ b/test/gfx/reverse_small_palette.flags @@ -0,0 +1,2 @@ +-s 2 +-p reverse_small_palette.pal diff --git a/test/gfx/reverse_small_palette.pal b/test/gfx/reverse_small_palette.pal new file mode 100644 index 00000000..853c9ec0 Binary files /dev/null and b/test/gfx/reverse_small_palette.pal differ