Couleur, palette, classe visuelle

/* color.c */

/* caracteristiques des couleurs */

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

GC      gc; 
Display *display; 
int     screen; 
Window  win, root, subwin; 
unsigned long white_pixel, black_pixel, pixel;  
char buffer[30], *buf2;
Visual *visual;

main() { 
  if ((display = XOpenDisplay ("")) == NULL) { 
    fprintf (stderr, "Can't open Display\n"); 
    exit (1); 
  } 
  gc = DefaultGC (display, screen); 
  screen = DefaultScreen (display); 
  root = RootWindow (display, screen); 
  white_pixel = WhitePixel (display, screen); 
  black_pixel = BlackPixel (display, screen); 
  win = XCreateSimpleWindow (display, root,  
			     0, 0, 220, 200, 5, black_pixel, white_pixel); 
  XSelectInput (display, win, ExposureMask); 
  XStoreName (display, win, "color"); 
  XMapWindow (display, win); 
  subwin = XCreateSimpleWindow (display, win,  
			     10, 150, 150, 30, 2, black_pixel, white_pixel);
  pixel = white_pixel;
  XSelectInput (display, subwin, ExposureMask | ButtonPressMask); 
  XMapRaised (display, subwin); 

  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose : 
      sprintf(buffer, "defaultdepth = %d", XDefaultDepth(display, screen));
      XDrawString(display, win, gc, 10, 20, buffer, strlen(buffer));
      if (XDefaultDepth(display, screen) == 1)
	buf2 = "monochrome";
      else {
	visual = DefaultVisual(display, screen);
	if (visual->class == GrayScale)
	  buf2 = "GrayScale";
	else if (visual->class =PseudoColor)
	  buf2 = "PseudoColor";
	else if (visual->class =DirectColor)
	  buf2 = "DirectColor";
	else if (visual->class =TrueColor)
	  buf2 = "TrueColor";
      }
      sprintf(buffer, "classe de colormap : %s", buf2);
      XDrawString(display, win, gc, 10, 40, buffer, strlen(buffer));
      sprintf(buffer, "nombre de cellules = %d", 
	      XDisplayCells(display, screen));
      XDrawString(display, win, gc, 10, 60, buffer, strlen(buffer));
      sprintf(buffer, "nombre de plans = %d", XDisplayPlanes(display, screen));
      XDrawString(display, win, gc, 10, 80, buffer, strlen(buffer));   
      sprintf(buffer, "BlackPixel = %d Ox%x", black_pixel, black_pixel);
      XDrawString(display, win, gc, 10, 100, buffer, strlen(buffer));   
      sprintf(buffer, "WhitePixel = %d 0x%x", white_pixel, white_pixel);
      XDrawString(display, win, gc, 10, 120, buffer, strlen(buffer));   
      break; 
    case ButtonPress :
      if (ev.xbutton.button == Button1) {
	XSetWindowBackground(display, subwin, ++pixel);
	XClearWindow(display, subwin);
	sprintf(buffer, "pixel = %d 0x%x", pixel, pixel);
	XDrawString(display, subwin, gc, 10, 20, buffer, strlen(buffer));  
      } 
      else if (ev.xbutton.button == Button3) {
	XSetWindowBackground(display, subwin, --pixel);
	sprintf(buffer, "pixel = %d 0x%x", pixel, pixel);
	XClearWindow(display, subwin);
	XDrawString(display, subwin, gc, 10, 20, buffer, strlen(buffer));  
      } 
      break;
   default : 
      break;            
    } 
  } 
}

Execution :

Cliquez sur le bouton 1 ou 3 dans la sous-fenêtre pour faire défiler les couleurs de la palette par incrémentation (respectivement décrémentation) de la valeur de pixel.

Fonctionnement de ce programme :

La structure XColor définit une couleur de la palette avec l'intensité de chaque faisceau : rouge, vert et bleu (RVB), et l'indice (pixel) dans la palette. La palette de couleurs (ColorMap) est un tableau indicé de couleurs. Le blanc correspond à la saturation (valeur maximale) de RVB, et le noir à une intensité nulle. La valeur de pixel du blanc et du noir n'ont aucun rapport avec ce qui précède, car ce n'est qu'un indice de tableau (palette).

Les classes visuelles définissent le mode d'associations entre pixel et couleur, dont :
- PseudoColor
- DirectColor
Généralement, il n'y a qu'une seule palette et classe visuelle par écran.

 

programme suivant index général fonctions de la XLib événements types dans XLib