Annexe au TD6 : utilisation de XImages

Introduction

Avantages et inconvéniens des routines X11 et des Pixmaps

Jusqu'à présent nous avons utilisé pour nos routines de dessin (DrawFace et FillFace) des fonctions X-Window et nous avons toujours dessiné dans un double buffer de type Pixmap.

Les avantages de cette méthode sont multiples :

Il y a cependant un gros inconvénient ! X11 ne fournit pas de routines permettant de dessiner des polygones texturés, des polygines dont les couleurs des pixels situés sur leur surface est interpolée à partir de la couleur des sommets, etc...

Bien sûr il est possible d'utiliser la fonction XDrawPoint pour dessiner les polygones pixels par pixels, mais dans ce cas, aussi rapide le serveur X11 soit-il, il faudra pour chaque pixel de chaque facette un appel de fonction, passer 5 ou 6 paramètres etc... Les performances ne seront plus au rendez-vous !

Pourquoi les XImages peuvent nous rendre service

Avec X11, on peut dessiner dans trois types d'objets : dans des Windows, dans des Pixmaps (zone mémoire utilisable comme une Window) et dans des XImages qui sont des buffers mémoires de type (char *) encapsulés par X11, et que l'on peut recopier dans des fenêtres pour les afficher.

Seules quelques macros sont utilisables, comme XPutPixel ou XGetPixel, mais nous n'allons pas les utiliser.  Vous pouvez consulter le cours X11 sur les XImages.

Avantages des XImages

Travail à faire

Intégrer l'utilisation des XImages dans votre programme. Je vous ai proposé en cours quelques unes des modifications que vous allez devoir apporter. Je vous conseille de conserver la possibilité d'utiliser un Pixmap pour les modes de dessins ne nécessitant pas forcément l'utilisation des XImages (rendu en fil de fer, flat shading).

Voici les modifications que je vous propose.

Remarques pour les gens de la maîtrise d'informatique ou de l'ESSI : ces modifications sont toutes issues du programme situé dans ~buffa/cours/minfo/infographie/mon_prog/mon_prog pour les maîtrises d'informatique, dans ~/src/cours/infographie/prog_test pour les gens de l'ESSI..
 

        case 'w':
          cam->render_mode = WIREFRAME;
          cam->use_pixmap = TRUE;
          reset_GC_Colors();
          draw_object(obj, cam, &lumiere);
          printf("Render mode = WIREFRAME\n");
          break;