	Images TGA compresses (1)
	**************************

	On a vu des images de toutes sortes passer au fil des annes et
autant de formats disponibles. Certains sont trop spcifiques (limits 
une rsolution d'cran), d'autres trop gnralistes (on croule sous les
options) et d'autres trop compliqus (a vexe le programmeur qui n'y
comprend rien). Apres tout ceci, il nous reste le TGA qui est beau,
simple,  la porte de nos esprits tout en tant complet puisqu'il permet
de traiter des images allant du monochrome au True Color.

On ne va pas tout faire
-----------------------

	Le TGA est surtout utilis pour les images High Color (15 bits,
32768 couleurs) ou True Color (24 bits, 16 millions de couleurs). Je vais
me restreindre  ces deux modes dans la suite de l'article.
	Sachez d'abord qu'un processeur Intel a du passer par l puisque
tous les mots sont rangs avec leurs octets inverss. Voici la
prsentation rapide du header (l'en-tete):

1 octet: taille de la chaine d'identification
1 octet: ignor
1 octet: type d'image (2=non compress, 10=compress)
9 octets: ignors
2 octets: largeur de l'image
2 octets: hauteur de l'image
1 octet: nombre de bits par pixel (16 ou 24)
1 octet: bit 5=1 image de haut en bas, =0 image de bas en haut
variable: chaine d'identification
variable: les pixels

	On trouve trs souvent des TGA sans chaine d'identification, le
premier octet est donc nul dans le header. Les pixels sont dfinis ainsi:

en 24 bits:
	1 octet: bleu
	1 octet: vert
	1 octet: rouge

en 16 bits:
	2 octets: vvvbbbbb xrrrrrvv

	Voyez que les octets sont encore inverss et que le mode 16 bits
est en fait un 15 bits puisque le "x" est ignor.

Allez, on lit!
--------------

	La compression est simple pour les images de type 10, c'est du RLE
(run length encoding=courir longueur codage, hem....). C'est la mthode la
plus simple, elle est compose de blocs commenant par un octet N:
	- N>=128: rpter (N-127) fois le pixel qui suit (c'est un bloc
	compress de pixels gaux)
	- N<128: recopier les (N+1) pixels qui suivent (c'est un bloc de
	pixels diffrents qui n'a pas pu etre compress)

	Cette routine reoit en entre un pointeur sur le dbut du fichier
TGA, elle vous renvoit un pointeur sur les pixels. Si l'image n'est pas
compresse, c'est l'affaire de quelques instructions. Si elle l'est, alors
la dcompression est lance et vous rcuprez vos pixels:

Entre:
A0: adresse du fichier TGA
A1: adresse ou copier/dcompresser les pixels

lire_tga10:
	lea 18(a0),a2	; saute la partie fixe du header
	moveq #0,d0
	move.b (a0),d0	; taille de la chaine
	add d0,a2	; dbut des pixels
	move 12(a0),d0
	ror #8,d0	; largeur
	move 14(a0),d4
	ror #8,d4	; hauteur
	muls d0,d4	; nombre de pixels
	cmp.b #24,16(a0) ; 24 bits?
	bne bits16	; non, on saute
	cmp.b #10,2(a0)	; compress?
	bne bits24raw	; non, on saute

	; ici, on dcompresse du 24 bits

bits24comp:
	moveq #0,d0
	move.b (a2)+,d0	; octet N
	bmi.s .comp	; >=128
	sub.l d0,d4
.pas_comp:
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	dbf d0,.pas_comp
.test:
	subq.l #1,d4
	bgt.s .bits24comp
	rts
.comp:
	move.b (a2)+,d1
	move.b (a2)+,d2
	move.b (a2)+,d3	; B,V,R  rpter
	bclr #7,d0
	sub.l d0,d4
.repete:
	move.b d1,(a1)+
	move.b d2,(a1)+
	move.b d3,(a1)+
	dbf d0,.repete
	bra.s .test

	; sans compression, on recopie simplement
	; les 24 bits pour chaque pixel

bits24raw:
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	subq.l #1,d4
	bne.s bits24raw
	rts

bits16:
	cmp.b #10,16(a0) ; compress?
	bne bits16raw	; non, on saute

	; ici on dcompresse du
	; 16 bits

bits16comp:
	moveq #0,d0
	move.b (a2)+,d0	; octet N
	bmi.s .comp	; >=128
	sub.l d0,d4
.pas_comp:
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	dbf d0,.pas_comp
.test:
	subq.l #1,d4
	bgt.s .bits16comp
	rts
.comp:
	move.b (a2)+,d1
	move.b (a2)+,d2	; mot de 16 bits a rpter
	bclr #7,d0
	sub.l d0,d4
.repete:
	move.b d1,(a1)+
	move.b d2,(a1)+
	dbf d0,.repete
	bra.s .test

	; sans compression, on recopie simplement
	; les 16 bits pour chaque pixel

bits16raw:
	move.b (a2)+,(a1)+
	move.b (a2)+,(a1)+
	subq.l #1,d4
	bne.s bits16raw
	rts

Ouais, mais c'est pas top
-------------------------

	En effet, mon programme suppose que si le type n'est pas 10, c'est
qu'il vaut forcment 2 (ca pourrait etre 0 ou 9...) et il suppose que si
il n'y a pas 24 bits par pixel, c'est forcment 16 (ca pourrait etre 8 ou
4...). A vous de complter le source si vous dsirez prendre en compte
tous les cas de figure.
	Par contre, j'ai t gentil, la parit de A2 changeant tout le
temps, j'ai bien dplac mes points octet par octet afin de ne pas
provoquer une erreur d'adresse sur le 68000.

C'est dja fini...
------------------

	Oui, mais on reviendra! a n'est pas tout de lire du TGA
compress, il faut aussi savoir l'crire. La prochaine fois nous verrons
la routine pour compresser une image 16 ou 24 bits.

	Guillaume Tello.
	gtello@wanadoo.fr