From ba0fca599c1a06a0fc0f1d7089a1532be7f6454a Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 24 Apr 2021 18:50:03 +0200 Subject: Add support for x/y starting position and w/h for image size --- src/main.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file 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) { printf("\n"); printf("\t-b \tSelects the background color used for transparency.\n"); printf("\t-o \tPath to the output file. If blank, stdout will be used.\n"); + printf("\t-x <0>\tStart x position (in pixels).\n"); + printf("\t-y <0>\tStart y position (in pixels).\n"); printf("\t-W <8>\tSelect the sprite width in pixels. Must be a multiple of the tile size.\n"); printf("\t-H <8>\tSelect the sprite height in pixels. Must be a multiple of the tile size.\n"); printf("\t-1\tBit pack the output to 1bbp (4x size reduction).\n"); - printf("\t-h\tShow help.\n"); + printf("\t-w <0>\tWidth of region to extract from (x0,y0). Defaults to image width.\n"); + printf("\t-h <0>\tHeight of region to extract from (x0,y0). Defaults to image height.\n"); printf("\n"); } -// TODO: Enable 1bit bit-packing (in u32 units). // TODO: Support multiple files at once? int main(int argc, char *argv[]) { @@ -211,9 +213,13 @@ main(int argc, char *argv[]) { size_t sprite_height = TILE_SIZE; char *out_file_path = NULL; bool pack_1bpp = false; + size_t start_x = 0; + size_t start_y = 0; + size_t width = 0; + size_t height = 0; int option; - while ((option = getopt(argc, argv, "hb:o:W:H:1")) != -1) { + while ((option = getopt(argc, argv, "b:o:W:H:1x:y:w:h:")) != -1) { switch (option) { case 'b': { // Background color. @@ -276,10 +282,21 @@ main(int argc, char *argv[]) { // Pack output to 1bpp. pack_1bpp = true; } break; + case 'x': { + // Start x position in pixels. + start_x = atoi(optarg); + } break; + case 'y': { + // Start y position in pixels. + start_y = atoi(optarg); + } break; + case 'w': { + // Width of region to extract from (x0,y0). + width = atoi(optarg); + } break; case 'h': { - // Help. - print_usage(); - return EXIT_SUCCESS; + // Height of region to extract from (x0,y0). + height = atoi(optarg); } break; default: { print_usage(); @@ -323,8 +340,14 @@ main(int argc, char *argv[]) { return EXIT_FAILURE; } - size_t n_tiles_x = img.width / TILE_SIZE; - size_t n_tiles_y = img.height / TILE_SIZE; + if (width == 0) { + width = img.width; + } + if (height == 0) { + height = img.height; + } + size_t n_tiles_x = width / TILE_SIZE; + size_t n_tiles_y = height / TILE_SIZE; size_t n_tiles = n_tiles_x * n_tiles_y; // Allocate memory for the tiles in this file, with zero-initialization. @@ -334,15 +357,17 @@ main(int argc, char *argv[]) { .capacity = n_tiles, }; - size_t n_sprites_x = img.width / sprite_width; - size_t n_sprites_y = img.height / sprite_height; + int offset_x = start_x; + int offset_y = start_y; + size_t n_sprites_x = width / sprite_width; + size_t n_sprites_y = height / sprite_height; size_t n_sprite_tiles_x = sprite_width / TILE_SIZE; size_t n_sprite_tiles_y = sprite_height / TILE_SIZE; for (size_t p = 0; p < n_sprites_y; ++p) { for (size_t k = 0; k < n_sprites_x; ++k) { for (size_t j = 0; j < n_sprite_tiles_y; ++j) { - int offset_x = k * sprite_width; - int offset_y = p * sprite_height + j * TILE_SIZE; + int offset_x = start_x + k * sprite_width; + int offset_y = start_y + p * sprite_height + j * TILE_SIZE; for (size_t i = 0; i < n_sprite_tiles_x; ++i) { extract_tile(&tiles, &palette, &img, offset_x, offset_y); offset_x += TILE_SIZE; -- cgit v1.2.1