281 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <html>
 | |
| <head>
 | |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 | |
| <title>libimage: les regles du programmeur</title>
 | |
| <link rel="stylesheet" type="text/css" href="libimage.css">
 | |
| <meta name="generator" content="Cuisse de Pintade à l'ail, Riz, Morgon">
 | |
| <meta name="keywords" content="libimage, coding style, Boudet, tontonth">
 | |
| </head>
 | |
| 
 | |
| <body>
 | |
| 
 | |
| <h1><a name="top">en vrac pour les codeurs...</a></h1>
 | |
| 
 | |
| <p align="center"><tt>dernière mise à jour: 3 janvier 2014</tt></p>
 | |
| 
 | |
| <p class="menuhaut">
 | |
| [<a href="README.txt">README</a>]
 | |
| [<a href="image77.html">fortran</a>]
 | |
| [<a href="img-essais.html">essais</a>]
 | |
| [<a href="#porting">porting</a>]
 | |
| <br>
 | |
| [<a href="#bugs">bugs</a> et <a href="BUGS.txt">BUGS</a>]
 | |
| [<a href="#projets">projets</a>]
 | |
| [<a href="#compilation">compilation</a>]
 | |
| [<a href="#types">types</a>]
 | |
| [<a href="#return">return codes</a>]
 | |
| <br>
 | |
| [<a href="#lacunes">les manques</a>]
 | |
| [<a href="#optimize">Optimisations</a>]
 | |
| [<a href="#outils">outils divers</a>]
 | |
| </p>
 | |
| 
 | |
| <h2><a name="utsl">Use the sources, Luke</a></h2>
 | |
| 
 | |
| <p>
 | |
| La documentation n'étant jamais à jour, il faut parfois aller lire les sources
 | |
| pour comprendre (parfois) le pourquoi du comment. Moi même, je n'y arrive
 | |
| pas toujours. Cette page me sert d'aide mémoire, donc c'est tout en
 | |
| <i>vrac</i>...
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| On peut <a href="img-marquage.html">marquer</a> une image.
 | |
| Il existe quelques <a href="#macros">macros</a> pour abstraire 
 | |
| certaines choses, mais ce n'est pas très fini.
 | |
| </p>
 | |
| 
 | |
| <h2><a name="bugs">les bugs</a></h2>
 | |
| 
 | |
| <p>
 | |
| Il y en a probablement pas mal, mais dans l'ensemble, c'est assez stable.
 | |
| Peut-être quand même quelques petits 'memory leak' qui trainent dans des
 | |
| recoins obscurs... Exemple:
 | |
| </p>
 | |
| <pre class="code">
 | |
|            foo = Image_alloc(bla...);
 | |
|            Image_tripote(foo, bar);
 | |
|            Image_DeAllocate(foo);
 | |
|            free(foo);        <b>/* ne pas oublier ça... */</b>
 | |
| </pre>
 | |
| <p>
 | |
| A ce moment, les zones mémoires contenant les pixels de l'image sont rendues
 | |
| au gestionnaire de mémoire, <b>mais</b> l'en-tête du descripteur d'image est
 | |
| encore <i>malloc-é</i>. Il convient donc de rajouter un <tt>free(foo)</tt>.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| <b>Xv n'affiche pas les TGA fabriqués par Libimage ?</b>
 | |
| Le bug n'est pas dans libimage, mais dans Xv. D'après les spécifications
 | |
| du format TGA, on peut ajouter un commentaire dans le fichier. Or, Xv
 | |
| ne reconnait plus les TGA comme des TGA si ce commentaire est présent, ce
 | |
| qui est le cas par défaut dans la bib. Le <i>workaround</i> est simple:
 | |
| il faut ajouter <tt>Image_set_comment(img, "");</tt> avant
 | |
| d'enregistrer le fichier afin d'enlever le commentaire.
 | |
| Je pense même qu'il y a un truc dans le Makefile.
 | |
| </p>
 | |
| 
 | |
| <p><b>le flag 'modified' du descripteur d'image est mal géré.</b>
 | |
| Oui, en effet, il n'est parfois pas positionné par les fonctions
 | |
| qui le devrait. Une revue complète de tout le code pour corriger
 | |
| ce souci est programmée pour 2012.</p>
 | |
| 
 | |
| <p>
 | |
| Par contre, le fait que certaines fonctions ne semblent pas finies n'est
 | |
| <i>pas</i> un bug. C'est un 'undocumented feature'. Et qu'il manque la
 | |
| documentation, c'est le <i>lazzy effect</i>.
 | |
| </p>
 | |
| 
 | |
| 
 | |
| <h2><a name="projets">les projets</a></h2>
 | |
| 
 | |
| <p>
 | |
| Début 2007, j'ai découvert que le compilateur <tt>g77</tt> était un
 | |
| produit en fin de vie, et que les Linux récents avaient de plus en plus
 | |
| tendance à préférer <tt>gfortran</tt>. Il est donc probable que 
 | |
| <a href="image77.html">l'interface</a> actuelle soit mise à l'écart
 | |
| et remplacée par un équivalent plus moderne.
 | |
| </p>
 | |
| 
 | |
| <h2><a name="porting">le portage</a></h2>
 | |
| 
 | |
| <p>
 | |
| Merci au généreur donateur d'une <i>Sun U5</i> grace auquel  j'ai enfin pu
 | |
| finaliser l'adaptation
 | |
| du machin à une autre architecture que le trop commun <i>i386</i> sous Linux,
 | |
| en l'occurence un processeur <i>UltraSparc</i>, tournant sous <i>OpenBSD 4.4</i>.
 | |
| Et ça a été plus facile que je ne le pensait, les soucis de boutisme ayant
 | |
| déja été réglés dans une vie antérieure. D'autre part, ça a été une bonne
 | |
| occasion de nettoyer le code d'un certain nombre de warnings assez génants.
 | |
| </p>
 | |
| <p>Je dois d'abord préciser que la fidèle machine sur laquelle je fabrique le
 | |
| kluge est une très vieille Debian (une SID d'il y a cinq ans, c'est dire
 | |
| si je suis un <a href="http://dinorama.fr/">dino</a>),
 | |
| et que le Gcc est également *vieux* :
 | |
| <tt>gcc version 4.0.3 (Debian 4.0.3-1)</tt>. C'est un peu génant, mais
 | |
| pas plus que si j'avais un Unixware 1.x :) Donc, en avant...
 | |
| Voyons, dans un ordre approximatif, les problèmes que j'ai rencontré:
 | |
| </p>
 | |
| 
 | |
| <dl>
 | |
| 
 | |
| <dt><tt>alloca.h</tt>
 | |
| <dd>Sur la machine ancestrale citée plus haut, je suis obligé d'inclure
 | |
|  ce fichier si je veux utiliser la fonction alloca. Mais ce n'est pas
 | |
|  nécessaire dans O44/sparc64. Je n'ai pas (pour le moment) trouvé de
 | |
|  solution automatique. Il vous  faut donc  éditer à la mano le 
 | |
|  Makefile vers la ligne 31 et commenter la ligne 
 | |
|  <tt>CC_HACKS=-DNEED_ALLOCA_H</tt>.
 | |
| </dd>
 | |
| 
 | |
| <dt>L'emplacement des <tt>.h</tt></dt>
 | |
| <dd>Par flemme de chercher une autre solution, je les place systématiquement
 | |
|  dans <tt>/usr/local/include</tt>, et le Gcc de l'Open44 ne va pas les
 | |
|  chercher à cet endroit là.
 | |
|  Tip: <b><tt>export C_INCLUDE_PATH=/usr/local/include</tt></b>
 | |
|  dans le <tt>~/.profile</tt>.
 | |
| </dd>
 | |
| <dt>L'emplacement des <tt>.a</tt> et <tt>.so</tt>
 | |
| <dd>Même Gcc, même punition. Après quelques essais rapidement désastreux avec
 | |
| le <tt>ld.so.conf</tt>, une lecture plus attentive des manpages m'a conduit
 | |
| à une (presque) même solution:
 | |
| <b><tt>export LIBRARY_PATH=/usr/local/lib</tt></b> dans le même
 | |
| <tt>~/.profile</tt>.
 | |
| </dd>
 | |
| 
 | |
| </dl>
 | |
| <p>
 | |
| Bon, j'ai gruiké ça rapidement un dimanche pluvieux, ça marche mais ça n'est
 | |
| peut-être pas orthodoxe. Je vais consulter les experts en fromages pour savoir
 | |
| si j'ai pris le <a href="img-outils.html#porting">bon</a> chemin. 
 | |
| </p>
 | |
| 
 | |
| <h2><a name="optimize">Optimisations</a></h2>
 | |
| 
 | |
| <p>À priori, il reste pas mal de choses à faire, surtout pour rendre les
 | |
| boucles X-Y plus <i>cache-friendly</i>. Les buffers contenants les images
 | |
| étant organisés en tableaux de lignes, il y a probablement quelques
 | |
| <i>hit/mess</i> à grapiller. D'un autre coté, pour le moment, juste
 | |
| ça marche...
 | |
| </p>
 | |
| 
 | |
| <h2><a name="path">chemins de recherche</a></h2>
 | |
| 
 | |
| <p>
 | |
| Bah, fatigué de devoir recopier mes fichiers .MAP de
 | |
| <a href="img-couleurs.html#palettes">palette</a> à droite et à gauche,
 | |
| j'ai ajouté une func qui cherche dans quelques endroits. Donc, j'essaye
 | |
| en série:
 | |
| </p>
 | |
| 
 | |
| <ol>
 | |
| <li> le répertoire courant.
 | |
| <li> le rep dans la variable <tt>$LIBIMAGE_PATH</tt>
 | |
| <li> le chemin <i>hardcoded</i>: $(DESTDIR)/share/libimage
 | |
| </ol>
 | |
| 
 | |
| <h2><a name="compilation">compilation</a></h2>
 | |
| 
 | |
| <p>
 | |
| La première chose à faire (comme d'hab) c'est d'aller lire le Makefile.
 | |
| Vous y découvrirez quelques options à positionner selon vos gouts.
 | |
| Et un de ces jours, je vais passer au tandem infernal automake/autoconf,
 | |
| si jamais j'arrive à comprendre comment ça marche.
 | |
| </p>
 | |
| 
 | |
| <p>
 | |
| En attendant, les variables à positionner pour l'install sont:
 | |
| </p>
 | |
| 
 | |
| <ul>
 | |
| <li><tt>DESTDIR</tt>: /usr/local
 | |
| <li><tt>HTML_DIR</tt>: /usr/local + le répertoire html recevra les pages
 | |
|  que vous êtes en train de lire.
 | |
| <li><tt>SHARED_FILES</tt>: $(DESTDIR)/share/libimage contiendra les fichiers
 | |
|  de fontes et les colors maps.
 | |
| </ul>
 | |
| 
 | |
| <p>
 | |
| A la compilation, on peut aussi utiliser quelques <tt>-DMACHIN=42</tt>
 | |
| pour modifier le comportement de la bib. En phase de mise au point de la 
 | |
| bibliothèque, il est capital de détecter les conditions anormales: eg:
 | |
| <i>plotter</i> en dehors de l'image. Donc, avec un <tt>-DABORT=1</tt>,
 | |
| les conditions anormales génererons un <small>COREDUMP</small> analysable
 | |
| avec gdb, si vous n'avez pas oublié de régler votre  <tt>ulimit -c</tt>
 | |
| à une valeur raisonnable.
 | |
| </p>
 | |
| 
 | |
| <p><b>alloca.h</b> oui, là, il y a un léger souci. je suis en ce moment
 | |
| en train de tenter d'installer ma libimage dans un OpenBSD, et je ne
 | |
| sais pas quoi faire pour les <tt>alloca</tt>. (2007-12-30) investigations
 | |
| en cours. Sans compter que le problème va se poser aussi avec NetBSD.
 | |
| </p>
 | |
| 
 | |
| <h2><a name="types">type de données</a></h2>
 | |
| 
 | |
| <p>
 | |
| Bien que tout ce fatras soit codé à la gruik, j'essaye d'introduire un peu
 | |
| de rigueur dans la chose. En particulier, certains noms de paramètres de
 | |
| fonctions vont être normalisés. Ce qui, en fait, ne sert à rien, parce
 | |
| que c'est le codeur qu'il faudrait normaliser.
 | |
| </p>
 | |
| 
 | |
| <ul>
 | |
| <li><b>pr100</b> Seuil de probabilité pour un choix randomatique. Une valeur
 | |
| comprise entre 0 et 99. Exemple: le
 | |
|  <a href="img-povhf15.html#bruit">bruitage</a> des HFs.
 | |
| </ul>
 | |
| 
 | |
| <p>Les hackeurs trouveront dans le fichier <tt>imprime.c</tt> une fonction :
 | |
| <i>Image_print_sizeof_structs</i>, qui affiche les tailles des diverses
 | |
| structures utilisées par les rouages internes.
 | |
| </p>
 | |
| 
 | |
| <h2><a name="return">return codes</a></h2>
 | |
| 
 | |
| <p>
 | |
| Il faut regarder les <i>#define</i> dans <tt>tthimage.h</tt> et la fonction
 | |
| <a href="libimage.html#messages">Image_err2str</a> dans <tt>msglib.c</tt>.
 | |
| Je préfère ne rien mettre ici, parce que j'aurais la flemme de le mettre
 | |
| à jour quand il faudrait le faire... En particulier pour classer les codes
 | |
| d'erreur en fonction de leur gravité.
 | |
| </p> 
 | |
| 
 | |
| <h2><a name="macros">macros</a></h2>
 | |
| 
 | |
| <p>
 | |
| Elles sont habilement dissimulées dans le fichier <tt>tthimage.h</tt>, mais
 | |
| je ne leur porte qu'une confiance limitée.
 | |
| </p>
 | |
| 
 | |
| <h2><a name="outils">Les outils</a></h2>
 | |
| 
 | |
| <p>
 | |
| Deux dumpeurs de pixels dans <tt>dumppix.c</tt>. Le premier affiche des
 | |
| trucs en hexadécimal, et le second en ascii. Ne m'en demandez pas plus,
 | |
| je ne suis au courant de rien. Heureusement, il y a un autre
 | |
| <a href="img-outils.html">package</a> qui contient quelques <i>tools</i>
 | |
| assez performants.
 | |
| </p>
 | |
| 
 | |
| <p class="HDP"><a href="#top">haut de page</a></p>
 | |
| 
 | |
| <h2><a name="lacunes">Ce qui manque...</a></h2>
 | |
| 
 | |
| <p>
 | |
| Il manque plein de choses dans cette bibliothèque de fonctions, ou dans les
 | |
| outils qui tournent autour. En Octobre 2003, je suis en train de travailler
 | |
| sur un éditeur de fontes 16x24, mais il ne sortira que quand il sera prèt.
 | |
| Nous sommes le 1er janvier 2014, et ça n'a pas avancé d'un pas.
 | |
| </p>
 | |
| 
 | |
| <!-- ------------------------------------------------ -->
 | |
| <p class="footer">
 | |
| Bon courage à tous, et n'oubliez pas de regarder 
 | |
| <a href="http://la.buvette.org/cv.html">qui</a> a pondu ce kluge,
 | |
| et en est presque fier...
 | |
| </p>
 | |
| 
 | |
| </body>
 | |
| </html>
 | 
