home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
No Fragments Archive 4: The Falcon Archive
/
nf_archive_four_v1.0.iso
/
ARCHIVE
/
WORK
/
MSX
/
GTK08777.ZIP
/
GTK.DEV
/
CONV_TGA.GFA
(
.txt
)
next >
Wrap
GFA-BASIC Atari
|
1996-04-20
|
3KB
|
144 lines
'
' La TGA doit être en 256 couleurs (niv de gris en fait) avec palette, et être
' stoquée de haut en bas (contrairement aux TGA classiques).
' Le fichier ne doit pas dépasser 1.6 Mo
'
path$="F:\DEV.GTK\"
' file$="tos2_bn.tga" ! Image 1
file$="grattes.tga" ! Image 2
file2$="present2.pic" ! Mais au final, -> present.pic compactée à l'atomic 3.5
reduction!=FALSE ! TRUE pour l'image 1
'
'
'
DIM image1%(400000)
DIM image2&(400000)
DIM ordre%(255)
DIM pal%(15)
BLOAD path$+file$,V:image1%(0)
adr_im1%=V:image1%(0)
adr_im2%=V:image2&(0)
taille_x%=FN intel_w(ADD(adr_im1%,&HC))
taille_y%=FN intel_w(ADD(adr_im1%,&HE))
IF reduction!
taille_x2%=DIV(taille_x%,2)
taille_y2%=DIV(taille_y%,2)
ELSE
taille_x2%=taille_x%
taille_y2%=taille_y%
ENDIF
'
' Réorganisation de la palette
'
adr_coul%=ADD(adr_im1%,&H12)
FOR coul%=0 TO 255
a%=BYTE{adr_coul%}
b%=BYTE{SUCC(adr_coul%)}
c%=BYTE{ADD(adr_coul%,2)}
ordre%(coul%)=DIV(ADD(ADD(a%,b%),c%),3)
ADD adr_coul%,3
NEXT coul%
'
' Réduction de l'image /2 ou copie simple
'
ARRAYFILL image2&(),0
adr_dat1%=ADD(adr_im1%,786)
IF reduction!
FOR y_orig%=0 TO 1
PRINT AT(1,5);"Passe ";SUCC(y_orig%);"/2"
FOR y%=0 TO PRED(taille_y2%)
PRINT AT(1,6);"Ligne ";SUCC(y%);"/";taille_y2%;" ";
adr_pix1%=ADD(adr_dat1%,MUL(taille_x%,ADD(SHL(y%,1),y_orig%)))
pos_pix2%=MUL(taille_x2%,y%)
FOR x%=0 TO PRED(taille_x2%)
niv%=SHL(ADD(ordre%(BYTE{adr_pix1%}),ordre%(BYTE{SUCC(adr_pix1%)})),2)
ADD image2&(pos_pix2%),niv%
ADD adr_pix1%,2
INC pos_pix2%
NEXT x%
NEXT y%
NEXT y_orig%
ELSE
FOR y%=0 TO PRED(taille_y2%)
PRINT AT(1,5);"Ligne ";SUCC(y%);"/";taille_y2%;" ";
adr_pix1%=ADD(adr_dat1%,MUL(taille_x%,y%))
pos_pix2%=MUL(taille_x2%,y%)
FOR x%=0 TO PRED(taille_x2%)
niv%=SHL(ordre%(BYTE{adr_pix1%}),4)
image2&(pos_pix2%)=SHL(ordre%(BYTE{adr_pix1%}),4)
INC adr_pix1%
INC pos_pix2%
NEXT x%
NEXT y%
ENDIF
'
' Palette de 16 couleurs
'
FOR coul%=0 TO 15
pal%(coul%)=MUL(coul%,&H111)
NEXT coul%
'
' Conversion en 16 couleurs
' Dispersion des erreurs par Floyd-Steinberg
'
CLS
pos_img%=0
FOR y%=0 TO PRED(taille_y2%)
PRINT AT(1,5);"Ligne ";SUCC(y%);"/";taille_y2%
FOR x%=0 TO PRED(taille_x2%)
coul_im%=image2&(pos_img%)
IF coul_im%>=0
coul_pal%=15
WHILE coul_im%<pal%(coul_pal%)
DEC coul_pal%
WEND
IF coul_pal%<15
IF SUB(pal%(SUCC(coul_pal%)),coul_im%)<SUB(coul_im%,pal%(coul_pal%))
INC coul_pal%
ENDIF
ENDIF
ELSE
coul_pal%=0
ENDIF
erreur%=SUB(coul_im%,pal%(coul_pal%))
image2&(pos_img%)=coul_pal%
ADD image2&(SUCC(pos_img%)),DIV(MUL(erreur%,7),16)
ADD image2&(ADD(pos_img%,taille_x2%)),DIV(MUL(erreur%,5),16)
ADD image2&(PRED(ADD(pos_img%,taille_x2%))),DIV(MUL(erreur%,3),16)
ADD image2&(SUCC(ADD(pos_img%,taille_x2%))),DIV(erreur%,16)
INC pos_img%
NEXT x%
NEXT y%
'
' Mise au format 1 octet = 1 point et alignement de la largeur à 8 pixels
'
taille_x2b%=ADD(taille_x2%,7) AND -8
image1%(0)=taille_x2b%
image1%(1)=taille_y2%
adr_pix1%=V:image1%(2)
pos_img%=0
FOR y%=0 TO PRED(taille_y2%)
FOR x%=0 TO PRED(taille_x2%)
BYTE{adr_pix1%}=image2&(pos_img%)
INC adr_pix1%
INC pos_img%
NEXT x%
x%=taille_x2%
WHILE x%<taille_x2b%
BYTE{adr_pix1%}=0
INC adr_pix1%
INC x%
WEND
NEXT y%
'
' Sauvegarde
'
BSAVE path$+"sys\"+file2$,V:image1%(0),MUL(taille_x2b%,taille_y2%)
END
'
'
'
FUNCTION intel_w(adr%)
RETURN ADD(BYTE{adr%},SHL(BYTE{SUCC(adr%)},8))
ENDFUNC