diff --git a/Global.makefile b/Global.makefile new file mode 100644 index 0000000..534868a --- /dev/null +++ b/Global.makefile @@ -0,0 +1,5 @@ + +# +# This file is the 'grandmasata' of the compilation process. +# + diff --git a/doc/the_floatimg_hack.tex b/doc/the_floatimg_hack.tex index afb7b8e..ebd20f4 100644 --- a/doc/the_floatimg_hack.tex +++ b/doc/the_floatimg_hack.tex @@ -50,7 +50,7 @@ \begin{document} \maketitle -\section*{Image flottante ?} +\section*{Une image flottante ?} Mais de quoi parle-t-on exactement ? @@ -145,7 +145,7 @@ nous allons créer une image RGB\index{RGB} complètement noire, puis l'enregistrer dans un fichier \texttt{.fimg}\index{.fimg}, un format complètement inconnu, puisque je viens de l'inventer à 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 pour gérer la machinerie interne. @@ -191,25 +191,29 @@ mean values: G 0.000000 B 0.000000 A 0.000000 -max value 0.000000 +max value 0.000000 \end{verbatim} -Nous avons donc sous la main une mécanique qui ne demande qu'à -faire des trucs futiles et des images qui clignotent. +Nous avons donc sous la main un ensemble d'outils mécaniques qui ne demande +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}. Vous trouverez dans le répertoire \texttt{tools/}\index{tools/} d'autres exemples de mise en œuvre des fonctions disponibles 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} Sauf indications contraires, ces instructions se réfèrent à -une distribution Debian\index{Debian} récente, mais ça marche -quasiment pareil avec Fedora\index{Fedora}. -\textit{Attention, ça devient un peu gore\dots} +une distribution Debian\index{Debian} récente (amd64 et x86), +mais ça marche quasiment pareil avec Fedora\index{Fedora} 64, +et +probablement Raspbian\index{Raspbian}, modulo les éventuels +soucis de boutisme. +\textit{Attention, ça va devenir un peu gore\dots} \subsection{Prérequis} @@ -234,7 +238,10 @@ Il faut aussi savoir où trouver le code. \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 de faire un Makefile récursif, mais\dots}. Dans chacun des répertoires à traiter, ce script devrait trouver @@ -271,11 +278,12 @@ contenant un certain nombre de définition de structures, de macros, de constantes\footnote{À l'ancienne, via le pré-processeur} 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/}. La première contient les choses qui sont relativement figées, et la seconde celles qui risquent de bouger. Cette classification est en fait indécement arbitraire. +D'autant plus qu'il y a aussi un répertoire nommé « experiemental ». \subsection{Structures, macros\dots} @@ -305,7 +313,7 @@ Le troisième est le type d'image : pour le moment, il y en a % trois un certain nombre qui sont définis\footnote{et plus ou moins bien gérés\dots} : 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} #define FIMG_TYPE_GRAY 1 @@ -347,7 +355,7 @@ un affichage plus détaillé. Ça peut parfois aider. 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 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 +363,9 @@ encore qu'un concept en devenir, n'est-ce pas ? 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, -ce qui est un sujet parfois délicat\footnote{GC or not GC ?}. -Elle est donc faite, à la base, par ces deux fonctions~: +ce qui est un sujet parfois délicat\footnote{GC or not GC ?} parce que +les pixels sont précieux et doivent être bien rangés. +Cette gestion est donc faite, à la base, par ces deux fonctions~: \begin{lstlisting} int fimg_create(FloatImg *fimg, int w, int h, int type); @@ -365,7 +374,8 @@ int fimg_destroy(FloatImg *fimg); 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 -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 documentés dans ce document, et les autres sont dangereux à toucher. Les types d'images actuellement gérés sont les trois grands @@ -382,10 +392,10 @@ int fimg_images_not_compatible(FloatImg *a, FloatImg *b); \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 -est tout aussi pertinent. Il y a deux opérations qui supportent le -reste des transits ram/ps. +est tout aussi pertinent. +Il y a deux opérations qui supportent le reste des transits ram/ps. Le format des fichiers est décrit page \pageref{formatfimg}. \begin{lstlisting} @@ -581,9 +591,13 @@ typedef struct { la valeur maximale, la date de création, une longueur d'onde, 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 -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 +728,14 @@ int fimg_colors_mixer_a(FloatImg *fimg, float fval); 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 -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. 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 +826,12 @@ return 0; Je vous laisse imaginer les dégats que peut faire cette 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 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 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 +869,7 @@ Usage: mkfimg [options] quux.fimg width height 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 -à $1.0$. +à $1.0$, ce qui n'est pas toujours une bonne valeur. \begin{description} \index{XXX} \item [black/gray/grey:] efface avec 0.0 (black) ou avec la valeur @@ -991,10 +1008,10 @@ logiciel aux calendes grecques, voire même plus tard. \subsection{cumulfimgs}\index{cumulfimgs}\label{cumulfimgs} Cet outil accumule\index{cumul} une quantité d'images flottantes -(même taille et même type) afin d'obtenir -un flou de meilleure qualité. Aucune mise à l'échelle n'etant -effctuée, les pixels de sortie peuvent atteindre des valeurs -considérables\footnote{Prévoir une gestion des \textsf{overflows} ?} +(de même taille et de même type) afin d'obtenir +un flou temporel de meilleure qualité. Aucune mise à l'échelle n'etant +effectuée, les pixels de sortie peuvent atteindre des valeurs +considérables\footnote{Faut-il prévoir une gestion des \textsf{overflows} ?} \begin{verbatim} tth@delirium:~/Devel/FloatImg/tools$ ./cumulfimgs -h @@ -1009,6 +1026,74 @@ cumulator options : Le nom par défaut du fichier résultant est \texttt{out.fimg}. 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}\ \index{XXX} @@ -1016,16 +1101,17 @@ L'exportation « multiformat » est pour bientôt. Il reste plein de choses à faire pour que ce soit vraiment utilisable, surtout dans un contexte artistique à grande porosité. 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} -\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}. \textsl{[en cours]}. \item Compléter les traitements mathémathiques (eg le gamma\index{gamma}). \item Formaliser les codes d'erreur. \textbf{Urgent}. \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. \end{itemize} @@ -1374,7 +1460,8 @@ foultitude d'effets spéciaux. \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} @@ -1388,8 +1475,11 @@ avec l'option \texttt{-L}\footnote{liste hélas peu machinable.} \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. +Et surtout quelque chose qui n'est encore qu'une idée abstraite, +mais il y aura du zbuffer dedans. % =================================================================== @@ -1409,6 +1499,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 \end{document}