diff options
author | Bad Diode <bd@badd10de.dev> | 2021-04-24 18:50:03 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-04-24 18:50:03 +0200 |
commit | ba0fca599c1a06a0fc0f1d7089a1532be7f6454a (patch) | |
tree | 5033d75d3247236bdf110f12fc7affd7136be2ab | |
parent | 0c1035bcc5a2c78640f45d0bd5f4454a51c87398 (diff) | |
download | gba-dev-tools-ba0fca599c1a06a0fc0f1d7089a1532be7f6454a.tar.gz gba-dev-tools-ba0fca599c1a06a0fc0f1d7089a1532be7f6454a.zip |
Add support for x/y starting position and w/h for image size
-rw-r--r-- | src/main.c | 49 |
1 files changed, 37 insertions, 12 deletions
@@ -193,14 +193,16 @@ print_usage(void) { | |||
193 | printf("\n"); | 193 | printf("\n"); |
194 | printf("\t-b <RRGGBB>\tSelects the background color used for transparency.\n"); | 194 | printf("\t-b <RRGGBB>\tSelects the background color used for transparency.\n"); |
195 | printf("\t-o <out_file.c>\tPath to the output file. If blank, stdout will be used.\n"); | 195 | printf("\t-o <out_file.c>\tPath to the output file. If blank, stdout will be used.\n"); |
196 | printf("\t-x <0>\tStart x position (in pixels).\n"); | ||
197 | printf("\t-y <0>\tStart y position (in pixels).\n"); | ||
196 | printf("\t-W <8>\tSelect the sprite width in pixels. Must be a multiple of the tile size.\n"); | 198 | printf("\t-W <8>\tSelect the sprite width in pixels. Must be a multiple of the tile size.\n"); |
197 | printf("\t-H <8>\tSelect the sprite height in pixels. Must be a multiple of the tile size.\n"); | 199 | printf("\t-H <8>\tSelect the sprite height in pixels. Must be a multiple of the tile size.\n"); |
198 | printf("\t-1\tBit pack the output to 1bbp (4x size reduction).\n"); | 200 | printf("\t-1\tBit pack the output to 1bbp (4x size reduction).\n"); |
199 | printf("\t-h\tShow help.\n"); | 201 | printf("\t-w <0>\tWidth of region to extract from (x0,y0). Defaults to image width.\n"); |
202 | printf("\t-h <0>\tHeight of region to extract from (x0,y0). Defaults to image height.\n"); | ||
200 | printf("\n"); | 203 | printf("\n"); |
201 | } | 204 | } |
202 | 205 | ||
203 | // TODO: Enable 1bit bit-packing (in u32 units). | ||
204 | // TODO: Support multiple files at once? | 206 | // TODO: Support multiple files at once? |
205 | int | 207 | int |
206 | main(int argc, char *argv[]) { | 208 | main(int argc, char *argv[]) { |
@@ -211,9 +213,13 @@ main(int argc, char *argv[]) { | |||
211 | size_t sprite_height = TILE_SIZE; | 213 | size_t sprite_height = TILE_SIZE; |
212 | char *out_file_path = NULL; | 214 | char *out_file_path = NULL; |
213 | bool pack_1bpp = false; | 215 | bool pack_1bpp = false; |
216 | size_t start_x = 0; | ||
217 | size_t start_y = 0; | ||
218 | size_t width = 0; | ||
219 | size_t height = 0; | ||
214 | 220 | ||
215 | int option; | 221 | int option; |
216 | while ((option = getopt(argc, argv, "hb:o:W:H:1")) != -1) { | 222 | while ((option = getopt(argc, argv, "b:o:W:H:1x:y:w:h:")) != -1) { |
217 | switch (option) { | 223 | switch (option) { |
218 | case 'b': { | 224 | case 'b': { |
219 | // Background color. | 225 | // Background color. |
@@ -276,10 +282,21 @@ main(int argc, char *argv[]) { | |||
276 | // Pack output to 1bpp. | 282 | // Pack output to 1bpp. |
277 | pack_1bpp = true; | 283 | pack_1bpp = true; |
278 | } break; | 284 | } break; |
285 | case 'x': { | ||
286 | // Start x position in pixels. | ||
287 | start_x = atoi(optarg); | ||
288 | } break; | ||
289 | case 'y': { | ||
290 | // Start y position in pixels. | ||
291 | start_y = atoi(optarg); | ||
292 | } break; | ||
293 | case 'w': { | ||
294 | // Width of region to extract from (x0,y0). | ||
295 | width = atoi(optarg); | ||
296 | } break; | ||
279 | case 'h': { | 297 | case 'h': { |
280 | // Help. | 298 | // Height of region to extract from (x0,y0). |
281 | print_usage(); | 299 | height = atoi(optarg); |
282 | return EXIT_SUCCESS; | ||
283 | } break; | 300 | } break; |
284 | default: { | 301 | default: { |
285 | print_usage(); | 302 | print_usage(); |
@@ -323,8 +340,14 @@ main(int argc, char *argv[]) { | |||
323 | return EXIT_FAILURE; | 340 | return EXIT_FAILURE; |
324 | } | 341 | } |
325 | 342 | ||
326 | size_t n_tiles_x = img.width / TILE_SIZE; | 343 | if (width == 0) { |
327 | size_t n_tiles_y = img.height / TILE_SIZE; | 344 | width = img.width; |
345 | } | ||
346 | if (height == 0) { | ||
347 | height = img.height; | ||
348 | } | ||
349 | size_t n_tiles_x = width / TILE_SIZE; | ||
350 | size_t n_tiles_y = height / TILE_SIZE; | ||
328 | size_t n_tiles = n_tiles_x * n_tiles_y; | 351 | size_t n_tiles = n_tiles_x * n_tiles_y; |
329 | 352 | ||
330 | // Allocate memory for the tiles in this file, with zero-initialization. | 353 | // Allocate memory for the tiles in this file, with zero-initialization. |
@@ -334,15 +357,17 @@ main(int argc, char *argv[]) { | |||
334 | .capacity = n_tiles, | 357 | .capacity = n_tiles, |
335 | }; | 358 | }; |
336 | 359 | ||
337 | size_t n_sprites_x = img.width / sprite_width; | 360 | int offset_x = start_x; |
338 | size_t n_sprites_y = img.height / sprite_height; | 361 | int offset_y = start_y; |
362 | size_t n_sprites_x = width / sprite_width; | ||
363 | size_t n_sprites_y = height / sprite_height; | ||
339 | size_t n_sprite_tiles_x = sprite_width / TILE_SIZE; | 364 | size_t n_sprite_tiles_x = sprite_width / TILE_SIZE; |
340 | size_t n_sprite_tiles_y = sprite_height / TILE_SIZE; | 365 | size_t n_sprite_tiles_y = sprite_height / TILE_SIZE; |
341 | for (size_t p = 0; p < n_sprites_y; ++p) { | 366 | for (size_t p = 0; p < n_sprites_y; ++p) { |
342 | for (size_t k = 0; k < n_sprites_x; ++k) { | 367 | for (size_t k = 0; k < n_sprites_x; ++k) { |
343 | for (size_t j = 0; j < n_sprite_tiles_y; ++j) { | 368 | for (size_t j = 0; j < n_sprite_tiles_y; ++j) { |
344 | int offset_x = k * sprite_width; | 369 | int offset_x = start_x + k * sprite_width; |
345 | int offset_y = p * sprite_height + j * TILE_SIZE; | 370 | int offset_y = start_y + p * sprite_height + j * TILE_SIZE; |
346 | for (size_t i = 0; i < n_sprite_tiles_x; ++i) { | 371 | for (size_t i = 0; i < n_sprite_tiles_x; ++i) { |
347 | extract_tile(&tiles, &palette, &img, offset_x, offset_y); | 372 | extract_tile(&tiles, &palette, &img, offset_x, offset_y); |
348 | offset_x += TILE_SIZE; | 373 | offset_x += TILE_SIZE; |