Fonctions d'interface
La bibliothèque TeX laisse certaines tâches à son utilisateur. Cela lui permet de personnaliser l'affichage et le rendu de texte.
Interfaces à fournir
Il faut fournir quatre fonctions pour pouvoir parser et afficher des formules. Ni les noms des fonctions ni ceux des arguments ne sont limités aux exemples ci-dessous. N'importe quel nom fonctionnerait.
void draw_pixel(int x, int y, int color);
Cette première fonction doit afficher un pixel à la position (x,y) de l'écran
dans la couleur donnée. La valeur de color
est déterminée directement par
l'argument color
passé à la fonction TeX_draw()
; son format est donc
complètement libre.
void draw_line(int x1, int y1, int x2, int y2, int color);
Cette fonction doit tracer une ligne de la couleur donnée entre le point (x1,y1) et le point (x2,y2). Les deux extrémités sont comprises dans la ligne.
void text_size(char const *str, int *width, int *height);
Cette fonction reçoit en paramètre une chaîne de caractères et deux pointeurs
vers des entiers. Elle doit calculer la place nécessaire pour écrire la chaîne
de caractères à l'écran, puis stocker la largeur dans *width
et la hauteur
dans *height
.
void draw_text(char const *str, int x, int y, int color);
La quatrième fonction doit écrire la chaîne de caractères à la position (x,y)
de l'écran dans la couleur indiquée. Bien sûr, la place occupée par le tracé ne
doit pas être plus grande que le rectangle calculé par text_size()
(en
principe elle doit être égale).
Initialisation en pratique
Une fois que ces fonctions sont définies, indiquez à la bibliothèque TeX que
vous les utilisez. Cette opération n'a besoin d'être fait qu'une seule fois,
typiquement au début de votre fonction main()
.
TeX_intf_pixel(draw_pixel);
TeX_intf_line(draw_line);
TeX_intf_size(text_size);
TeX_intf_text(draw_text);
Exemples canoniques
fxlib
TODO
gint
gint fournit des fonctions pour faire ces opérations, mais les prototypes sont légèrements différents donc il est nécessaire de créer des enveloppes (wrappers).
#include <gint/display.h>
void pixel(int x, int y, int color)
{
dpixel(x, y, color);
}
void line(int x1, int y1, int x2, int y2, int color)
{
dline(x1, y1, x2, y2, color);
}
void size(char const *str, int *w, int *h)
{
/* On utilise la police courante. */
dsize(str, NULL, w, h);
}
void text(char const *str, int x, int y, int color)
{
/* Le texte sera sur fond transparent. */
dtext(x, y, str, color, color_none);
}
int main(void)
{
TeX_intf_pixel(pixel);
TeX_intf_line(line);
TeX_intf_size(size);
TeX_intf_text(text);
/* ... */
return 0;
}