double rgbdiff_p(double rgb1_r, double rgb1_g,double rgb1_b, double rgb2_r, double rgb2_g, double rgb2_b) { double rgb1[3] = {rgb1_r, rgb1_g, rgb1_b}; double rgb2[3] = {rgb2_r, rgb2_g, rgb2_b}; return rgbdiff(rgb1, rgb2); }
int main(int argc, const char **argv) { size_t in_size = 0, enc_bytes, rgb1_bytes, rgb2_bytes; ssize_t written; struct RGB_Info ri1, ri2; srt_string *iobuf = NULL, *rgb1_buf = NULL, *rgb2_buf = NULL, *rgb3_buf = NULL; int exit_code = 2; FILE *fin = NULL, *fout = NULL; const char *exit_msg = "not enough parameters"; srt_bool ro; enum ImgTypes t_in1, t_in2, t_out; #define IMGC_XTEST(test, m, c) \ if (test) { \ exit_msg = m; \ exit_code = c; \ break; \ } for (;;) { if (argc < 2) break; ro = argc < 3 ? S_TRUE : S_FALSE; t_in1 = file_type(argv[1]); t_in2 = file_type(argv[2]); t_out = argc < 4 ? IMG_none : file_type(argv[3]); IMGC_XTEST(t_in1 == IMG_error || t_in2 == IMG_error || t_out == IMG_error, "invalid parameters", t_in1 == IMG_error || t_in2 == IMG_error ? 3 : 4); fin = fopen(argv[1], "rb"); iobuf = ss_dup_read(fin, MAX_FILE_SIZE); in_size = ss_size(iobuf); IMGC_XTEST(!in_size, "input #1 read error", 5); rgb1_bytes = any2rgb(&rgb1_buf, &ri1, iobuf, t_in1); IMGC_XTEST(!rgb1_bytes, "can not process input file #1", 6); fclose(fin); fin = fopen(argv[2], "rb"); ss_read(&iobuf, fin, MAX_FILE_SIZE); in_size = ss_size(iobuf); IMGC_XTEST(!in_size, "input #2 read error", 7); rgb2_bytes = any2rgb(&rgb2_buf, &ri2, iobuf, t_in2); IMGC_XTEST(!rgb2_bytes, "can not process input file #2", 8); IMGC_XTEST(ss_size(rgb1_buf) != ss_size(rgb2_buf), "can not process input file #2", 9); exit_code = rgbdiff(&rgb3_buf, rgb1_buf, &ri1, rgb2_buf, &ri2) ? 1 : 0; if (exit_code == 1) fprintf(stderr, "Image files %s and %s differ\n", argv[1], argv[2]); if (t_out != IMG_none) { enc_bytes = rgb2type(&iobuf, t_out, rgb3_buf, &ri1, F_None); IMGC_XTEST(!enc_bytes, "output file encoding error", 10); fout = fopen(argv[3], "wb+"); written = ss_write(fout, iobuf, 0, ss_size(iobuf)); IMGC_XTEST(!ro && (written < 0 || (size_t)written != ss_size(iobuf)), "write error", 11); } break; } #ifdef S_USE_VA_ARGS ss_free(&iobuf, &rgb1_buf, &rgb2_buf, &rgb3_buf); #else ss_free(&iobuf); ss_free(&rgb1_buf); ss_free(&rgb2_buf); ss_free(&rgb3_buf); #endif if (fin) fclose(fin); if (fout) fclose(fout); return exit_code > 1 ? exit_with_error(argv, exit_msg, exit_code) : 0; }