26 assert(bpp >= 1 && bpp <= 8);
27 unsigned int bpp_pos[8];
28 for (
int row = 0; row < 8; row++) {
29 for (
int col = 0; col < 8; col++) {
31 tile.
data[row * 8 + col] = (data[offset + row] >> (7 - col)) & 0x01;
38 bpp_pos[0] = offset + row * 2;
39 bpp_pos[1] = offset + row * 2 + 1;
40 char mask = 1 << (7 - col);
41 tile.
data[row * 8 + col] = (data[bpp_pos[0]] & mask) ? 1 : 0;
42 tile.
data[row * 8 + col] |= ((data[bpp_pos[1]] & mask) ? 1 : 0) << 1;
46 bpp_pos[2] = offset + 16 + row;
47 tile.
data[row * 8 + col] |= ((data[bpp_pos[2]] & mask) ? 1 : 0) << 2;
52 bpp_pos[2] = offset + 16 + row * 2;
53 bpp_pos[3] = offset + 16 + row * 2 + 1;
54 tile.
data[row * 8 + col] |= ((data[bpp_pos[2]] & mask) ? 1 : 0) << 2;
55 tile.
data[row * 8 + col] |= ((data[bpp_pos[3]] & mask) ? 1 : 0) << 3;
58 bpp_pos[4] = offset + 32 + row * 2;
59 bpp_pos[5] = offset + 32 + row * 2 + 1;
60 bpp_pos[6] = offset + 48 + row * 2;
61 bpp_pos[7] = offset + 48 + row * 2 + 1;
62 tile.
data[row * 8 + col] |= ((data[bpp_pos[4]] & mask) ? 1 : 0) << 4;
63 tile.
data[row * 8 + col] |= ((data[bpp_pos[5]] & mask) ? 1 : 0) << 5;
64 tile.
data[row * 8 + col] |= ((data[bpp_pos[6]] & mask) ? 1 : 0) << 6;
65 tile.
data[row * 8 + col] |= ((data[bpp_pos[7]] & mask) ? 1 : 0) << 7;
74 std::vector<uint8_t> output(bpp * 8, 0);
75 unsigned maxcolor = 1 << bpp;
78 for (
unsigned int row = 0; row < 8; row++) {
79 for (
unsigned int col = 0; col < 8; col++) {
80 uint8_t color = tile.
data[row * 8 + col];
81 if (color >= maxcolor) {
82 throw std::invalid_argument(
"Invalid color value.");
87 output[row] += (uint8_t)((color & 1) << (7 - col));
91 output[row * 2] += ((color & 1) << (7 - col));
92 output[row * 2 + 1] += (((color & 2) == 2) << (7 - col));
97 output[16 + row] += (((color & 4) == 4) << (7 - col));
101 output[16 + row * 2] += (((color & 4) == 4) << (7 - col));
102 output[16 + row * 2 + 1] += (((color & 8) == 8) << (7 - col));
107 output[32 + row * 2] += (((color & 16) == 16) << (7 - col));
108 output[32 + row * 2 + 1] += (((color & 32) == 32) << (7 - col));
109 output[48 + row * 2] += (((color & 64) == 64) << (7 - col));
110 output[48 + row * 2 + 1] += (((color & 128) == 128) << (7 - col));
117std::vector<uint8_t>
ConvertBpp(std::span<uint8_t> tiles, uint32_t from_bpp,
119 unsigned int nb_tile = tiles.size() / (from_bpp * 8);
120 std::vector<uint8_t> converted(nb_tile * to_bpp * 8);
122 for (
unsigned int i = 0; i < nb_tile; i++) {
124 std::vector<uint8_t> packed_tile =
PackBppTile(tile, to_bpp);
125 std::memcpy(converted.data() + i * to_bpp * 8, packed_tile.data(),
138 int buffer_size = 0x1000;
143 buffer_size = 0x2000;
144 }
else if (bpp == 3) {
146 }
else if (bpp == 4) {
148 buffer_size = 0x4000;
149 }
else if (bpp == 8) {
153 if (num_sheets != 1) {
154 num_tiles *= num_sheets;
155 buffer_size *= num_sheets;
159 if (
static_cast<size_t>(num_tiles * bpp) > sheet.size()) {
163 num_tiles =
static_cast<int>(sheet.size()) / bpp;
169 std::vector<uint8_t> sheet_buffer_out(buffer_size);
171 for (
int i = 0; i < num_tiles; i++) {
172 for (
int y = 0; y < 8; y++) {
173 for (
int x = 0; x < 8; x++) {
184 if (b3 != 0 && bpp != 16) {
187 sheet_buffer_out[x + xx + (y * 128) + (yy * 1024)] = b;
199 return sheet_buffer_out;
215 auto buffer = std::vector<uint8_t>(data.size());
216 std::vector<std::vector<uint8_t>> bitmap_data;
217 bitmap_data.resize(0x80);
218 for (
auto& each : bitmap_data) {
225 const uint16_t sheet_width = 128;
231 for (
int i = 0; i < 4096; i++) {
233 for (
int y = 0; y < 8; y++) {
235 for (
int x = 0; x < 8; x++) {
236 const uint16_t bitmask[] = {0x80, 0x40, 0x20, 0x10,
237 0x08, 0x04, 0x02, 0x01};
238 auto b1 = (data[(y * 2) + ((bpp * 8) * pos)] & (bitmask[x]));
239 auto b2 = (data[((y * 2) + ((bpp * 8) * pos)) + 1] & (bitmask[x]));
240 auto b3 = (data[(y * 2) + ((bpp * 8) * pos) + 16] & (bitmask[x]));
241 auto b4 = (data[(y * 2) + ((bpp * 8) * pos) + 17] & (bitmask[x]));
242 auto b5 = (data[(y * 2) + ((bpp * 8) * pos) + 32] & (bitmask[x]));
243 auto b6 = (data[(y * 2) + ((bpp * 8) * pos) + 33] & (bitmask[x]));
244 auto b7 = (data[(y * 2) + ((bpp * 8) * pos) + 48] & (bitmask[x]));
245 auto b8 = (data[(y * 2) + ((bpp * 8) * pos) + 49] & (bitmask[x]));
277 bitmap_data[x + xx][y + (yy * 8)] = b;
292 for (
int y = 0; y < (data.size() / 64); y++) {
293 for (
int x = 0; x < sheet_width; x++) {
294 if (n < data.size()) {
296 buffer[n] = bitmap_data[x][y];
323 uint16_t
id = word & 0x3FF;
326 bool vertical_mirror = (word >> 15) & 0x01;
327 bool horizontal_mirror = (word >> 14) & 0x01;
328 bool over = (word >> 13) & 0x01;
331 uint8_t palette = (word >> 10) & 0x07;
333 return TileInfo(
id, palette, vertical_mirror, horizontal_mirror, over);
380 std::vector<uint8_t>& blockset) {
382 ((tile - ((tile / 0x08) * 0x08)) * 0x10) + ((tile / 0x08) * 2048);
383 int dest_pos = (x + (y * 0x200));
384 for (
int yy = 0; yy < 0x10; yy++) {
385 for (
int xx = 0; xx < 0x10; xx++) {
386 bitmap[dest_pos + xx + (yy * 0x200)] =
387 blockset[src_pos + xx + (yy * 0x80)];
393 std::span<uint8_t> src) {
394 std::vector<uint8_t> dest;
406 int main_index_limit = src.size() / 32;
407 for (
int main_index = 0; main_index <= main_index_limit; main_index += 32) {
408 src_index = (main_index << 5);
409 if (src_index + 31 >= src.size()) {
410 throw std::invalid_argument(
"src_index + 31 >= src.size()");
412 dest_x = main_index & 0x0F;
413 dest_y = main_index >> 4;
414 dest_index = ((dest_y << 7) + dest_x) << 3;
415 if (dest_index + 903 >= dest.size()) {
416 throw std::invalid_argument(
"dest_index + 903 >= dest.size()");
418 for (
int i = 0; i < 16; i += 2) {
420 b0 = src[src_index + i];
421 b1 = src[src_index + i + 1];
422 b2 = src[src_index + i + 16];
423 b3 = src[src_index + i + 17];
424 for (
int j = 0; j < 8; j++) {
425 res = ((b0 & mul) | ((b1 & mul) << 1) | ((b2 & mul) << 2) |
426 ((b3 & mul) << 3)) >>
428 dest[dest_index + (7 - j) + y_adder] = res;