2 Fonctions d'interface
Lephenixnoir edited this page 2019-06-20 19:01:25 -04:00

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;
}