ref: 0d32775a1f13bc446d910c0ab9e41005f54d5122
parent: 0df07d368816ed586a6e80a3ae524f6c4bc3fd08
author: ISSOtm <eldredhabert0@gmail.com>
date: Sat May 21 16:04:29 EDT 2022
Add more sanity checks when reversing an image
--- a/src/gfx/reverse.cpp
+++ b/src/gfx/reverse.cpp
@@ -22,6 +22,7 @@
#include "defaultinitalloc.hpp"
#include "helpers.h"
+#include "itertools.hpp"
#include "gfx/main.hpp"
@@ -116,8 +117,6 @@
if (!options.tilemap.empty()) {tilemap = readInto(options.tilemap);
nbTileInstances = tilemap->size();
-
- // TODO: range check
}
if (nbTileInstances > options.maxNbTiles[0] + options.maxNbTiles[1]) {@@ -181,7 +180,39 @@
// We do this now for two reasons:
// 1. Checking those during the main loop is harmful to optimization, and
// 2. It clutters the code more, and it's not in great shape to begin with
- // TODO
+ bool bad = false;
+ for (auto attr : *attrmap) {+ if ((attr & 0b111) > palettes.size()) {+ error("Referencing palette %u, but there are only %zu!");+ bad = true;
+ }
+ if (attr & 0x08 && !tilemap) {+ warning("Tile in bank 1 but no tilemap specified; ignoring the bank bit");+ }
+ }
+ if (bad) {+ giveUp();
+ }
+ }
+
+ if (tilemap) {+ if (attrmap) {+ for (auto [id, attr] : zip(*tilemap, *attrmap)) {+ bool bank = attr & 1 << 3;
+ if (id >= options.maxNbTiles[bank]) {+ warning("Tile #%" PRIu8+ " was referenced, but the limit for bank %u is %" PRIu16,
+ id, bank, options.maxNbTiles[bank]);
+ }
+ }
+ } else {+ for (auto id : *tilemap) {+ if (id >= options.maxNbTiles[0]) {+ warning("Tile #%" PRIu8 " was referenced, but the limit is %" PRIu16, id,+ options.maxNbTiles[0]);
+ }
+ }
+ }
}
std::optional<DefaultInitVec<uint8_t>> palmap;
--
⑨