/* * INTERPOLATOR 2070 * * +---------------------------------------+ * ! Do not use that software in real life ! * +---------------------------------------+ * * imported in FloatImg Mon Nov 9 19:08:57 CET 2020 * */ #include #include #include #include #include #include #include "../floatimg.h" #include "fifo.h" #include "glitches.h" #include "crapulator.h" #include "metriques.h" #include "filterstack.h" int verbosity; /* -------------------------------------------------------------- */ /* on va essayer de trier l'ordre d'apparition des images * selon une metrique approximative */ typedef struct { int idx; /* in globbuf.gl_pathv[n] */ float value; /* from metric analyse */ } IdxValue; static int negative = 0; static int cmp_idxvalues(const void *pa, const void *pb) { if (negative) return ( ((IdxValue *)pa)->value < ((IdxValue *)pb)->value); else return ( ((IdxValue *)pa)->value > ((IdxValue *)pb)->value); } int tentative_triage(glob_t *ptr_glob, IdxValue **ptr_idxval, int method, double *p_average) { int idx, foo, nombre; float metrique; double average; char *filename; IdxValue *idxvalues; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %p %p %d %p)\n", __func__, ptr_glob, ptr_idxval, method, p_average); #endif if (0==method && verbosity) { fprintf(stderr, "\tWTF? in %s, sort method was ZERO?\n", __func__); } nombre = ptr_glob->gl_pathc; /* allocate the array for the sorting action */ idxvalues = calloc(nombre, sizeof(IdxValue)); if (NULL==idxvalues) { fprintf(stderr, "MEMORY ERROR in %s\n", __func__); exit(1); } // fprintf(stderr, "IdxValues array at %p\n", idxvalues); *ptr_idxval = idxvalues; average = 0.0; /* compute all the needed values */ for (idx=0; idxgl_pathv[idx]; foo = get_float_metric_from_file(filename, &metrique, method); if (foo) { fprintf(stderr, "%s: err %d get metric of '%s'\n", __func__, foo, filename); return -1; } if (verbosity) fprintf(stderr, "%5d %s %10.3f\r", idx, filename, metrique); idxvalues[idx].idx = idx; idxvalues[idx].value = metrique; average += (double)metrique; } if (method) { /* and now, we can massage all our datas */ fprintf(stderr, "sorting method = %d ...\n", method); qsort(idxvalues, nombre, sizeof(IdxValue), cmp_idxvalues); } if (verbosity > 1) { for (idx=0; idx %d, %d files found\n", pattern, foo, (int)globbuf.gl_pathc); if (0 == globbuf.gl_pathc) { fprintf(stderr, "%s : no file found, ABEND\n", __func__); exit(1); } idx_values = NULL; foo = tentative_triage(&globbuf, &idx_values, sort, &meanmetric); if (foo) { fprintf(stderr, "sort of %p -> %d\n\n", idx_values, foo); return foo; } foo = fimg_fileinfos(globbuf.gl_pathv[0], iarray); if (FIMG_TYPE_RGB != iarray[2]) { fprintf(stderr, "can work only on RGB fimg picture, was %d\n", iarray[2]); exit(1); /* BLAM! */ } w = iarray[0], h = iarray[1]; if (verbosity) fprintf(stderr, "first image size : %dx%d\n", w, h); fimg_create(&A, w, h, 3); pFirst = &A; fimg_clear(&A); fimg_create(&B, w, h, 3); pSecond = &B; fimg_clear(&B); fimg_create(&Out, w, h, 3); ipng = 0; for (idx=0; idx %d\n", __func__, cptr, foo); continue; } /* here was the input filter */ foo = filterstack_run(0, &B, 0); if (foo) { fprintf(stderr, "%s: input fx fail %d\n", __func__, foo); exit(1); } for (step=0; step %d\n", foo); return foo; } sprintf(line, "%s/%05d.png", outdir, ipng); foo = fimg_save_as_png(&Out, line, 0); if (foo) { fprintf(stderr, "err saving %s\n", line); return -8; } ipng++; } #if 1 /* temporary hack : move datas */ fimg_copy_data(&B, &A); #else /* swap pointers to the two picz */ pTmp = pSecond; pSecond = pFirst; pFirst = pTmp; /* XXX THIS CODE DON'T WORK !!! */ #endif } fprintf(stderr, "\ngenerated %d png files\n", ipng); return 0; } /* -------------------------------------------------------------- */ void help(void) { puts("\tINTERPOLATOR"); puts("usage:\n\tinterpolator [options] "); /* may be we can make options incoherent, like * the options of 'fonderie' software ? */ puts("options:"); puts("\t-E i:bla:k\tinput filter chain"); puts("\t-F name:j\toutput filter chain"); puts("\t-n\t\tmake negative"); puts("\t-S nn\t\tmysterious sort"); puts("\t-L\t\tlist available filters"); puts("\t-v\t\tincrease verbosity"); if (verbosity) { list_crapulors("available filters"); } exit(0); } /* -------------------------------------------------------------- */ int main (int argc, char *argv[]) { int foo; int nbrsteps = 9; int opt; // int inFx = 0; // int outFx = 0; int sort = 0; char *InFchain = "0"; char *OutFchain = "0"; fprintf(stderr, "*** %s\n\tcompiled on %s %s\n", argv[0], __DATE__, __TIME__); if (verbosity) fimg_print_version(2); #if DEBUG_LEVEL /* this is for the debug off calling shellscript */ for (foo=0; foo \n"); exit(1); } foo = parse_filter_chain(0, InFchain); if (foo) { fprintf(stderr, "err %d parsing '%s'\n", foo, InFchain); exit(1); } foo = parse_filter_chain(1, OutFchain); if (foo) { fprintf(stderr, "err %d parsing '%s'\n", foo, OutFchain); exit(1); } if (verbosity) { fprintf(stderr, "\tinput glob '%s'\n", argv[optind]); fprintf(stderr, "\toutput dir '%s'\n", argv[optind+1]); fprintf(stderr, "\tsrc filter '%s'\n", InFchain); fprintf(stderr, "\tout filter '%s'\n", OutFchain); fprintf(stderr, "\tsort %d\n", sort); } if (verbosity > 1) { fputs("=========================\n", stderr); filterstack_list(0, __FILE__); filterstack_list(1, __FILE__); fputs("=========================\n", stderr); } nbrsteps = atoi(argv[optind+2]); foo = interpolator(argv[optind], argv[optind+1], nbrsteps, 0, 0, sort); fprintf(stderr, "interpolator give us a %d score\n", foo); return 0; } /* -------------------------------------------------------------- */