14Fermer16
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é