#include #include #include #include #include #include #include #include #include #include #include #include "commands.h" static void usage(int argc, char **argv, const char *message, ...) { if (message) { va_list args; va_start(args, message); vfprintf(stderr, message, args); va_end(args); fprintf(stderr, "\n"); } fprintf(stderr, "usage: %1$s merge input.png output-r.png output-g.png output-b.png\n", argv[0]); exit(1); } int cammy_merge(int argc, char **argv) { cammy_image *image_in_r, *image_in_g, *image_in_b, *image_out; if (argc < 3) { usage(argc, argv, "No red input file provided"); } else if (argc < 4) { usage(argc, argv, "No green input file provided"); } else if (argc < 5) { usage(argc, argv, "No blue input file provided"); } else if (argc < 6) { usage(argc, argv, "No output PNG filename provided"); } if ((image_in_r = cammy_image_open(argv[2])) == NULL) { goto error_image_open_r; } if ((image_in_g = cammy_image_open(argv[3])) == NULL) { goto error_image_open_g; } if ((image_in_b = cammy_image_open(argv[4])) == NULL) { goto error_image_open_b; } if ((image_out = cammy_image_merge(image_in_r, image_in_g, image_in_b)) == NULL) { goto error_image_merge; } if (cammy_image_save(image_out, argv[5]) < 0) { goto error_image_save; } cammy_image_destroy(image_out); cammy_image_destroy(image_in_b); cammy_image_destroy(image_in_g); cammy_image_destroy(image_in_r); return 0; error_image_save: cammy_image_destroy(image_out); error_image_merge: cammy_image_destroy(image_in_b); error_image_open_b: cammy_image_destroy(image_in_g); error_image_open_g: cammy_image_destroy(image_in_r); error_image_open_r: return 1; }