diff --git a/README.md b/README.md index 46a86b7..07947c8 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ make clean build install ## CLI arguments ```txt -usage: margen [--help] [-v] [-q] [-w=WIDTH] [-h=HEIGHT] [-o=PATH] [--seed=SEED][-p=PIXEL_SIZE] [-s=SLOPE] [-c=R,G,B] [--var=R,G,B] [-vr=VAR_RANGE] +usage: margen [--help] [-v] [-q] [-w=WIDTH] [-h=HEIGHT] [-o=PATH] [--seed=SEED][-p=PIXEL_SIZE] [-s=SLOPE] [-c=R,G,B] [-va=R,G,B] [-vr=VAR_RANGE] [-r=ROTATION] generate a marble-like pattern bitmap image, blazing fast. @@ -38,9 +38,9 @@ options: -c, --color base color [0-255,0-255,0-255] (default: random) -va, --variation fixed variation [0-255,0-255,0-255] (default: random) -vr, --var-range random variation range [0-255] (default: 30) + -r, --rotation start corner rotation [0-3] (default: random) ``` ## TODO -- fix monochrome -- select corner (currently bottom left) \ No newline at end of file +- fix monochrome \ No newline at end of file diff --git a/src/args.c b/src/args.c index 573c8c3..dac1785 100644 --- a/src/args.c +++ b/src/args.c @@ -20,8 +20,9 @@ void print_help(int status_code) { "[-p=PIXEL_SIZE] " "[-s=SLOPE] " "[-c=R,G,B] " - "[--var=R,G,B] " - "[-vr=VAR_RANGE]" + "[-va=R,G,B] " + "[-vr=VAR_RANGE] " + "[-r=ROTATION] " // "[-m]" "\n\n" "generate a marble-like pattern bitmap image, blazing fast.\n\n" @@ -38,6 +39,7 @@ void print_help(int status_code) { " -va, --variation fixed variation [0-255,0-255,0-255] (default: " "random)\n" " -vr, --var-range random variation range [0-255] (default: 30)\n" + " -r, --rotation start corner rotation [0-3] (default: random)\n" // " -m, --monochrome black & white generation\n" ); exit(status_code); @@ -131,6 +133,7 @@ parameters parse_args(int argc, char **argv) { bool slope_set = false; bool start_set = false; bool var_set = false; + bool rot_set = false; int i; char *arg; @@ -182,8 +185,11 @@ parameters parse_args(int argc, char **argv) { var_set = true; } else if (is_arg(arg, "-vr") || is_arg(arg, "--var-range")) { var_range = parse_char(arg, value); - // } else if (is_arg(arg, "-m") || is_arg(arg, "--monochrome")) { - // params.monochrome = true; + } else if (is_arg(arg, "-r") || is_arg(arg, "--rotation")) { + params.rotation = parse_char(arg, value) % 4; + rot_set = true; + } else if (is_arg(arg, "-m") || is_arg(arg, "--monochrome")) { + params.monochrome = true; } else { invalid_arg(arg); } @@ -216,5 +222,9 @@ parameters parse_args(int argc, char **argv) { params.var[2] = rand_uchar(var_range); } + if (!rot_set) { + params.rotation = rand_uchar(4); + } + return params; } \ No newline at end of file diff --git a/src/bmp.c b/src/bmp.c index 1b4b045..974bd1d 100644 --- a/src/bmp.c +++ b/src/bmp.c @@ -75,7 +75,7 @@ void bmp_data_line(unsigned char *buffer, unsigned short width, } void bmp_generate(unsigned short width, unsigned short height, - unsigned char color_depth, char *file_path, + unsigned char color_depth, bool descending, char *file_path, line_fn generate_line) { FILE *fptr; fptr = fopen(file_path, "w"); @@ -84,14 +84,17 @@ void bmp_generate(unsigned short width, unsigned short height, free(header); unsigned int data_length = ((unsigned int)width) * ((unsigned int)color_depth); - unsigned short y; + unsigned int line_length = bmp_data_line_length(width, color_depth); unsigned char *data_buffer = (unsigned char *)malloc(data_length); - unsigned char *line_buffer = - (unsigned char *)malloc(bmp_data_line_length(width, color_depth)); + unsigned char *line_buffer = (unsigned char *)malloc(line_length); + unsigned short y; for (y = 0; y < height; y++) { - generate_line(height - y - 1, data_buffer, data_length); + generate_line(y, data_buffer, data_length); bmp_data_line(line_buffer, width, color_depth, data_buffer); - fwrite(line_buffer, bmp_data_line_length(width, color_depth), 1, fptr); + if (descending) { + fseek(fptr, HEADER_SIZE + (height - y - 1) * line_length, SEEK_SET); + } + fwrite(line_buffer, line_length, 1, fptr); } free(line_buffer); free(data_buffer); diff --git a/src/bmp.h b/src/bmp.h index 7836585..7286dc6 100644 --- a/src/bmp.h +++ b/src/bmp.h @@ -4,7 +4,7 @@ #define BMP_H void bmp_generate(unsigned short width, unsigned short height, - unsigned char color_depth, char *file_path, + unsigned char color_depth, bool descending, char *file_path, line_fn generate_line); #endif \ No newline at end of file diff --git a/src/generator.c b/src/generator.c index a363d0a..a7b5a03 100644 --- a/src/generator.c +++ b/src/generator.c @@ -43,12 +43,13 @@ void generate_bmp_line(unsigned short y, unsigned char *data_buffer, unsigned int len) { unsigned int i; unsigned int x; - if (y > 0 && (y % global_params.size) == 0) { + if (y % global_params.size == 0) { generate_line(); } for (i = 0; i < len; i++) { x = i / (color_depth * global_params.size); - data_buffer[i] = current_line[x * color_depth + (i % color_depth)]; + data_buffer[(global_params.rotation / 2) == 1 ? i : (len - i - 1)] = + current_line[x * color_depth + (i % color_depth)]; } } @@ -68,6 +69,7 @@ void debug_parameters(parameters params) { printf(" var. %u,%u,%u\n", params.var[0], params.var[1], params.var[2]); } + printf(" rot. %d\n", params.rotation); } } @@ -84,7 +86,6 @@ void init(parameters params) { current_line[i] = params.start[i % color_depth]; } set_seed(params.seed); - generate_line(); } void clean() { @@ -105,8 +106,8 @@ void generate(parameters params) { } clock_t start = clock(); init(params); - bmp_generate(params.width, params.height, color_depth, params.file_path, - generate_bmp_line); + bmp_generate(params.width, params.height, color_depth, + params.rotation % 2 == 1, params.file_path, generate_bmp_line); clean(); print_time(params, start); } \ No newline at end of file diff --git a/src/types.h b/src/types.h index ad67a24..8f9c83c 100644 --- a/src/types.h +++ b/src/types.h @@ -14,6 +14,7 @@ struct Parameters { unsigned char slope; unsigned char start[3]; unsigned char var[3]; + unsigned char rotation; }; typedef struct Parameters parameters;