From e0ee9dc3ad3ca254ae0b441748d12ad6b8fabcc7 Mon Sep 17 00:00:00 2001 From: Sylvie <35663410+Rangi42@users.noreply.github.com> Date: Sun, 24 Nov 2024 19:30:49 -0500 Subject: [PATCH] Add `reverse_1bit` RGBGFX test (#1555) Fixes a bug to always use 2bpp `_data` in `TileData` --- src/gfx/process.cpp | 16 ++++++++++++---- test/gfx/reverse_1bit.1bpp | 1 + test/gfx/reverse_1bit.attrmap | Bin 0 -> 4 bytes test/gfx/reverse_1bit.flags | 3 +++ test/gfx/reverse_1bit.tilemap | Bin 0 -> 4 bytes 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 test/gfx/reverse_1bit.1bpp create mode 100644 test/gfx/reverse_1bit.attrmap create mode 100644 test/gfx/reverse_1bit.flags create mode 100644 test/gfx/reverse_1bit.tilemap 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 0000000000000000000000000000000000000000..ba58dcb8efa5e18a3b5f04f10268a4efd512e846 GIT binary patch literal 4 LcmZQjU{C-60E7TR literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..dee9c4c8adafc2e6af2ee0379ef082b7b43cd95f GIT binary patch literal 4 LcmZQzU}OXU00#gA literal 0 HcmV?d00001