La notion de visuel (visual en anglais) a été introduite dans X. Dans la mémoire du serveur X, la couleur de chaque pixel de l'écran est représentée par un nombre entier. Le nombre de bits alloués à cet entier représente la profondeur. Celle-ci est souvent exprimée en nombre de plans et elle détermine le nombre de couleurs possibles à l'écran. L'entier associé à un pixel ne représente pas la couleur directement. En fait, il est utilisé comme une (ou plusieurs) entrée(s) dans une table des couleurs (colormap). Cette indirection est utilisée pour augmenter le nombre de couleurs tout en occupant une place raisonnable en mémoire, nécessaire pour tous les pixels de l'écran. Un même serveur X présente plusieurs méthodes pour interpréter l'entier associé à une couleur. Chacune de ces méthodes est un ``visuel'', une méthode (matérielle) qui décrit la manière dont les pixels représentent les couleurs. Les visuels disponibles sur un serveur X peuvent être affichés grâce à l'utilitaire xdpyinfo. Chacun des visuels est caractérisé par sa profondeur et sa classe. Pour les écrans ``noir et blanc'', les classes possibles sont StaticGray et GrayScale. Pour les écrans ``couleur'', les classes possibles sont StaticColor, TrueColor, PseudoColor et DirectColor. Ces différentes classes se distinguent par le fait d'être en lecture seulement ou en lecture/écriture et par le fait que la table des couleurs soit décomposée ou non.
Noir et Blanc | Couleur | |||
Lecture | Lecture-écriture | Lecture | Lecture-écriture | |
décomposée | TrueColor | DirectColor | ||
non-decomposée | StaticGray | GrayScale | StaticColor | PseudoColor |
A chaque pixel de l'écran est associé une zone mémoire où est enregistré
le niveau de gris du pixel ou la couleur. Le nombre de plans donne
le nombre de bits consacrés à chaque pixel. Il détermine aussi le
nombre maximal de couleurs qui peuvent être présentes simultanément
à l'écran. Si le nombre de plan est 1, la couleur d'un pixel ne peut
prendre que deux valeurs. C'est le cas d'un écran noir et blanc sans
niveau de gris. Au contraire, si le nombre de plans est 24, le nombre
de couleurs possibles pour un pixel est
.
Ce n'est pas directement la couleur qui est mémorisée dans la zone mémoire associée à chaque pixel. En fait, il s'agit d'un point d'entrée dans une table des couleurs où sont vraiment mémorisées les coordonnées (ou valeurs RGB) de la couleur. Nécessaire pour gagner de l'espace mémoire, cette indirection est faite de façon différente selon que la table est décomposée ou non.
Lorsque la table des couleurs n'est pas décomposée, l'entier en mémoire écran donne directement le numéro de l'entrée dans la table des couleurs. Cette entrée est appelée une ``cellule''. La cellule donne alors les valeurs des trois composantes RGB de la couleur (figure 15).
Lorsque la table des couleurs est décomposée, l'entier en mémoire écran se décompose en trois entiers définis par trois champs de bits. Chacun de ces trois entiers donne le numéro d'une entrée dans une des tables des trois composantes (figure 16).
Qu'un table soit décomposée ou non, les coordonnées des couleurs sont
mémorisées avec un nombre de bits plus importants, généralement 12
ou 16. Lorsque la table est décomposée et que les coordonnées sont
mémorisées avec 12 bits, on obtient
couleurs
possibles même si toutes ne peuvent pas être affichées simultanément
à l'écran.
A présent, vérifiez les visuels que votre écran supporte avec la commande xdpyinfo. Vous noterez qu'il y a en plus d'un, car X peut effectivement supporter un visuel simple StaticColor avec PseudoColor, ou un visuel DirectColor avec TrueColor. Le visuel par défaut est affiché en premier lieu et peut être installé avec l'option -cc telle que nous l'avons employée ci-dessus dans le cas d'un serveur à 16 couleurs. L'argument de l'option -cc est le numéro de code entre parenthèses.
Notez que les bonnes applications X vérifient la liste des visuels disponibles et y sélectionnent un visuel approprié. Il existe aussi des applications qui nécessitent un visuel particulier, et d'autres qui prennent l'option -visual en ligne de commandes.