FloatImg/tools/fimgfx.c

293 lines
6.4 KiB
C
Raw Normal View History

2019-11-30 03:06:40 +11:00
/*
FIMGFX
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "../floatimg.h"
/* --------------------------------------------------------------------- */
int verbosity;
float global_fvalue;
typedef struct {
char *name;
int id;
int nbarg;
2020-03-26 19:12:25 +11:00
int flags;
2019-11-30 03:06:40 +11:00
} Fx;
2020-02-17 11:27:33 +11:00
enum fxid { Fx_cos01=5, Fx_cos010, Fx_pow2, Fx_sqrt, Fx_gray0, Fx_halfsz0,
2020-10-09 10:26:07 +11:00
Fx_rot90, Fx_cmixa, Fx_desat, Fx_ctr2x2, Fx_norm,
2021-04-21 02:46:54 +11:00
Fx_classtrial,
2021-04-20 21:06:19 +11:00
Fx_xper, Fx_binarize, Fx_trinarize,Fx_hilight_R };
2019-11-30 03:06:40 +11:00
Fx fx_list[] = {
2020-03-26 19:12:25 +11:00
{ "cos01", Fx_cos01, 0, 1 },
{ "cos010", Fx_cos010, 0, 1 },
{ "pow2", Fx_pow2, 0, 1 },
{ "sqrt", Fx_sqrt, 0, 1 },
{ "gray0", Fx_gray0, 0, 1 },
{ "halfsz0", Fx_halfsz0, 0, 1 },
{ "rot90", Fx_rot90, 0, 0 },
{ "cmixa", Fx_cmixa, 0, 1 },
2020-03-26 19:12:25 +11:00
{ "xper", Fx_xper, 0, 1 },
2020-10-08 00:26:34 +11:00
{ "desat", Fx_desat, 0, 1 },
{ "ctr2x2", Fx_ctr2x2, 0, 1 },
2020-10-09 10:26:07 +11:00
{ "norm", Fx_norm, 0, 1 },
2021-04-21 02:46:54 +11:00
{ "classtrial", Fx_classtrial, 0, 1 },
2021-04-20 21:06:19 +11:00
{ "binarize", Fx_binarize, 0, 1 },
{ "trinarize", Fx_trinarize, 0, 1 },
2021-03-25 21:11:16 +11:00
{ "hilightr", Fx_hilight_R, 0, 1 },
{ NULL, 0, 0, 0 }
2019-11-30 03:06:40 +11:00
};
/* --------------------------------------------------------------------- */
2020-03-26 19:12:25 +11:00
int lookup_fxidx(char *txt)
2019-11-30 03:06:40 +11:00
{
Fx *fx;
int n;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, txt);
#endif
for (n=0, fx=fx_list; fx->name; fx++, n++) {
2020-02-17 11:27:33 +11:00
#if DEBUG_LEVEL > 1
2020-03-26 19:12:25 +11:00
fprintf(stderr, " -> %3d %s\n", n, fx->name);
2019-11-30 03:06:40 +11:00
#endif
if (!strcmp(fx->name, txt)) {
2020-03-26 19:12:25 +11:00
return n;
2019-11-30 03:06:40 +11:00
}
}
2020-02-17 11:27:33 +11:00
return -1; /* NOT FOUND */
}
/* --------------------------------------------------------------------- */
2020-10-04 23:00:44 +11:00
/*
* this is the mutant function
*/
2020-02-17 11:27:33 +11:00
int do_experiment(FloatImg *S, FloatImg *D, float kf)
{
int foo;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p %p %f )\n", __func__, S, D, kf);
#endif
foo = fimg_copy_data(S, D);
if (foo) {
fprintf(stderr, "%s err %d copy data %p -> %p\n", __func__,
foo, S, D);
return -98;
}
2020-10-06 22:01:48 +11:00
foo = fimg_classif_trial(S, D, kf, 0);
2020-02-17 11:27:33 +11:00
if (foo) {
2020-10-04 23:00:44 +11:00
fprintf(stderr, "%s err %d classif_trial %p\n", __func__,
foo, S);
2020-02-17 11:27:33 +11:00
return -98;
}
2019-11-30 03:06:40 +11:00
2020-02-17 11:27:33 +11:00
return 0;
2019-11-30 03:06:40 +11:00
}
/* --------------------------------------------------------------------- */
static void help(int lvl)
{
Fx *fx;
2021-04-20 21:06:19 +11:00
int foo;
2019-11-30 03:06:40 +11:00
2020-02-20 08:42:52 +11:00
printf("-- fimg special effects -- %s %s --\n", __DATE__, __TIME__);
2020-01-04 04:21:43 +11:00
puts("usage:");
2020-02-20 08:32:24 +11:00
puts("\tfimgfx [options] <effect> source.fimg resultat.fimg");
2020-01-04 04:21:43 +11:00
2020-01-11 00:18:38 +11:00
puts("options:");
puts("\t-k N.N\tset the floating value");
puts("\t-v\tincrease verbosity");
2020-01-04 04:21:43 +11:00
puts("effects:");
printf("\t");
2021-04-20 21:06:19 +11:00
foo = 0;
for (fx=fx_list; fx->name; fx++) {
2021-04-20 21:06:19 +11:00
foo += printf("%s ", fx->name);
if (foo > 55) {
printf("\n\t");
foo = 0;
}
}
puts("");
2020-02-20 08:32:24 +11:00
fimg_print_version(1);
2019-11-30 03:06:40 +11:00
exit(0);
}
/* --------------------------------------------------------------------- */
2021-03-25 21:11:16 +11:00
int do_an_effect(char *srcfname, int fxidx, char *dstfname)
2019-11-30 03:06:40 +11:00
{
FloatImg src, dest;
2020-03-26 19:12:25 +11:00
int foo, action;
2019-11-30 03:06:40 +11:00
double maxval;
2019-11-30 05:55:52 +11:00
#if DEBUG_LEVEL
2019-11-30 03:06:40 +11:00
fprintf(stderr, ">>> %s ( '%s' %d '%s' )\n", __func__,
2021-03-25 21:11:16 +11:00
srcfname, action, dstfname);
2019-11-30 03:06:40 +11:00
#endif
2021-03-25 21:11:16 +11:00
foo = fimg_create_from_dump(srcfname, &src);
2019-11-30 03:06:40 +11:00
if (foo) {
2021-03-25 21:11:16 +11:00
fprintf(stderr, "err load '%s' : %d\n", srcfname, foo);
2019-11-30 03:06:40 +11:00
return foo;
}
maxval = (double)fimg_get_maxvalue(&src);
2020-03-26 19:12:25 +11:00
if (fx_list[fxidx].flags & 1) {
foo = fimg_clone(&src, &dest, 0);
if (foo) {
fprintf(stderr, "err clone %p : %d\n", &src, foo);
return foo;
}
2019-11-30 03:06:40 +11:00
}
2020-03-26 19:12:25 +11:00
else {
2021-04-20 21:06:19 +11:00
fprintf(stderr, "%s: ???\n", __func__); /* XXX */
2020-03-26 19:12:25 +11:00
memset(&dest, 0, sizeof(dest));
2021-04-21 02:46:54 +11:00
return -888;
2020-03-26 19:12:25 +11:00
}
action = fx_list[fxidx].id;
2019-11-30 03:06:40 +11:00
2020-03-26 19:12:25 +11:00
switch (action) {
2019-11-30 03:06:40 +11:00
case Fx_cos01:
fimg_cos_01(&src, &dest, maxval); break;
case Fx_cos010:
fimg_cos_010(&src, &dest, maxval); break;
2019-11-30 03:06:40 +11:00
case Fx_pow2:
fimg_power_2(&src, &dest, maxval); break;
case Fx_sqrt:
fimg_square_root(&src, &dest, maxval); break;
2020-01-11 00:18:38 +11:00
case Fx_gray0: /* new 2020 01 10 */
fimg_to_gray(&src); fimg_copy_data(&src, &dest);
break;
2020-02-17 11:27:33 +11:00
case Fx_xper:
do_experiment(&src, &dest, maxval); break;
2020-03-26 19:12:25 +11:00
case Fx_rot90:
foo = fimg_rotate_90(&src, &dest, 0); break;
case Fx_cmixa:
fimg_copy_data(&src, &dest);
foo = fimg_colors_mixer_a(&dest, 2.0); break;
2020-03-26 19:12:25 +11:00
2020-02-17 02:21:27 +11:00
case Fx_halfsz0:
2020-03-26 19:12:25 +11:00
fprintf(stderr, "halfsize was not implemented\n");
2021-04-06 04:26:10 +11:00
fprintf(stderr, "see 'fimghalfsize.c'. \n");
2020-02-17 02:21:27 +11:00
return -3;
2021-04-21 02:46:54 +11:00
case Fx_classtrial:
fprintf(stderr, "classif trial with %f fvalue\n",
global_fvalue);
foo = fimg_classif_trial(&src, &dest, global_fvalue, 0);
break;
2020-10-08 00:26:34 +11:00
case Fx_desat:
fimg_copy_data(&src, &dest);
foo = fimg_mix_rgb_gray(&dest, global_fvalue);
break;
2020-10-08 00:26:34 +11:00
case Fx_ctr2x2:
foo = fimg_contour_2x2(&src, &dest, 0);
break;
2021-03-25 21:11:16 +11:00
case Fx_binarize:
fimg_copy_data(&src, &dest);
foo = fimg_binarize(&dest, 0);
break;
2021-04-20 21:06:19 +11:00
case Fx_trinarize:
fimg_copy_data(&src, &dest);
foo = fimg_trinarize(&dest, 0);
break;
2021-03-25 21:11:16 +11:00
case Fx_hilight_R:
foo = fimg_highlight_color(&src, &dest, 'R', 1.333);
break;
2019-11-30 03:06:40 +11:00
default:
2020-02-20 08:32:24 +11:00
fprintf(stderr, "%s %s : %d is bad action\n",
2020-03-26 19:12:25 +11:00
__FILE__, __func__, action);
2019-11-30 03:06:40 +11:00
break;
}
2021-03-25 21:11:16 +11:00
foo = fimg_dump_to_file(&dest, dstfname, 0);
2019-11-30 03:06:40 +11:00
if (foo) {
fprintf(stderr, "dumping datas to file give us a %d\n", foo);
return foo;
}
2021-04-20 21:06:19 +11:00
fimg_destroy(&src);
if (dest.type) {
fimg_destroy(&dest);
}
2019-11-30 03:06:40 +11:00
return 0;
}
/* --------------------------------------------------------------------- */
int main(int argc, char *argv[])
{
int foo, opt, action;
int nba;
char *operator;
char *srcname = "";
char *dstname = "out.fimg";
while ((opt = getopt(argc, argv, "hk:v")) != -1) {
switch(opt) {
case 'h': help(0); break;
case 'k': global_fvalue = atof(optarg); break;
case 'v': verbosity++; break;
}
}
2019-11-30 05:55:52 +11:00
#if DEBUG_LEVEL
2019-11-30 03:06:40 +11:00
fprintf(stderr, "argc %d optind %d\n", argc, optind);
for (foo=0; foo<argc; foo++)
fprintf(stderr, "%3d %c %s\n", foo, foo==optind?'*':' ', argv[foo]);
#endif
if (3 > argc-optind) {
fprintf(stderr, "%s need some arguments...\n", argv[0]);
exit(1);
}
2020-06-24 21:37:02 +11:00
if (verbosity>1) fprintf(stderr, "*** fimgfx *** %s %s\n", __DATE__, __TIME__);
2019-11-30 03:06:40 +11:00
operator = argv[optind];
2020-03-26 19:12:25 +11:00
action = lookup_fxidx(operator);
2019-11-30 03:06:40 +11:00
if (action < 0) {
fprintf(stderr, "garbage found in opcode field : %s\n", operator);
exit(1);
}
if (verbosity) {
2019-11-30 05:55:52 +11:00
fprintf(stderr, " global fvalue %f\n", global_fvalue);
fprintf(stderr, " action %d\n", action);
fprintf(stderr, " verbosity %d\n", verbosity);
2019-11-30 03:06:40 +11:00
}
if ((nba=fx_list[action].nbarg)) {
fprintf(stderr, "action '%s' need %d arg\n", operator, nba);
}
srcname = argv[optind+1];
dstname = argv[optind+2];
2019-11-30 05:55:52 +11:00
if (verbosity) fprintf(stderr, "%s ==> %s\n", srcname, dstname);
2019-11-30 03:06:40 +11:00
foo = do_an_effect(srcname, action, dstname);
2019-11-30 05:55:52 +11:00
if (foo) {
fprintf(stderr, "do an effect -> %d\n", foo);
}
2019-11-30 03:06:40 +11:00
return 0;
}
/* --------------------------------------------------------------------- */