forked from tTh/FloatImg
158 lines
3.4 KiB
C
158 lines
3.4 KiB
C
/*
|
|
* INTERPOLATOR 2070
|
|
*
|
|
* Don't use that software in real life !
|
|
*
|
|
* imported in FloatImg Mon Nov 9 19:08:57 CET 2020
|
|
*
|
|
*/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <glob.h>
|
|
|
|
#include "../floatimg.h"
|
|
|
|
#include "glitches.h"
|
|
#include "crapulator.h"
|
|
|
|
// XXX #include "fonctions.h"
|
|
|
|
int verbosity;
|
|
int convert_to_gray; /* needed by fonctions.c */
|
|
|
|
/* -------------------------------------------------------------- */
|
|
int interpolator(char *pattern, char *outdir, int Nsteps)
|
|
{
|
|
FloatImg A, B, Out, *pFirst, *pSecond;
|
|
glob_t globbuf;
|
|
int foo, idx, ipng, w, h, step;
|
|
int iarray[3];
|
|
char *cptr, line[200];
|
|
float coef;
|
|
|
|
fprintf(stderr, "\nfrom %s to %s with %d steps.\n", pattern, outdir, Nsteps);
|
|
|
|
memset(&globbuf, 0, sizeof(glob_t));
|
|
foo = glob(pattern, 0, NULL, &globbuf);
|
|
fprintf(stderr, "globbing '%s' -> %d, %ld files found\n",
|
|
pattern, foo, globbuf.gl_pathc);
|
|
|
|
if (0 == globbuf.gl_pathc) {
|
|
fprintf(stderr, "%s : no file found, aborting\n", __func__);
|
|
return -1;
|
|
}
|
|
|
|
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);
|
|
}
|
|
w = iarray[0], h = iarray[1];
|
|
fprintf(stderr, "first image size : %dx%d\n", w, h);
|
|
|
|
fimg_create(&A, w, h, 3); pFirst = &A;
|
|
fimg_create(&B, w, h, 3); pSecond = &B;
|
|
fimg_create(&Out, w, h, 3);
|
|
|
|
ipng = 0;
|
|
for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
|
|
|
cptr = globbuf.gl_pathv[idx];
|
|
|
|
/* read the next file in B */
|
|
fprintf(stderr, "loading %s\r", cptr);
|
|
foo = fimg_load_from_dump(cptr, &B);
|
|
if (foo) {
|
|
fprintf(stderr, "load #%d from dump -> %d\n", idx, foo);
|
|
continue;
|
|
}
|
|
|
|
/* here, we can insert the input filter */
|
|
/* OK try it ... */
|
|
foo = crapulator(&B, 0, 256.7);
|
|
if (foo) {
|
|
fprintf(stderr, "crapulator failure %d\n", foo);
|
|
exit(1);
|
|
}
|
|
|
|
for (step=0; step<Nsteps; step++) {
|
|
coef = (float)step / (float)Nsteps;
|
|
fimg_interpolate(pSecond, pFirst, &Out, coef);
|
|
|
|
/* here we can insert the output filter */
|
|
kill_a_few_lines(&Out, 150.5, 5+(rand()%20));
|
|
|
|
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, "generated %d png files\n", ipng);
|
|
|
|
return 0;
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
void help(void)
|
|
{
|
|
puts("\tINTERPOLATOR\noptions:");
|
|
|
|
/* may be we can make options incoherent, like
|
|
* the options of 'fonderie' software ?
|
|
*/
|
|
|
|
exit(0);
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
int main (int argc, char *argv[])
|
|
{
|
|
int foo;
|
|
int nbrsteps = 9;
|
|
int opt;
|
|
|
|
fprintf(stderr, "*** %s : compiled by tTh, %s %s\n", __FILE__,
|
|
__DATE__, __TIME__);
|
|
fimg_print_version(2);
|
|
|
|
while ((opt = getopt(argc, argv, "hv")) != -1) {
|
|
switch(opt) {
|
|
case 'h': help(); break;
|
|
case 'v': verbosity++; break;
|
|
}
|
|
}
|
|
|
|
/* TO BE CONTINUED *****/
|
|
|
|
if (4 != argc) {
|
|
fprintf(stderr, "args: <in globpattern> <out dir> <nbrsteep>\n");
|
|
exit(1);
|
|
}
|
|
|
|
nbrsteps = atoi(argv[3]);
|
|
|
|
foo = interpolator(argv[1], argv[2], nbrsteps);
|
|
|
|
fprintf(stderr, "interpolator give a %d score\n", foo);
|
|
|
|
return 0;
|
|
}
|
|
/* -------------------------------------------------------------- */
|