256 Couleur de programmation VGA en C - bitmaps - Manipulation Palette

Contenu de cette section:

L'une des choses les plus importantes dans la création d'une interface conviviale est l'utilisation de bitmaps. Sans bitmaps, il n'y aurait pas d'icônes, pas de boutons de fantaisie, et les pointeurs de souris devraient être en lignes.

Le bitmap terme est un retour en arrière à partir de quand les moniteurs ne pouvaient afficher une autre couleur en plus noir. Pour les fichiers de données à deux couleurs qui stockent une image, chaque bit dans le fichier de données représente un pixel; un 1 signifie le pixel est activée, un 0 signifie le pixel est éteint (Figure 13). Par conséquent, une image en deux couleurs est une carte de bits.

Figure 13. Un noir - blanc bitmap dans la mémoire et à l'écran.

Il y a quelques différents sous-types de format de fichier BMP. Celui étudié ici est le format RVB codé BMP Windows. Pour bitmaps de 256 couleurs, il dispose d'un en-tête de 54 octets (tableau III), suivie d'une table de palette de 1024 octets. Après cela, est le bitmap réelle, qui commence au coin inférieur gauche.

Tableau III. en-tête de format de fichier BMP Windows.

Une fois lu, l'affichage du bitmap est relativement facile, et ne concerne que quelques copies de mémoire pour afficher la mémoire. Ce qui suit est le code pour afficher une image de 32x64 stockée dans un bitmap de réseau.

Quelque chose d'intéressant à noter sur le format de fichier BMP est que chaque ligne de balayage est rembourré au plus proche boundry 4 octets. Donc, si la lecture d'image a une largeur qui est non divisible par quatre, disons, 21 octets, il y aurait 3 octets de remplissage à la fin de chaque ligne de balayage. Le programme bitmap.exe ne tient pas compte de cela; assume la largeur de la bitmap est divisible par quatre.

Il existe de nombreuses techniques pour mettre en œuvre la transparence. Une façon est d'attribuer l'une des 256 couleurs pour être transparent dans le programme. Lors de l'élaboration de l'image, un octet à la valeur de la transparence n'est pas écrit à la mémoire vidéo. Les outils suivants en utilisant ce zéro la valeur de la transparence:

Le BITMAP.C programme suivant lit un fichier bitmap rocket.bmp (Figure 14) et le tire à l'écran de manière de tuiles, en utilisant les deux fonctions de dessin bitmap opaques et transparentes.

Ayant du mal à la compilation ou l'exécution du programme? Voir la page Dépannage.

Figure 15. La sortie de bitmap.exe.

L'arrière-plan dans la sortie de bitmap.exe est une représentation de la palette 256 couleurs du VGA. Heureusement, la palette est programmable à d'autres couleurs, de sorte bitmaps ne sont pas forcé sur une palette bizarre. Malheureusement, le VGA nous donne seulement 6 bits par canal de couleur, de sorte que le mieux que vous pouvez obtenir est la couleur 18 bits (mais vous ne pouvez choisir 256 de ces couleurs, bien sûr). informations Palette sont stockées après l'en-tête dans le format de fichier BMP. Quatre octets définissent chaque couleur: un octet chacun pour le bleu, vert, rouge, et un octet réservé. Le VGA comprend des valeurs de couleur dans l'ordre rouge, vert, bleu, (inverse du format BMP) plus le programme a besoin de changer la forme de données de palette de 24 bits à 18 bits (diviser chaque couleur par quatre ou déplacement vers la droite par deux).

Pour définir une couleur dans la palette, écrire l'index de couleur au port 0x3C8 puis écrire les valeurs de rouge, vert et bleu, dans l'ordre, au port 0x3C9

Pour définir les 256 couleurs de la palette, écrivez zéro au port 0x3C8 puis écrire tous les 768 octets de la palette au port 0x3C9.

Notez que la palette ne peut être réglée jusqu'à ce que le mode vidéo 256 couleurs a été défini.

Le palette.c programme lit dans une image, affiche, puis cycles à travers toutes les couleurs en changeant à plusieurs reprises la palette.

Ayant du mal à la compilation ou l'exécution du programme? Voir la page Dépannage.

Figure 16. La sortie de palette.exe.

Quelque chose à noter au sujet du programme est la fonction wait_for_retrace.

Le VGA actualise l'écran 70 fois par seconde, ou 70Hz. Un canon à électrons traverse l'écran de gauche à droite, de haut en bas. Quand il arrive au bas de l'écran, (à savoir, il a fini rafraîchissant), le canon à électrons doit se déplacer à partir de l'angle inférieur droit de l'écran vers le coin supérieur gauche de l'écran. Cette fois, appelé la période de retour, est le moment idéal pour changer la palette. Si le programme n'a pas attendu le retour de balayage, la palette serait parfois changé au milieu d'un rafraîchissement, ce qui en différentes couleurs sur la partie supérieure de l'écran pour une fraction de seconde. Voici comment l'effet de cisaillement se produit. Pour éliminer ce, palette.c utilise la fonction wait_for_retrace.