summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-04-24 18:50:03 +0200
committerBad Diode <bd@badd10de.dev>2021-04-24 18:50:03 +0200
commitba0fca599c1a06a0fc0f1d7089a1532be7f6454a (patch)
tree5033d75d3247236bdf110f12fc7affd7136be2ab
parent0c1035bcc5a2c78640f45d0bd5f4454a51c87398 (diff)
downloadgba-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.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/src/main.c b/src/main.c
index 67c5d69..f91ecd0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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?
205int 207int
206main(int argc, char *argv[]) { 208main(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;