diff --git a/src/gfx/process.cpp b/src/gfx/process.cpp index 21db52e8..9bcb64e5 100644 --- a/src/gfx/process.cpp +++ b/src/gfx/process.cpp @@ -712,6 +712,9 @@ static void hashBitplanes(uint16_t bitplanes, uint16_t &hash) { } class TileData { + // Importantly, `TileData` is **always** 2bpp. + // If the active bit depth is 1bpp, all tiles are processed as 2bpp nonetheless, but emitted as 1bpp. + // This massively simplifies internal processing, since bit depth is always identical outside of I/O / serialization boundaries. std::array _data; // The hash is a bit lax: it's the XOR of all lines, and every other nibble is identical // if horizontal mirroring is in effect. It should still be a reasonable tie-breaker in @@ -755,9 +758,7 @@ public: hashBitplanes(bitplanes, _hash); _data[writeIndex++] = bitplanes & 0xFF; - if (options.bitDepth == 2) { - _data[writeIndex++] = bitplanes >> 8; - } + _data[writeIndex++] = bitplanes >> 8; } } @@ -1032,7 +1033,14 @@ static void outputTileData(UniqueTiles const &tiles) { TileData const *tile = *iter; assume(tile->tileID == tileID); ++tileID; - output->sputn(reinterpret_cast(tile->data().data()), options.bitDepth * 8); + if (options.bitDepth == 2) { + output->sputn(reinterpret_cast(tile->data().data()), 16); + } else { + assume(options.bitDepth == 1); + for (size_t y = 0; y < 8; ++y) { + output->sputc(tile->data()[y * 2]); + } + } } } diff --git a/test/gfx/reverse_1bit.1bpp b/test/gfx/reverse_1bit.1bpp new file mode 100644 index 00000000..76ffa732 --- /dev/null +++ b/test/gfx/reverse_1bit.1bpp @@ -0,0 +1 @@ + @LŒŒ€€€‰F@  \ No newline at end of file diff --git a/test/gfx/reverse_1bit.attrmap b/test/gfx/reverse_1bit.attrmap new file mode 100644 index 00000000..ba58dcb8 Binary files /dev/null and b/test/gfx/reverse_1bit.attrmap differ diff --git a/test/gfx/reverse_1bit.flags b/test/gfx/reverse_1bit.flags new file mode 100644 index 00000000..4e003469 --- /dev/null +++ b/test/gfx/reverse_1bit.flags @@ -0,0 +1,3 @@ +-m +-t reverse_1bit.tilemap +-a reverse_1bit.attrmap diff --git a/test/gfx/reverse_1bit.tilemap b/test/gfx/reverse_1bit.tilemap new file mode 100644 index 00000000..dee9c4c8 Binary files /dev/null and b/test/gfx/reverse_1bit.tilemap differ