Xlib: affichage de texte


Consulter les différentes polices (fontes) de caractères disponibles :

Les noms des différentes polices peuvent être consultés à l'aide du programme xlsfonts.

Une police sera visualisée a l'aide du programme xfd -fn font_name.

Un autre logiciel plus interactif permet de visualiser et choisir les differentes polices en même temps : xfontsel.

Chargement d'une police de caractères :

Avant d'utiliser une police de caractères il faut l'avoir demandée au serveur. En général elle est lue sur disque; cependant, si une autre application est déjà en train de l'utiliser elle sera partagée dans la mémoire du serveur X.

Plusieurs manières de charger une police de caractères :

  1. Manière simple : le chargement d'une police se fait à l'aide de la fonction Font *XLoadFont(display, font_name).

    Cette fonction charge la police et retourne un ID de la fonte (de type Font). Cet ID peut être ensuite utilisé par la fonction XSetFont(display, gc, font_ID) pour associer la police à un Contexte Graphique (GC).

  2. Manière un peu plus compliquée : il est très difficile de calculer la hauteur et la longueur d'une chaîne de caractères quelconque sans connaître les caractèristiques détaillées de la police utilisée (surtout si celle-ci n'est pas proportionnelle).

    Si une police a déjà été chargée par un appel à XLoadFont(), on peut utiliser la fonction XFontStruct *XQueryFont(display, font_ID) qui fournit des informations très détaillées sur la police passée en paramètre. Ces informations se trouvent dans la structure XFontStruct.

Remarque : il est possible de faire XLoadFont() et XQueryFont() en une seule fois à l'aide de la fonction XFontStruct *XLoadQueryFont(display, font_name).

Exemple de code pour la lecture d'une fonte de caractères :



/*-----------------*/
load_font(font_info)
/*-----------------*/
XFontStruct **font_info;
{
char *fontname = "9x15";

    /* on accede a la fonte */
    if((*font_info = XLoadQueryFont(display,fontname)) == NULL) {
       (void) fprintf(stderr,"Police de caractéres 9x15 non trouvée \n");
       exit (-1);
    }
}


Ne pas oublier de libérer la mémoire allouée :

Lorsque vous n'avez plus besoin d'ine police de caractères, libérez-la en appelant la fonction XFreeFont(display, font_struct).

Largeur et hauteur d'une chaîne de caractères :

Chaque caractère d'une police donnée possède trois attributs qui sont utiles pour le calcul de la hauteur et de la largeur d'un texte :

  1. Une baseline : ligne horizontale qui coupe le caractère en deux, au dessous de laquelle se trouve le jambage. Pensez à l'école primaire: la baseline est l'équivalent de la ligne horizontale la plus basse lorsque vous vous appreniez à écrire.

  2. Un ascent : indique le nombre de pixels au-dessus de la baseline.

  3. Un descent : indique le nombre de pixels au-dessous de la baseline.

La hauteur d'un texte s'obtient à l'aide des champs ascent et descent du champs max_bounds (de type XCharStruct) de la structure XFontStruct.

La largeur d'un texte s'obtient à l'aide de la fonction XTextWidth().

Cet exemple montre comment procèder :



#define STRING "toto"
{
    XFontStruct *fontstruct;

    fontstruct = XLoadQueryFont(display,fontname);

    height_font = fontstruct.max_bounds.ascent + 
                  fontstruct.max_bounds.descent;

    width_font = XTextWidth(fontstruct, STRING, strlen(STRING));
}


Afficher le texte (enfin !) :

Il existe trois fonctions principales pour afficher du texte :

XDrawString(display, drawable, gc, x, y, string, length)

Affiche une chaîne de caractères dans un drawable. Attention, x et y représentent les coordonnées de la baseline de la chaîne.

Rappel : la baseline d'une chaîne est une ligne horizontale en dessous de laquelle les caractères possèdent un "jambage".

XDrawImageString(display, drawable, gc, x, y, string, length)

Similaire à la fonction précédente sauf que la boîte qui contient la chaîne (la bounding box) est remplie avec la couleur de background spécifiée dans le contexte graphique passé en paramètre.

En inversant les champs background et foreground du GC, on peut facilement afficher du texte en inverse vidéo à l'aide de cette fonction.

XDrawText(display, drawable, gc, x, y, items, nitems)

Cette fonction permet d'afficher une ou plusieurs chaîne(s) de caractères à la fois. Chaque item est un objet de type XTextItem qui contient la chaîne de caractères, la police de caractères, un espacement horizontal à partir de la fin de l'item précédent, etc...

michel.buffa@essi.fr