Afficher du texte

Pour afficher du texte dans une fenêtre Glut, il faut utiliser les fonctions glutBitmapCharacter et glutStrokeCharacter. Ces deux fonctions affichent un caractère selon la police de caractères indiqué. D'où la nécessité de créer une fonction qui permette d'afficher une chaîne de caractères directement. Précisons tout d'abord le fonctionnement de ces deux fonctions :

void glutBitmapCharacter ( void *font, int character );
Le premier argument est la police de caractères choisie.
Le deuxième argument est le caractère à afficher.

Polices de caractères possibles :

Police Description Aperçu
GLUT_BITMAP_8_BY_13 Largeur fixe
Chaque caractère est contenu dans un rectangle de 8 par 13 pixels
GLUT_BITMAP_9_BY_15 Largeur fixe
Chaque caractère est contenu dans un rectangle de 9 par 15 pixels
GLUT_BITMAP_TIMES_ROMAN_10 Police Times Roman de 10 points
Espacement proportionnel
GLUT_BITMAP_TIMES_ROMAN_24 Police Times Roman de 24 points
Espacement proportionnel
GLUT_BITMAP_HELVETICA_10 Police Helvetica de 10 points
Espacement proportionnel
GLUT_BITMAP_HELVETICA_12 Police Helvetica de 12 points
Espacement proportionnel
GLUT_BITMAP_HELVETICA_18 Police Helvetica de 18 points
Espacement proportionnel

void glutStrokeCharacter ( void * font, int character );
Le premier argument est la police de caractères choisie.
Le deuxième argument est le caractère à afficher.

Polices de caractères possibles :

Police Description Aperçu
GLUT_STROKE_ROMAN Largeur fixe
Espacement proportionnel
GLUT_STROKE_MONO_ROMAN Largeur fixe
Espacement fixe

Nous allons maintenant expliquer comment afficher directement un chaîne de caractères. Pour cela, il faut créer une fonction qui affiche les caractères de la chaîne passée en paramètre en utilisant les deux fonctions que l'on vient de détailler.


void vBitmapOutput(int x, int y, char *string, void *font)
{
	int len,i; // len donne la longueur de la chaîne de caractères

	glRasterPos2f(x,y); // Positionne le premier caractère de la chaîne
	len = (int) strlen(string); // Calcule la longueur de la chaîne
	for (i = 0; i < len; i++) glutBitmapCharacter(font,string[i]); // Affiche chaque caractère de la chaîne
}

void vStrokeOutput(GLfloat x, GLfloat y, char *string, void *font)
{
	char *p;

	glPushMatrix();	// glPushMatrix et glPopMatrix sont utilisées pour sauvegarder 
			// et restaurer les systèmes de coordonnées non translatés
	glTranslatef(x, y, 0); // Positionne le premier caractère de la chaîne
	for (p = string; *p; p++) glutStrokeCharacter(font, *p); // Affiche chaque caractère de la chaîne
	glPopMatrix();
}

Pour modifier la couleur du texte, il suffit d'appeler la fonction glColor3d(GLdouble red, GLdouble green, GLdouble blue); avec la valeur de la couleur souhaitée juste avant l'appel de la fontion vBitmapOutput ou vStrokeOutput. Voici un exemple d'utilisation :


#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>

#define WIDTH 640
#define HEIGHT 480 

void vDisplay(); 
void vReshape(); 
void vBitmapOutput(int x, int y, char *string, void *font);
void vStrokeOutput(GLfloat x, GLfloat y, char *string, void *font);


int main( int argc, char *argv[ ]) 
{ 
	glutInit(&argc,argv); // initialisation de GLUT
	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
	glutInitWindowSize(WIDTH,HEIGHT);
	glutInitWindowPosition(50,50);
	glutCreateWindow("Texte");
	glutDisplayFunc(vDisplay);
	glutReshapeFunc(vReshape);
	glutMainLoop();
	return 0; 
} 


void vDisplay() 
{ 
	glClearColor(0,0,0,0);
	glClear(GL_COLOR_BUFFER_BIT);

	glColor3d(1,1,1); // Texte en blanc
	vBitmapOutput(0,0,"Blanc HELVETICA",GLUT_BITMAP_HELVETICA_18);
	vBitmapOutput(10,30,"Blanc TIMES_ROMAN",GLUT_BITMAP_9_BY_15);

	glColor3d(0.2,0.6,0.2); // Texte en vert
	vBitmapOutput(-50,130,"TEXTE ECRIT EN VERT",GLUT_BITMAP_TIMES_ROMAN_24);

	glColor3d(0.6,0.6,0.6); // Texte en gris
	vStrokeOutput(-300, -200, "Gris",GLUT_STROKE_MONO_ROMAN);

   
   
	glFlush(); 
} 


void vReshape(int w, int h) 
{ 
	float L; 
	float H; 

	glViewport(0,0,w,h); 
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity(); 
	if (w<=h) 
	{ 
	  if (w==0) H=HEIGHT; 
	  else H=(GLfloat) (WIDTH*h/w); 
	  L=WIDTH; 
	} 
	else 
	{ 
	  H=HEIGHT; 
	  if (h==0) L=WIDTH; 
	  else L=(GLfloat) (HEIGHT*w/h); 
	} 
	gluOrtho2D(-L/2,L/2,-H/2,H/2); 
}


Le résultat est :