/* test svgalib n°4 - écritures via vgagl - Patrick TRAU mai 02 on utilise vgagl pour écrire du texte dans le graphique. Le reste est toujours uniquement en svgalib simple, bien que vgagl propose des fonctions de tracé plus évoluées (cercle, rectangles pleins, triangles pleins...) j'ai l'impression que la police gl_font8x8 ne fonctionne qu'en 256 couleurs au moins mais je me demande bien pourquoi pour compiler - attention : lier vgagl avant vga : gcc src.c -O3 -o exec -lvgagl -l vga (n'oubliez pas de lancer sous root ou chmod s+u) */ #include <stdio.h> #include <stdlib.h> #include <vga.h> #include <vgagl.h> int choix_mode(void) { int m; printf("choisissez une définition qui ne plante pas votre carte graphique:\n"); printf(" G320x200x16 1"); printf(" G640x200x16 2"); printf(" G640x350x16 3"); printf(" G640x480x16 4"); printf(" G320x200x256 5"); printf(" G320x240x256 6"); printf(" G320x400x256 7"); printf(" G360x480x256 8"); printf(" G640x480x2 9"); printf(" G640x480x256 10"); printf(" G800x600x256 11"); printf(" G1024x768x256 12 ? "); scanf("%d",&m); return m; } void tracecadre(void) { int x,y,coul,i; x=vga_getxdim(); //récup résolution actuelle y=vga_getydim(); coul=vga_white(); //récup n° de couleur du blanc dans le mode actu vga_drawline(0,0,x-1,0); vga_drawline(x-1,0,x-1,y-1); vga_drawline(x-1,y-1,0,y-1); vga_drawline(0,y-1,0,0); } int main(void) { int i,mode; mode=choix_mode(); vga_init(); vga_setmode(mode); gl_setcontextvga(mode); /*donner obligatoirement le même mode qu'au dessus ! */ /* Solution 1 : on décompresse la police (256 chars) #define NBCHARS 256 //la police comporte 256 chars #define FONT_W 8 //un char fait 8x8 pixels #define FONT_H 8 #define O_PIXEL 1 //256 couleurs = 1 octet/pixel #define FONT_COL 14 //couleur du texte void *font; font = malloc(NBCHARS * FONT_W * FONT_H * O_PIXEL); gl_expandfont(FONT_W, FONT_H, FONT_COL, gl_font8x8, font); gl_setfont(FONT_W, FONT_H, font); **********************************************************************************/ /* Solution 2 : on la garde compressée, c'est un peu plus lent mais plus simple */ gl_setfont(8, 8, gl_font8x8); //largeur, hauteur, pointeur sur la police (c'est la seule en standard) gl_setwritemode(FONT_COMPRESSED); //la police gl_font8x8 est comprimée (on ne l'a pas "expandée") gl_setfontcolors(0, 12); //coul fond, coul texte tracecadre(); for(i=0;i<10;i++) gl_printf(i*15,i*20,"nb aléatoire : %d ! ",rand()%10000); //gl_write (x,y,texte) est limité aux textes mais marche dans plus de versions fprintf(stderr,"appuyez une touche pour quitter"); //on ne peut pas écrire dans le graphique mais dans la console ayant lancé le prog vga_getch(); //attend un touche, retourne la touche appuyée (si nécessaire) vga_setmode(TEXT); //retourner au mode texte (important) printf("fini\n"); //les printf se font sur la console où on a lancé la commande (ou dans CTRL ALT 8 suivant les cas) return EXIT_SUCCESS; }
Patrick Trau, IPST, Université Louis Pasteur Strasbourg, mai 2002