Fix RGBGFX crash when trimming more tiles than exist after deduplication

This commit is contained in:
Rangi
2026-07-10 17:35:32 -04:00
parent 0e1e5e80f6
commit be4c1161bd
5 changed files with 31 additions and 11 deletions
+27 -11
View File
@@ -853,20 +853,36 @@ static void outputTileData(UniqueTiles const &tiles) {
// LCOV_EXCL_STOP // LCOV_EXCL_STOP
} }
uint16_t tileID = 0; uint64_t nbTiles = tiles.size();
for (auto iter = tiles.begin(), end = tiles.end() - options.trim; iter != end; ++iter) { uint64_t nbKeptTiles = nbTiles > options.trim ? nbTiles - options.trim : 0;
TileData const *tile = *iter; uint64_t tileIdx = 0;
assume(tile->tileID == tileID);
++tileID; for (TileData const *tile : tiles) {
if (options.bitDepth == 2) { assume(tile->tileID == tileIdx);
output->sputn(reinterpret_cast<char const *>(tile->data().data()), 16); bool empty = true;
} else { for (uint32_t y = 0; y < 8; ++y) {
assume(options.bitDepth == 1); uint8_t bitplane0 = tile->data()[y * 2];
for (size_t y = 0; y < 8; ++y) { uint8_t bitplane1 = tile->data()[y * 2 + 1];
output->sputc(tile->data()[y * 2]); if (bitplane0 || bitplane1) {
empty = false;
}
if (tileIdx < nbKeptTiles) {
output->sputc(bitplane0);
if (options.bitDepth == 2) {
output->sputc(bitplane1);
}
} }
} }
if (!empty && tileIdx >= nbKeptTiles) {
warning(
WARNING_TRIM_NONEMPTY, "Trimming a nonempty tile (configure with '-x/--trim-end')"
);
break; // Don't repeat the warning for subsequent tiles
}
++tileIdx;
} }
assume(nbKeptTiles <= tileIdx && tileIdx <= nbTiles);
} }
static void outputTilemap(std::vector<AttrmapEntry> const &attrmap) { static void outputTilemap(std::vector<AttrmapEntry> const &attrmap) {
+1
View File
@@ -0,0 +1 @@
warning: Trimming a nonempty tile (configure with '-x/--trim-end') [-Wtrim-nonempty]
+3
View File
@@ -0,0 +1,3 @@
-Wtrim-nonempty
-m
-x 3
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 111 B