libimage / les textes

dernière mise à jour: 14 décembre 2015

Fontes internes

Pas grand chose pour le moment... Juste quelques fonctions instables et un kludge permettant de tester ces fonctions. J'en arrive à me demander si la doc f77 n'est pas plus complète.

Attention !!! Le 26 mars 2008, il y a eu un gros chargement dans la logique interne du bouzin: il faut maintenant soit spécifier un nom de fonte quand on trace une chaine, soit charger préalablement une fonte si on ne spécifie pas de nom. J'espère que ce changement ne va pas casser trop de trucs. Hélas, espoir déçu, j'ai un bronx infernal dans plein de trucs...

Dans le tarball, il y a deux fontes 8x8 nommée libimage.fonte et 8x8thin. A priori, les fontes 8x8 prévues pour la console Linux doivent fonctionner, et vous pourrez les reconnaitre à leur taille de 2048 octets. Il n'y a pas encore de quoi les visualiser dans tout ce fatras, mais je suis en train de coder ça...

int Image_load_fnt8x8(char *nomfnt, U_BYTE *ou, int flags);
Chargement d'une fonte 8x8 dans une zone statique, on ne peut donc avoir qu'une seule police en même temps, mais ça va bientôt changer. Les paramètres ou et flags sont inutilisés pour le moment. Si le nom du fichier fonte est NULL, une fonte par défaut sera utilisée.
int Image_trace_caractere(Image_Desc *im, int x, int y, int code);
Cette fonction est très primitive. Elle trace en noir sur un fond blanc en utilisant la fonte courante.
int Image_trace_chaine_0(Image_Desc *im, char *txt, int x, int y, RGBA *paper, RGBA *ink, int flags);
Bah, pas grand chose à dire, à part que le paramètre 'flags' doit être mis à zéro, et que cette fonction est obsolète, et l'exprime clairement.
int Image_trace_chaine_1(Image_Desc *im, char *txt, int x, int y, char *nomfonte, RGBA *paper, RGBA *ink);
Voici donc la nouvelle fonction pour écrire du texte 8x8 dans une image. Elle fonctionne en gros comme son ancêtre, mais permet en plus de spécifier un nom de fonte. Si celui-ci est NULL, c'est la dernière fonte chargée qui sera utilisée.
int Image_texte_fonte(char *nomfonte, char *nomtga);
Donc voilà le kludge. La seule valeur humainement supportable pour le paramètre nomfonte, c'est NULL et les insultes parce que çamarchpa, c'est pour moi.

haut de page

fonte 16 x 24

Enfin, ça y est, un support primitif des grosses fontes bitmap en 16x24 est en train de voir le jour. La description des dessins de caractères se fait dans un fichier texte spécialement prévu pour être manipulable par des outils Unix tels que awk. Ce fichier est une suite d'enregistrements contenant le code ascii du caractère considéré, suivi de 24 lignes contenant les pixels. Exemple:

60
................
................
................
..........**....
.........***....
........**......
.......**.......
......**........
.....**.........
....**..........
...**...........
..***...........
...**...........
....**..........
.....**.........
......**........
.......**.......
........**......
.........***....
..........**....
................
................
................
................

Le nombre en première ligne est le code ascii du caractère, exprimé en décimal. En fait, ce n'est pas exactement le code ascii, puisque ça peut très bien être de l'iso-8859-1 par exemple, donc un code compris entre 0 et 255. Et les 24 lignes suivantes contienne le dessin du caractère fait avec des points et des étoiles.

int Image_t16x24_txtload(char *fontname, U_BYTE *zone, int flag);
Chargement d'une fonte à partir du fichier texte décrit plus haut. Le second paramètre est inutilisé. Le contenu de la fonte est stockée dans une zone statique privé, il est donc actuellement impossible de gérer plusieurs fontes simultanément. Le flag à 1 demande l'effacement préalable de cette zone statique.
int Image_t16x24_pltch_exp(Image_Desc *img, int lettre, int xpos, int ypos);
Dessin d'un caractère 16 x 24 dans une image, les noms des paramètres sont explicites. Les couleurs sont fixées. Aucun contrôle de débordement n'est fait.
int Image_t16x24_pltch_1(Image_Desc *img, int lettre, int xpos, int ypos, RGBA *pap, RGBA *ink, int flags);
Dessin d'un caractère 16 x 24 dans une image, les noms des paramètres sont presque explicites. La police doit être chargée à l'avance. flags doit être mis à 0. Aucun contrôle de débordement n'est fait.
int Image_t16x24_allchars(char *fontname, char *tganame, int flag);
Construction d'une image contenant le dessin des 256 caractères.

Voilà, c'est tout pour le moment, mais ça permet déja de faire des choses. Je continue à réfléchir aux nouveaux features que je vais pouvoir inventer. Restez à l'écoute...

haut de page

outils 16 x 24

Hop, hop, quelques trucs supplémentaires. Dans le tarball, vous trouvererez fnt8to16 qui convertit une fonte 8x8 en fonte 16x24. C'est un peu cru, il n'y a pas d'interpolation, mais ça donne de quoi faire.

Dans le tarball vous trouverez la fonte ci-dessus (fichier 16x24thin) qui sera installé comme les autres fontes. Dans les outils associés, le programme tga_mires peut maintenant tracer le contenu d'une fonte 16x24, modulo le parsage des paramètres de la ligne de commande.

haut de page

texte en 'gropixels'

Une nouveauté de 2014 (codenamed: rouille de seiche) encore très immature. Ces fonctions utilisent les fontes 8x8 mise aux échelles en X et en Y, sans interpolation, d'où le nom de gropixels.

int Image_trace_big_char_0(Image_Desc *im, int x, int y, int code, int kx, int ky);
Première version du tracé de caractère 'gropixels'. Les paramètres kx et ky sont les coefficients de mise à l'échelle. Il est nécessaire d'avoir préalablement chargé une fonte avec Image_load_fnt8x8.
int Image_txt1_big_0(Image_Desc *im, char *txt, int x, int y, int xf, int yf);
Première version du tracé de chaine en 'gropixels'. Hélas, pas de contrôle des limites, donc coredump presque assuré.

haut de page

liens

Bah, euh... Freetype, par exemple. Mais je suis aussi à la recherche d'un format de fontes 'bitmap' évolué, bien documenté et disposant d'un éditeur sous X11 facile d'utilisation.