L'image est découpéé par plan, c'est à dire par bits. Ca n'a rien à voir avec le vocabulaire du monde de la photo. Par exemple les tiles sont encodés par blocs de 8 pixels par 8 pixels et les pixels ne sont pas représéntés sous forme d'entiers. Sachant qu'on utilise des palettes sur pce, les pixels ne contiennent pas les valeurs RGB des couleurs, mais l'index dans la palette. Comme les palettes contiennent 16 couleurs, les pixels sont encodes sur 4 bits. Or si on utilise le mode "chunky", soit on perd de la place (8-4=4 bits) en faisant :
Soit on concatene:
Code : Tout sélectionner
octet[0]=(pixel[x=0][y=0] << 4) | pixel[x=1][y=0]
octet[1]=(pixel[x=2][y=0] << 4) | pixel[x=3][y=0]
...
A première vue la concaténation a l'air d'être la solution optimale, mais je pense qu'à l'époque, traiter ce genre de données aurait complexifier le vdc. Et puis si on augmente la taille des palette, il faut tout refaire. Par exemple, si on passe à 32 couleurs, la concaténation "déborde" sur l'octet suivant.
Il reste donc l'encodage par "plans" (bits). Le premier octet contient le premier bit des pixels de la premiere ligne (qui contient 8 pixels pour les tiles et 16 pour les sprites). La différence entre les tiles et les sprites, est que les plans tiles sont entrelacés (si je ne raconte pas de bétises). C'est à dire qu'on aura d'abord les 2 premiers bits de chaque lignes, puis les bits 3 et 4. Alors que pour les sprites, les plans se succèdent.
Tiles:
Code : Tout sélectionner
// 2 premiers bits
octet[0] = bit0, y=0, x=[0,7]
octet[1] = bit1, y=0, x=[0,7]
octet[2] = bit0, y=1, x=[0,7]
octet[3] = bit1, y=1, x=[0,7]
...
octet[14] = bit0, y=7, x=[0,7]
octet[15] = bit1, y=7, x=[0,7]
// Les 2 restants
octet[16] = bit2, y=0, x=[0,7]
octet[17] = bit3, y=0, x=[0,7]
octet[18] = bit2, y=1, x=[0,7]
octet[19] = bit3, y=2, x=[0,7]
....
Avec ce type d'encodage, augmenter la taille des palettes ne coutent presque rien. On a juste à lire des octets en plus.
Pour les sprites, les lignes font 16 pixels donc:
Code : Tout sélectionner
octet[0] = bit0, y=0, x=[0,7]
octet[1] = bit0, y=0, x=[8,15]
octet[2] = bit1, y=0, x=[0,7]
octet[3] = bit1, y=0, x=[8,15]
octet[4] = bit2, y=0, x=[0,7]
octet[5] = bit2, y=0, x=[8,15]
octet[6] = bit3, y=0, x=[0,7]
octet[7] = bit3, y=0, x=[8,15]
// Seconde ligne
octet[8] = bit0, y=1, x=[0,7]
octet[9] = bit0, y=1, x=[8,15]
octet[10] = bit1, y=1, x=[0,7]
octet[11] = bit1, y=1, x=[8,15]
octet[12] = bit2, y=1, x=[0,7]
octet[13] = bit2, y=1, x=[8,15]
octet[14] = bit3, y=1, x=[0,7]
octet[15] = bit3, y=1, x=[8,15]
...
correspond à :
Code : Tout sélectionner
octet = 0;
for(i=0; i<8; ++i) {
bit = pixel[C+i][B] >> A;
octet |= (bit << i);
}
Par contre, là j'ai un blanc.. je ne me rappelle plus si l'ordre dans l'octet est:
x=0,x=1,...,x=7 ou x=7,x=6,...x=0
Voilà !