sebrmvLe 17/02/2010 à 22:13
tu travailles en quel mode graphique?
je note (x,y) les coordonnées
je note w la largeur de l'écran et h la hauteur
- si c'est en bitplane, c'est un peu l'horreur
l'organisation est par blocs de 16 pixels comme ceci (par exemple en 16 couleurs on a 4 plans)
plan1 plan2 plan3 plan4 plan1 plan2 plan3 plan4 ...
le nombre d'octets par ligne (en 16 couleurs) est w / 2 (4 bits par pixels, en supposant que w est multiple de 16)
l'adresse (plus précisément l'offset) du bloc de pixels qui nous intéressent est (x / 16) * 8 + y * w/2
ici, (x / 16) est le quotient de la division entière de x par 16 (on a x / 16 = x >> 4 et et (x / 16) * 8 = (x >> 1) & 0xfff8)
et on a 8 octets = 16 pixels 4 bits
après le numéro du bit à allumer est (puisqu'on est en big endian) = 15 - (x % 16)
(x % 16 = x & 0xf)
le plus simple est probablement d'utiliser un or pour allumer le bit qui t'intéresse
et un and pour éteindre le bit qui t'intéresse
typiquement, tu as 16 masques, numéroté ainsi:
0 = %1000 0000 0000 0000
1 = %0100 0000 0000 0000
2 = %0010 0000 0000 0000
3 = %0001 0000 0000 0000
...
15 = %0000 0000 0000 0001
tu calcules (x % 16) ça te donne le numéro du masque à utiliser
pour allumer un pixel, tu fais simplement or.w masque,(adr)
pour effacer un pixel, tu fais simplement and.w ~masque,(adr)
(où ~masque est la négation binaire du masque: il peut être malin de calculer aussi la négation des masques)
et donc, évidemment, il faut faire ça (allumer/éteindre un bit) autant de fois que de plans et en fonction de la couleur
- si c'est en true color, alors c'est fastoche
l'adresse (l'offset) du point est tout simplement 2* x + y * 2 * w
(2 car 2 octets par pixel) et tu écris direct la couleur
en espérant t'avoir un peu aidé