Compare commits

...

9 Commits

Author SHA1 Message Date
tth
ce6d6e58bb seekin the holy gral of pipedeprod 2021-04-24 00:16:23 +02:00
tth
6d4df793da a little bla 2021-04-24 00:11:37 +02:00
tth
0f2b0ec916 added a setter, wtf ? 2021-04-23 23:54:47 +02:00
tth
0632bc288d bal 2021-04-23 14:42:08 +02:00
tth
6b5412edcd better error message and aborting 2021-04-23 13:39:38 +02:00
tth
487b091db3 work on the special fx demo 2021-04-23 13:20:20 +02:00
tth
ce73143d96 bla 2021-04-23 11:15:56 +02:00
tth
0478bae6a3 better handling of file extenstions 2021-04-23 11:08:05 +02:00
tth
dcc1ff35cb moare doc is moare 2021-04-22 23:52:39 +02:00
18 changed files with 312 additions and 89 deletions

View File

@ -79,7 +79,7 @@ return 0;
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
/* called by 'fonderie.c' /* called by 'fonderie.c'
*/ */
int export_fifo(char *fname, int step) int export_fifo(char *fname, int notused)
{ {
int foo, type; int foo, type;
@ -136,13 +136,18 @@ if (verbosity > 2) fprintf(stderr, "%s : next slot %d\n",
return 0; return 0;
} }
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
int create_fifo(int nbslot, int w, int h, int t) /*
* this function must have a lot of new parameters,
* -- filetype of exported pictures...
*/
int create_fifo(int nbslot, int w, int h, int imgtype)
{ {
int foo, idx; int foo, idx;
#if DEBUG_LEVEL #if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %d %dx%d %d )\n", __func__, fprintf(stderr, ">>> %s ( %d %dx%d %d )\n", __func__,
nbslot, w, h, t); nbslot, w, h, imgtype);
#endif #endif
memset(&g_fifo, 0, sizeof(A_Fifo)); memset(&g_fifo, 0, sizeof(A_Fifo));
@ -152,17 +157,32 @@ g_fifo.nbslots = nbslot;
g_fifo.slots = calloc(nbslot, sizeof(FloatImg)); g_fifo.slots = calloc(nbslot, sizeof(FloatImg));
if (NULL==g_fifo.slots) abort(); if (NULL==g_fifo.slots) abort();
for (idx=0; idx<nbslot; idx++) { for (idx=0; idx<nbslot; idx++) {
foo = fimg_create(&g_fifo.slots[idx], w, h, t); foo = fimg_create(&g_fifo.slots[idx], w, h, imgtype);
if (foo) { if (foo) {
fprintf(stderr, "%s idx %d err%d\n", __func__, idx, foo); fprintf(stderr, "%s idx %d err%d\n", __func__, idx, foo);
return foo; return foo;
} }
fimg_clear(&g_fifo.slots[idx]); fimg_clear(&g_fifo.slots[idx]);
} }
foo = fimg_create(&g_fifo.total, w, h, t); foo = fimg_create(&g_fifo.total, w, h, imgtype);
g_fifo.next = 0; g_fifo.next = 0;
g_fifo.magic = MAGIC_FIFO; g_fifo.magic = MAGIC_FIFO;
return 0; return 0;
} }
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
/*
* omfg ! I've write a setter !
*/
int set_fifo_output_format(int filetype)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %d )\n", __func__, filetype);
#endif
g_fifo.export_type = filetype;
return -1;
}

View File

@ -1,15 +1,21 @@
/* /*
* Machine qui fait des fils flous * Machine qui fait des fils flous par la
* méthode de la moyenne mobile.
*/ */
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
typedef struct { typedef struct {
unsigned long magic; unsigned long magic;
int nbslots; /* how many pics used ? */ int nbslots; /* how many pics used ? */
FloatImg total; /* computing workspace */ FloatImg total; /* computing workspace */
FloatImg wspace; /* computing workspace */ FloatImg wspace; /* computing workspace */
FloatImg *slots; /* circular buffer */ FloatImg *slots; /* circular buffer */
int next; /* incremented with modulo */ int next; /* incremented with modulo */
int export_type; /* fimg/png/pnm/... */
} A_Fifo; } A_Fifo;
#define MAGIC_FIFO 0xabcd9876 #define MAGIC_FIFO 0xabcd9876
@ -29,11 +35,13 @@ typedef struct {
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
int export_fifo(char *fname, int step); int create_fifo(int nbslot, int w, int h, int t);
int set_fifo_output_format(int filetype);
int export_fifo(char *fname, int notused);
int insert_picture(FloatImg *src); int insert_picture(FloatImg *src);
int create_fifo(int nbslot, int w, int h, int t);
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
/* /*

View File

@ -77,7 +77,7 @@ return 0;
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
int demarre_la_machine(char *pattern, char *outdir, int szfifo, int demarre_la_machine(char *pattern, char *outdir, int szfifo,
int step, int blk) int outfmt, int blk)
{ {
int foo, idx, width, height; int foo, idx, width, height;
glob_t globbuf; glob_t globbuf;
@ -92,8 +92,6 @@ fprintf(stderr, "\n>>> %s ( '%s' -> '%s' %d )\n", __func__,
pattern, outdir, szfifo); pattern, outdir, szfifo);
#endif #endif
if (1 != step) fprintf(stderr, "\tstep is %d\n", step);
(void)fimg_timer_set(0); (void)fimg_timer_set(0);
memset(&globbuf, 0, sizeof(glob_t)); memset(&globbuf, 0, sizeof(glob_t));
@ -197,7 +195,7 @@ int foo, opt;
int fifosize = 10; int fifosize = 10;
char *in_pattern = "capture/?????.fimg"; char *in_pattern = "capture/?????.fimg";
char *out_dir = "p8"; char *out_dir = "p8";
int steps = 1; int outfmt = FILE_TYPE_PNG;
int blanks = 20; int blanks = 20;
char *InFchain = "none"; char *InFchain = "none";
char *OutFchain = "none"; char *OutFchain = "none";
@ -206,7 +204,7 @@ fprintf(stderr, "*** %s\n\tcompiled %s, %s, pid %d\n",
argv[0], __DATE__, __TIME__, getpid()); argv[0], __DATE__, __TIME__, getpid());
fimg_print_version(2); fimg_print_version(2);
while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:s:T:vw:x:")) != -1) { while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:T:vw:x:")) != -1) {
switch(opt) { switch(opt) {
case 'E': InFchain = optarg; break; case 'E': InFchain = optarg; break;
case 'F': OutFchain = optarg; break; case 'F': OutFchain = optarg; break;
@ -227,8 +225,6 @@ while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:s:T:vw:x:")) != -1) {
break; break;
case 'v': verbosity++; case 'v': verbosity++;
break; break;
case 's': steps = atoi(optarg);
break;
} }
} }
@ -256,7 +252,7 @@ if (verbosity) {
fprintf(stderr, ".\n"); fprintf(stderr, ".\n");
} }
foo = demarre_la_machine(in_pattern, out_dir, fifosize, steps, blanks); foo = demarre_la_machine(in_pattern, out_dir, fifosize, outfmt, blanks);
fprintf(stderr, "retour du big-run de la machine -> %d\n", foo); fprintf(stderr, "retour du big-run de la machine -> %d\n", foo);

View File

@ -85,6 +85,10 @@ FloatImg image;
int foo; int foo;
float fval; float fval;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' %p %d )\n", __func__, fname, where, mode);
#endif
foo = fimg_create_from_dump(fname, &image); foo = fimg_create_from_dump(fname, &image);
if (foo) { if (foo) {
fprintf(stderr, "%s: err %d loading %s\n", __func__, foo, fname); fprintf(stderr, "%s: err %d loading %s\n", __func__, foo, fname);

View File

@ -23,6 +23,7 @@
static int nextpng, counter; static int nextpng, counter;
static char *destination; static char *destination;
static int chainfilter; static int chainfilter;
static int outtype;
/* and the classic global var */ /* and the classic global var */
extern int verbosity; extern int verbosity;
@ -60,6 +61,7 @@ int single_push_picture(FloatImg *pimg)
{ {
int foo; int foo;
char line[1000], buff[100]; char line[1000], buff[100];
char *extension = ".png";
#if DEBUG_LEVEL #if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p )\n", __func__, pimg); fprintf(stderr, ">>> %s ( %p )\n", __func__, pimg);
@ -71,8 +73,7 @@ if ('/' != line[strlen(line)-1]) {
strcat(line, "/"); strcat(line, "/");
} }
// fprintf(stderr, " destdir = '%s'\n", line); sprintf(buff, "%05d.%s", nextpng, extension);
sprintf(buff, "%05d.png", nextpng);
strcat(line, buff); strcat(line, buff);
// fprintf(stderr, "writing %p to '%s'\n", pimg, line); // fprintf(stderr, "writing %p to '%s'\n", pimg, line);

View File

@ -1,16 +1,21 @@
/* /*
SINGLE SINGLE
experimental and/or testing code, do not use in experimental and/or testing code, do not use in
production. serious production.
*/ */
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
/*
* next:
* dest:
* fxchain:
* outfmt: see floatimg.h for FILE_TYPE_XXX constants
*/
int single_init(int next, char *dest, int fxchain, int outfmt); int single_init(int next, char *dest, int fxchain, int outfmt);
int single_push_picture(FloatImg *pimg); int single_push_picture(FloatImg *pimg);
int single_print_state(char *title, int k); int single_print_state(char *title, int k);
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
/* -------------------------------------------------------------- */

View File

@ -142,7 +142,7 @@ int foo, opt;
char *filterchain = "none"; char *filterchain = "none";
char *globbing = "./capture/?????.fimg"; char *globbing = "./capture/?????.fimg";
char *outdir = "./p8"; char *outdir = "./p8";
char *outtype = ".png"; // char *outtype = ".png";
int do_xper = 0; int do_xper = 0;
fprintf(stderr, "*** %s : compiled %s %s\n", __FILE__, fprintf(stderr, "*** %s : compiled %s %s\n", __FILE__,
@ -189,10 +189,11 @@ if (verbosity) {
fprintf(stderr, "\tinput glob %s\n", globbing); fprintf(stderr, "\tinput glob %s\n", globbing);
fprintf(stderr, "\tfilter chain %s\n", filterchain); fprintf(stderr, "\tfilter chain %s\n", filterchain);
fprintf(stderr, "\toutput dir %s\n", outdir); fprintf(stderr, "\toutput dir %s\n", outdir);
// fprintf(stderr, "\toutput type %s\n", outtype);
fprintf(stderr, "\tdo xper %d\n", do_xper); fprintf(stderr, "\tdo xper %d\n", do_xper);
} }
foo = run_the_singlepass(globbing, outdir, FILTERS, -1); foo = run_the_singlepass(globbing, outdir, FILTERS, FILE_TYPE_PNG);
fprintf(stderr, "\n\tRun the single pass --> %d\n", foo); fprintf(stderr, "\n\tRun the single pass --> %d\n", foo);
return 0; return 0;

6
Global.makefile Normal file
View File

@ -0,0 +1,6 @@
#
# This file is the 'grandmasta' of the compilation process.
# for now, this is juste a wip idea.
#

View File

@ -44,15 +44,15 @@
\newcommand{\interparagraphe { \vspace{60pt} } } \newcommand{\interparagraphe { \vspace{60pt} } }
% ------------------------------------------------------------------- % -------------------------------------------------------------------
\title{Floating images processing} \title{Floating images processing (for fun and profit ?)}
\author{tTh} \author{tTh}
\begin{document} \begin{document}
\maketitle \maketitle
\section*{Image flottante ?} \section*{Une image flottante ?}
Mais de quoi parle-t-on exactement ? \textsl{Mais de quoi parle-t-on exactement ?}
% XXX XXX XXX\vspace{1em} % XXX XXX XXX\vspace{1em}
@ -120,7 +120,9 @@ quelques milliers d'images standard à 256 niveaux, sans trop avoir
\subsection{Dynamique}\index{dynamique} \subsection{Dynamique}\index{dynamique}
Dynamique, précision et \textsl{macheps} ? Dynamique, précision et \textsl{macheps} ? Peu de gens connaissent
la fourbitude des calculs en virgule flottante avec les ordinateurs.
Moi-même compris.
\subsection{Pixel négatif ?} \subsection{Pixel négatif ?}
@ -145,7 +147,7 @@ nous allons créer une image RGB\index{RGB} complètement noire,
puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg}, puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg},
un format complètement inconnu, puisque je viens de l'inventer un format complètement inconnu, puisque je viens de l'inventer
à l'instant même. à l'instant même.
Enfin, non, il y a déja longtemps, avant la pandémie. Enfin, non, il y a déja longtemps, avant la grande pandémie.
Tout d'abord, nous devons déclarer et garnir quelques variables Tout d'abord, nous devons déclarer et garnir quelques variables
pour gérer la machinerie interne. pour gérer la machinerie interne.
@ -194,22 +196,26 @@ mean values:
max value 0.000000 max value 0.000000
\end{verbatim} \end{verbatim}
Nous avons donc sous la main une mécanique qui ne demande qu'à Nous avons donc sous la main un ensemble d'outils mécaniques qui ne demande
faire des trucs futiles et des images qui clignotent. qu'à faire des trucs futiles et des images qui clignotent.
Avec un bon script bash, il y a déja de quoi faire.
La suite vers la page \pageref{codaz}. La suite vers la page \pageref{codaz}.
Vous trouverez dans le répertoire \texttt{tools/}\index{tools/} Vous trouverez dans le répertoire \texttt{tools/}\index{tools/}
d'autres exemples de mise en œuvre des fonctions disponibles d'autres exemples de mise en œuvre des fonctions disponibles
sous formes d'outils en ligne de commande, sous formes d'outils en ligne de commande,
lesquels sont décrits en page \pageref{outils}. lesquels sont approximativement décrits en page \pageref{outils}.
% =================================================================== % ===================================================================
\section{Installation} \section{Installation}
Sauf indications contraires, ces instructions se réfèrent à Sauf indications contraires, ces instructions se réfèrent à
une distribution Debian\index{Debian} récente, mais ça marche une distribution Debian\index{Debian} récente (amd64 et x86),
quasiment pareil avec Fedora\index{Fedora}. mais ça marche quasiment pareil avec Fedora\index{Fedora} 64,
\textit{Attention, ça devient un peu gore\dots} et
probablement Raspbian\index{Raspbian}, modulo les éventuels
soucis de boutisme.
\textit{Attention, ça va devenir un peu gore\dots}
\subsection{Prérequis} \subsection{Prérequis}
@ -234,7 +240,10 @@ Il faut aussi savoir où trouver le code.
\subsection{Compilation} \subsection{Compilation}
Un script \texttt{build.sh} permet de construire approximativement La première chose à faire est d'aller regarder le contenu du fichier
\texttt{Global.makefile} à la racine du projet. Il contient des
informations pertinentes pour la suite des choses.
Ensuite, un script \texttt{build.sh} permet de construire approximativement
le bouzin. Il est loin d'être parfait\footnote{Il doit être possible le bouzin. Il est loin d'être parfait\footnote{Il doit être possible
de faire un Makefile récursif, mais\dots}. de faire un Makefile récursif, mais\dots}.
Dans chacun des répertoires à traiter, ce script devrait trouver Dans chacun des répertoires à traiter, ce script devrait trouver
@ -271,11 +280,12 @@ contenant un certain nombre de définition de structures, de macros,
de constantes\footnote{À l'ancienne, via le pré-processeur} de constantes\footnote{À l'ancienne, via le pré-processeur}
et les prototypes des fonctions utilisables par vos logiciels. et les prototypes des fonctions utilisables par vos logiciels.
Au niveau du code source, ces fonctions sont approximativement Au niveau du code source, ces fonctions sont très approximativement
classées en deux catégories : \texttt{lib/} et \texttt{funcs/}. classées en deux catégories : \texttt{lib/} et \texttt{funcs/}.
La première contient les choses qui sont relativement figées, La première contient les choses qui sont relativement figées,
et la seconde celles qui risquent de bouger. Cette classification et la seconde celles qui risquent de bouger. Cette classification
est en fait indécement arbitraire. est en fait indécement arbitraire.
D'autant plus qu'il y a aussi un répertoire nommé « experiemental ».
\subsection{Structures, macros\dots} \subsection{Structures, macros\dots}
@ -305,7 +315,7 @@ Le troisième est le type d'image : pour le moment, il y en a % trois
un certain nombre un certain nombre
qui sont définis\footnote{et plus ou moins bien gérés\dots} : qui sont définis\footnote{et plus ou moins bien gérés\dots} :
gris, rgb et rgba/rgbz\index{rgba}\index{rgbz}. gris, rgb et rgba/rgbz\index{rgba}\index{rgbz}.
Les constantes adéquates sont dans \texttt{floatimg.h} Les constantes adéquates sont déclarées dans \texttt{floatimg.h}~:
\begin{lstlisting} \begin{lstlisting}
#define FIMG_TYPE_GRAY 1 #define FIMG_TYPE_GRAY 1
@ -347,7 +357,7 @@ un affichage plus détaillé. Ça peut parfois aider.
Une bonne partie des fonctions que nous allons voir est indéterministe. Une bonne partie des fonctions que nous allons voir est indéterministe.
Ce qui veut dire, en langage de tous les soirs, que ça risque de ne Ce qui veut dire, en langage de tous les soirs, que ça risque de ne
pas être la même chose dans l'avenir. Mais après tout, ce n'est pas être la même chose dans l'avenir. Mais après tout, ce n'est
encore qu'un concept en devenir, n'est-ce pas ? encore qu'un concept en devenir, n'est-il pas ?
% ---------------------------------- % ----------------------------------
@ -355,8 +365,9 @@ encore qu'un concept en devenir, n'est-ce pas ?
La première chose que nous devons absolument voir est la gestion La première chose que nous devons absolument voir est la gestion
dynamique de la mémoire qui sera occupée par tous ces pixels flottants, dynamique de la mémoire qui sera occupée par tous ces pixels flottants,
ce qui est un sujet parfois délicat\footnote{GC or not GC ?}. ce qui est un sujet parfois délicat\footnote{GC or not GC ?} parce que
Elle est donc faite, à la base, par ces deux fonctions~: les pixels sont précieux et doivent être bien rangés.
Cette gestion est donc faite, à la base, par ces deux fonctions~:
\begin{lstlisting} \begin{lstlisting}
int fimg_create(FloatImg *fimg, int w, int h, int type); int fimg_create(FloatImg *fimg, int w, int h, int type);
@ -365,7 +376,8 @@ int fimg_destroy(FloatImg *fimg);
L'appelant doit lui-même gérer le descripteur d'image (une structure L'appelant doit lui-même gérer le descripteur d'image (une structure
C décrite plus haut) en le considérant comme un type semi-opaque dont C décrite plus haut) en le considérant comme un type semi-opaque dont
la forme \emph{peut} varier. la forme \emph{peut} varier, mais qu'il convient de mettre à zéro
avant le moindre usage\footnote{\texttt{man 3 memset}}.
Certains membres de cette structure sont Certains membres de cette structure sont
documentés dans ce document, et les autres sont dangereux à documentés dans ce document, et les autres sont dangereux à
toucher. Les types d'images actuellement gérés sont les trois grands toucher. Les types d'images actuellement gérés sont les trois grands
@ -382,10 +394,10 @@ int fimg_images_not_compatible(FloatImg *a, FloatImg *b);
\end{lstlisting} \end{lstlisting}
C'est bien beau d'être enfin résident en mémoire centrale, mais C'est bien beau d'être enfin une image résidente en mémoire centrale, mais
pouvoir aussi exister à long terme en étant stocké dans la matrice pouvoir aussi exister à long terme en étant stocké dans la matrice
est tout aussi pertinent. Il y a deux opérations qui supportent le est tout aussi pertinent.
reste des transits ram/ps. Il y a deux opérations qui supportent le reste des transits ram/ps.
Le format des fichiers est décrit page \pageref{formatfimg}. Le format des fichiers est décrit page \pageref{formatfimg}.
\begin{lstlisting} \begin{lstlisting}
@ -581,9 +593,13 @@ typedef struct {
la valeur maximale, la date de création, une longueur d'onde, la valeur maximale, la date de création, une longueur d'onde,
et bien plus encore. et bien plus encore.
Le champ \texttt{magic[8]} doit contenir une valeur magique. Le champ \texttt{magic[8]} doit contenir une valeur magique~:
les quatre premier octets doivent contenir les quatre caractères
\texttt{'FIMG'}, et les quatre dernier doivent être à 0.
Le champ \texttt{t} (le type de l'image) doit avoir les trois octets Le champ \texttt{t} (le type de l'image) doit avoir les trois octets
de poids fort à 0. de poids fort à 0. Vous trouverez les constantes de type dans le
fichier \texttt{floatimg.h}, et quelques informations
(non-)essentielles.
% ---------------------------------- % ----------------------------------
@ -714,11 +730,14 @@ int fimg_colors_mixer_a(FloatImg *fimg, float fval);
Un \textsl{glitch} peut-il être classé dans la catégorie des effets Un \textsl{glitch} peut-il être classé dans la catégorie des effets
spéciaux ou non ? \textsc{Hmha}, non. un fx est paramétrable spéciaux ou non ? \textsc{Hmha}, non. un fx est paramétrable
et surtout répétitif. Un glitch est quasiment souvbent un phénomène et surtout répétitif. Un glitch est quasiment souvent un phénomène
aléatoire\index{drand48} et tout aussi paramétrable. aléatoire\index{drand48} et tout aussi paramétrable.
J'ai commencé à étudier ces objets étranges quand j'ai commencé J'ai commencé à étudier ces objets étranges quand j'ai commencé
sur l'interpolator\index{interpolator} à l'automne 2020. à travailler sur l'interpolator\index{interpolator} à l'automne 2020.
Hélas, j'ai vite réalisé que c'était assez délicat.
Pour ce genre de \textsl{usecase}, le numérique est pitoyable si on
le compare au \textsc{Betamax}\index{Betamax}.
% ---------------------------------- % ----------------------------------
@ -809,12 +828,12 @@ return 0;
Je vous laisse imaginer les dégats que peut faire cette Je vous laisse imaginer les dégats que peut faire cette
fonction en utilisation réelle. Mieux, je vous propose fonction en utilisation réelle. Mieux, je vous propose
d'essayer par vous-même. d'essayer par vous-même, vous allez voir, c'est assez créatif.
En particulier tout le reste du code qui suppose qu'un pixel En particulier tout le reste du code qui suppose qu'un pixel
ne peut \textbf{pas} être négatif va peut-être exploser de rire. ne peut \textbf{pas} être négatif va peut-être exploser de rire.
Vous pouvez aussi remarquer qu'il n'y a pas de controle Vous pouvez aussi remarquer qu'il n'y a pas de controle
de cohérence sur les dimensions des deux images, malgré l'existence de cohérence sur les dimensions des deux images, malgré l'existence
de fonctions prévues à cet effet.. de fonctions prévues à cet effet\dots
% =================================================================== % ===================================================================
@ -852,7 +871,7 @@ Usage: mkfimg [options] quux.fimg width height
La plupart des types d'image générée prennent un paramètre flottant qui La plupart des types d'image générée prennent un paramètre flottant qui
devra être donné avec l'option \texttt{-k F.F} avec une valeur par défaut devra être donné avec l'option \texttt{-k F.F} avec une valeur par défaut
à $1.0$. à $1.0$, ce qui n'est pas toujours une bonne valeur.
\begin{description} \index{XXX} \begin{description} \index{XXX}
\item [black/gray/grey:] efface avec 0.0 (black) ou avec la valeur \item [black/gray/grey:] efface avec 0.0 (black) ou avec la valeur
@ -991,10 +1010,10 @@ logiciel aux calendes grecques, voire même plus tard.
\subsection{cumulfimgs}\index{cumulfimgs}\label{cumulfimgs} \subsection{cumulfimgs}\index{cumulfimgs}\label{cumulfimgs}
Cet outil accumule\index{cumul} une quantité d'images flottantes Cet outil accumule\index{cumul} une quantité d'images flottantes
(même taille et même type) afin d'obtenir (de même taille et de même type) afin d'obtenir
un flou de meilleure qualité. Aucune mise à l'échelle n'etant un flou temporel de meilleure qualité. Aucune mise à l'échelle n'etant
effctuée, les pixels de sortie peuvent atteindre des valeurs effectuée, les pixels de sortie peuvent atteindre des valeurs
considérables\footnote{Prévoir une gestion des \textsf{overflows} ?} considérables\footnote{Faut-il prévoir une gestion des \textsf{overflows} ?}
\begin{verbatim} \begin{verbatim}
tth@delirium:~/Devel/FloatImg/tools$ ./cumulfimgs -h tth@delirium:~/Devel/FloatImg/tools$ ./cumulfimgs -h
@ -1009,6 +1028,74 @@ cumulator options :
Le nom par défaut du fichier résultant est \texttt{out.fimg}. Le nom par défaut du fichier résultant est \texttt{out.fimg}.
L'exportation « multiformat » est pour bientôt. L'exportation « multiformat » est pour bientôt.
% ===================================================================
\section{Debug}\index{Debug}
\textit{Et quand plus rien ne fonctionne normalement ?}
Ayant une attirance marquée pour la méthode de développement dite
de \textsl{larache}, que je pratique intensément, j'ai quand même
besoin de m'équiper de quelques garde-fous. Avec l'expérience, j'ai
découvert quelques méthodes bien utile quand on est à court de
poudre verte.
\subsection{À la compilation}
Première de cordée, la méthode \texttt{DEBUG\_LEVEL}\index{DEBUG\_LEVEL}.
Elle me sert
essentiellement à tracer les appels de fonctions, et les paramètres
qu'elles reçoivent. Ça fait vraiment partie de la création
des \textsl{boiler-plates}.
C'est une valeur numérique entière définie dans chaque
\texttt{Makefile}\index{Makefile}
qui sera ensuite utilisée
par le préprocesseur afin de rajouter ce genre de code dans l'exécutable~:
\begin{verbatim}
int fimg_export_picture(FloatImg *pic, char *fname, int flags)
{
int filetype, foo;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( %p '%s' 0x%X )\n", __func__, pic, fname, flags);
#endif
...
\end{verbatim}
Le principe est simple, n'est-il pas, alors pourquoi s'en priver ?
Bien entendu, la même constante peut être utilisée plus agressivement
avec une condition comme \texttt{\#if DEBUG\_LEVEL > 2} permettant
de générer encore plus de messages traçants.
Ensuite, pour les cas les plus graves, qui nécessiteront l'utilisation
du dévermineur \texttt{gdb}\index{gdb}, il y a la directive
\texttt{MUST\_ABORT} qui est bien plus violente, mais parfois bien
pratique. Voici le cas classique d'utilisation~:
\begin{verbatim}
foo = fimg_strange_function(&picture, 13.37);
if (foo) {
fprintf(stderr, "epic fail %d in %s\n", foo, __func__);
#if MUST_ABORT
abort();
#endif
...
\end{verbatim}
À condition d'avoir bien réglé votre ulimit pour la génération d'un coredump,
vous aurez sous la main un fichier \textsc{core} qui vous permettra
de, par exemple, remonter la pile d'appel avec la commande \texttt{back} de
gdb. Mais pour le moment, juste une infime partie du code est instrumentée
avec ce dispositif.
\subsection{À l'exécution}
De l'utilisation des nombres magiques dans la détection des structures
corrompues par un pointeur ayant perdu le nord\dots
De l'utilisation des variables d'environnement pour transformer des warnings
en erreurs fatales\dots
% =================================================================== % ===================================================================
\section{TODO}\index{TODO}\label{TODO}\ \section{TODO}\index{TODO}\label{TODO}\
\index{XXX} \index{XXX}
@ -1016,16 +1103,17 @@ L'exportation « multiformat » est pour bientôt.
Il reste plein de choses à faire pour que ce soit vraiment utilisable, Il reste plein de choses à faire pour que ce soit vraiment utilisable,
surtout dans un contexte artistique à grande porosité. surtout dans un contexte artistique à grande porosité.
C'est par ces frottements de techniques ayant du sens que les C'est par ces frottements de techniques ayant du sens que les
choses seront acquises. choses seront acquises, pour le pire, le meilleur et la
futilité du monde futur..
\begin{itemize} \begin{itemize}
\item Import/export au format \textsc{tiff}\index{TIFF}. \item Import/export au format \textsc{tiff}\index{TIFF} à continuer.
\item Remplacer le « fait-maison » par \textsc{libnetpnm}\index{pnm}. \item Remplacer le « fait-maison » par \textsc{libnetpnm}\index{pnm}.
\textsl{[en cours]}. \textsl{[en cours]}.
\item Compléter les traitements mathémathiques (eg le gamma\index{gamma}). \item Compléter les traitements mathémathiques (eg le gamma\index{gamma}).
\item Formaliser les codes d'erreur. \textbf{Urgent}. \item Formaliser les codes d'erreur. \textbf{Urgent}.
\item Faire une passe complète de Valgrind\index{valgrind}. \item Faire une passe complète de Valgrind\index{valgrind}.
\item Intégrer la fonderie et l'interpolator. \item Intégrer la fonderie, l'interpolator et le singlepass.
\item Vérifier le gestion des images mono-canal. \item Vérifier le gestion des images mono-canal.
\end{itemize} \end{itemize}
@ -1374,7 +1462,8 @@ foultitude d'effets spéciaux.
\subsection{\textsl{moving average}} \subsection{\textsl{moving average}}
\texttt{./fonderie} : Basé sur la moyenne mobile. \texttt{./fonderie} : Basé sur la moyenne mobile, avec une structure de
fifo\index{fifo} particulièrement mal conçue.
\subsection{Interpolator}\index{interpolator} \subsection{Interpolator}\index{interpolator}
@ -1388,8 +1477,11 @@ avec l'option \texttt{-L}\footnote{liste hélas peu machinable.}
\subsection{Déviance} \subsection{Déviance}
Là, nous tombons dans la troiD de haut niveau, avec plein de maths Là, nous tombons dans de la \textsl{troiD}\index{3d} de haut niveau,
avec plein de maths compliquées
à l'intérieur. à l'intérieur.
Et surtout quelque chose qui n'est encore qu'une idée abstraite,
mais il y aura du zbuffer dedans.
% =================================================================== % ===================================================================
@ -1409,6 +1501,10 @@ faire des images au bord d'un lac ou dans la campagne de l'Ariège.
% ------------------------------------------------------------------- % -------------------------------------------------------------------
% XXX
% maintenant, comment faire un index sur trois colonnes ?
%
\printindex \printindex
\end{document} \end{document}

View File

@ -1,5 +1,8 @@
#--------------------------------------------------------------- #---------------------------------------------------------------
# Please, use the 'Gloabl.makefile' system !
COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0 COPT = -Wall -fpic -g -no-pie -DDEBUG_LEVEL=0
DEPS = ../floatimg.h Makefile DEPS = ../floatimg.h Makefile

View File

@ -22,7 +22,7 @@ float global_fvalue;
enum nCmd { Equalize=1, Rotate, Sfx0, F3x3, MIRE, Wfits, Wpng, Wtiff, enum nCmd { Equalize=1, Rotate, Sfx0, F3x3, MIRE, Wfits, Wpng, Wtiff,
Histo, Hsv, Classif, Ctr2x2, Qsortrgb, Histo, Hsv, Classif, Ctr2x2, Qsortrgb,
Displace, ReadPNG, Plasmas, Hilight, OpenEXR, Displace, ReadPNG, Plasmas, Hilight, OpenEXR,
Geometrie }; Geometrie, FileType };
typedef struct { typedef struct {
char *name; char *name;
int Cmd; int Cmd;
@ -48,6 +48,7 @@ Command commands[] = {
{ "hilight", Hilight }, { "hilight", Hilight },
{ "openexr", OpenEXR }, { "openexr", OpenEXR },
{ "geometrie", Geometrie, }, { "geometrie", Geometrie, },
{ "filetype", FileType },
{ NULL, 0 } { NULL, 0 }
} ; } ;
@ -207,6 +208,9 @@ switch(opt) {
case Geometrie: case Geometrie:
foo = essai_geometrie(filename, 0); foo = essai_geometrie(filename, 0);
break; break;
case FileType:
foo = essai_detect_type();
break;
default: default:
fprintf(stderr, "'%s' is a bad command\n", command); fprintf(stderr, "'%s' is a bad command\n", command);
exit(1); exit(1);

View File

@ -616,22 +616,22 @@ int foo;
char *fname; char *fname;
foo = format_from_extension(fname="foo.fimg"); foo = format_from_extension(fname="foo.fimg");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
foo = format_from_extension(fname="foo.pnm"); foo = format_from_extension(fname="foo.pnm");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
foo = format_from_extension(fname="foo.png"); foo = format_from_extension(fname="foo.png");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
foo = format_from_extension(fname="foo.tiff"); foo = format_from_extension(fname="foo.tiff");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
foo = format_from_extension(fname="foo.fits"); foo = format_from_extension(fname="foo.fits");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
foo = format_from_extension(fname="foo.xyzzy"); foo = format_from_extension(fname="foo.xyzzy");
printf("%-10s %d\n\n", fname, foo); printf("%-10s %3d\n", fname, foo);
return 0; return 0;
} }
@ -639,7 +639,7 @@ return 0;
int essai_mire(char *outname, int notused) int essai_mire(char *outname, int notused)
{ {
FloatImg fimg; FloatImg fimg;
int re; int re, foo;
fimg_create(&fimg, 1280, 960, FIMG_TYPE_RGB); fimg_create(&fimg, 1280, 960, FIMG_TYPE_RGB);
@ -647,9 +647,10 @@ re = fimg_test_pattern(&fimg, 9, 1.0);
if (re) { if (re) {
fprintf(stderr, "fimg_test_pattern -> %d\n", re); fprintf(stderr, "fimg_test_pattern -> %d\n", re);
} }
fimg_export_picture(&fimg, "mire.pnm", 0); foo = fimg_export_picture(&fimg, "mire.pnm", 0);
fprintf(stderr, "in %s, export give a %d value\n", __func__, foo);
return -1; return 0;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int essai_rampes(void) int essai_rampes(void)

View File

@ -20,7 +20,7 @@ int fimg_essai_hsv(char *infile);
int essai_classif(char *infile, char *outfile, float fvalue); int essai_classif(char *infile, char *outfile, float fvalue);
int essai_contour_2x2(char *filename, char *outfile); int essai_contour_2x2(char *filename, char *outfile);
int essai_geometrie(char *infile, int notused); int essai_geometrie(char *infile, int notused);
int essai_detect_type(void);
int fimg_essai_histo(FloatImg *src, char *outpic, int k); /* histogram.c */ int fimg_essai_histo(FloatImg *src, char *outpic, int k); /* histogram.c */
int essai_histogramme(char *fname, int k); int essai_histogramme(char *fname, int k);

View File

@ -49,6 +49,25 @@ if (1 == foo) {
*dptr = value; *dptr = value;
return 1; return 1;
} }
return -1;
}
/* --------------------------------------------------------------------- */
int file_type_from_name(char *name)
{
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, name);
#endif
if (!strcasecmp(name, "pnm" )) return FILE_TYPE_PNM;
if (!strcasecmp(name, "fimg")) return FILE_TYPE_FIMG;
if (!strcasecmp(name, "tga" )) return FILE_TYPE_TGA;
if (!strcasecmp(name, "png" )) return FILE_TYPE_PNG;
if (!strcasecmp(name, "tiff")) return FILE_TYPE_TIFF;
if (!strcasecmp(name, "tif" )) return FILE_TYPE_TIFF;
if (!strcasecmp(name, "fits")) return FILE_TYPE_FITS;
if (!strcasecmp(name, "exr")) return FILE_TYPE_EXR;
return -1; return -1;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
@ -56,6 +75,10 @@ int format_from_extension(char *fname)
{ {
char *cptr; char *cptr;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, fname);
#endif
cptr = rindex(fname, '.'); cptr = rindex(fname, '.');
if (NULL==cptr) { if (NULL==cptr) {
fprintf(stderr, "No dot in %s\n", fname); fprintf(stderr, "No dot in %s\n", fname);
@ -63,18 +86,28 @@ if (NULL==cptr) {
} }
#if DEBUG_LEVEL #if DEBUG_LEVEL
fprintf(stderr, "[%s] --> [%s]\n", fname, cptr); fprintf(stderr, "\t[%s] --> [%s]\n", fname, cptr);
#endif #endif
if (!strcasecmp(cptr, ".pnm" )) return FILE_TYPE_PNM; return file_type_from_name(cptr+1);
if (!strcasecmp(cptr, ".fimg")) return FILE_TYPE_FIMG; }
if (!strcasecmp(cptr, ".tga" )) return FILE_TYPE_TGA; /* --------------------------------------------------------------------- */
if (!strcasecmp(cptr, ".png" )) return FILE_TYPE_PNG; char * extension_from_format(int fmt)
if (!strcasecmp(cptr, ".tiff")) return FILE_TYPE_TIFF; {
if (!strcasecmp(cptr, ".tif" )) return FILE_TYPE_TIFF;
if (!strcasecmp(cptr, ".fits")) return FILE_TYPE_FITS; switch (fmt) {
if (!strcasecmp(cptr, ".exr")) return FILE_TYPE_EXR; case FILE_TYPE_FIMG: return ".fimg"; break;
case FILE_TYPE_PNM: return ".pnm"; break;
return -1; case FILE_TYPE_PNG: return ".png"; break;
case FILE_TYPE_TIFF: return ".tiff"; break;
case FILE_TYPE_FITS: return ".fits"; break;
case FILE_TYPE_TGA: return ".tga"; break;
default:
fprintf(stderr, "%s: bad %d fmt type\n", __func__, fmt);
return NULL;
}
return "???";
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */

View File

@ -2,6 +2,8 @@
# makefile for floatimg tools # makefile for floatimg tools
# use with caution # use with caution
# #
# PLEASE ! update to the 'Global.makefile' concept !
#
COPT = -Wall -fpic -g -DDEBUG_LEVEL=0 -lm COPT = -Wall -fpic -g -DDEBUG_LEVEL=0 -lm
DEPS = ../floatimg.h ../libfloatimg.a Makefile DEPS = ../floatimg.h ../libfloatimg.a Makefile

View File

@ -31,13 +31,13 @@ Fx fx_list[] = {
{ "pow2", Fx_pow2, 0, 1 }, { "pow2", Fx_pow2, 0, 1 },
{ "sqrt", Fx_sqrt, 0, 1 }, { "sqrt", Fx_sqrt, 0, 1 },
{ "gray0", Fx_gray0, 0, 1 }, { "gray0", Fx_gray0, 0, 1 },
{ "halfsz0", Fx_halfsz0, 0, 1 }, // { "halfsz0", Fx_halfsz0, 0, 1 },
{ "rot90", Fx_rot90, 0, 0 }, // { "rot90", Fx_rot90, 0, 0 },
{ "cmixa", Fx_cmixa, 0, 1 }, { "cmixa", Fx_cmixa, 0, 1 },
{ "xper", Fx_xper, 0, 1 }, { "xper", Fx_xper, 0, 1 },
{ "desat", Fx_desat, 0, 1 }, { "desat", Fx_desat, 0, 1 },
{ "ctr2x2", Fx_ctr2x2, 0, 1 }, { "ctr2x2", Fx_ctr2x2, 0, 1 },
{ "norm", Fx_norm, 0, 1 }, // { "norm", Fx_norm, 0, 1 },
{ "classtrial", Fx_classtrial, 0, 1 }, { "classtrial", Fx_classtrial, 0, 1 },
{ "binarize", Fx_binarize, 0, 1 }, { "binarize", Fx_binarize, 0, 1 },
{ "trinarize", Fx_trinarize, 0, 1 }, { "trinarize", Fx_trinarize, 0, 1 },
@ -45,6 +45,14 @@ Fx fx_list[] = {
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
/* --------------------------------------------------------------------- */
static void list_of_effects(void)
{
Fx *fx;
for (fx=fx_list; fx->name; fx++) {
printf("%s\n", fx->name);
}
}
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
int lookup_fxidx(char *txt) int lookup_fxidx(char *txt)
{ {
@ -105,6 +113,7 @@ puts("\tfimgfx [options] <effect> source.fimg resultat.fimg");
puts("options:"); puts("options:");
puts("\t-k N.N\tset the floating value"); puts("\t-k N.N\tset the floating value");
puts("\t-l\tlist effects");
puts("\t-v\tincrease verbosity"); puts("\t-v\tincrease verbosity");
puts("effects:"); puts("effects:");
@ -217,9 +226,11 @@ switch (action) {
} }
// foo = fimg_export_picture(&dest, dstfname, 0);
foo = fimg_dump_to_file(&dest, dstfname, 0); foo = fimg_dump_to_file(&dest, dstfname, 0);
if (foo) { if (foo) {
fprintf(stderr, "dumping datas to file give us a %d\n", foo); fprintf(stderr, "dumping datas to file '%s' give us a %d\n",
dstfname, foo);
return foo; return foo;
} }
@ -240,10 +251,11 @@ char *operator;
char *srcname = ""; char *srcname = "";
char *dstname = "out.fimg"; char *dstname = "out.fimg";
while ((opt = getopt(argc, argv, "hk:v")) != -1) { while ((opt = getopt(argc, argv, "hk:lv")) != -1) {
switch(opt) { switch(opt) {
case 'h': help(0); break; case 'h': help(0); break;
case 'k': global_fvalue = atof(optarg); break; case 'k': global_fvalue = atof(optarg); break;
case 'l': list_of_effects(); exit(0);
case 'v': verbosity++; break; case 'v': verbosity++; break;
} }
} }

26
tools/fx_demo.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/bash
SRC="in.fimg"
K="0.414"
TMP="/tmp/foo.fimg"
for fx in $(./fimgfx -l)
do
printf "========== %-12s =========\n" $fx
outfile=$(printf "/tmp/fx_%s.png" $fx)
echo $outfile
rm $TMP
./fimgfx -v -k $K $fx $SRC $TMP
if [ $? \!= 0 ] ; then
echo error $?
exit 1
fi
./fimg2png -v $TMP $outfile
echo ; sleep 1
done

View File

@ -25,6 +25,11 @@ static unsigned short modz;
*/ */
if ( d->width != w*2 || d->height != h*2 ) { if ( d->width != w*2 || d->height != h*2 ) {
fprintf(stderr, "%s: dimension error\n", __func__); fprintf(stderr, "%s: dimension error\n", __func__);
fprintf(stderr, "\tw = %d h = %d\n", w, h);
fprintf(stderr, "\tdest image is %dx%d\n", d->width, d->height);
#if MUST_ABORT
abort();
#endif
return -2; return -2;
} }