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 >
GFA-BASIC Atari  |  1996-04-20  |  3KB  |  144 lines

  1. '
  2. ' La TGA doit être en 256 couleurs (niv de gris en fait) avec palette, et être
  3. ' stoquée de haut en bas (contrairement aux TGA classiques).
  4. ' Le fichier ne doit pas dépasser 1.6 Mo
  5. '
  6. path$="F:\DEV.GTK\"
  7. ' file$="tos2_bn.tga"     ! Image 1
  8. file$="grattes.tga"     ! Image 2
  9. file2$="present2.pic"   ! Mais au final, -> present.pic compactée à l'atomic 3.5
  10. reduction!=FALSE        ! TRUE pour l'image 1
  11. '
  12. '
  13. '
  14. DIM image1%(400000)
  15. DIM image2&(400000)
  16. DIM ordre%(255)
  17. DIM pal%(15)
  18. BLOAD path$+file$,V:image1%(0)
  19. adr_im1%=V:image1%(0)
  20. adr_im2%=V:image2&(0)
  21. taille_x%=FN intel_w(ADD(adr_im1%,&HC))
  22. taille_y%=FN intel_w(ADD(adr_im1%,&HE))
  23. IF reduction!
  24.   taille_x2%=DIV(taille_x%,2)
  25.   taille_y2%=DIV(taille_y%,2)
  26. ELSE
  27.   taille_x2%=taille_x%
  28.   taille_y2%=taille_y%
  29. ENDIF
  30. '
  31. ' Réorganisation de la palette
  32. '
  33. adr_coul%=ADD(adr_im1%,&H12)
  34. FOR coul%=0 TO 255
  35.   a%=BYTE{adr_coul%}
  36.   b%=BYTE{SUCC(adr_coul%)}
  37.   c%=BYTE{ADD(adr_coul%,2)}
  38.   ordre%(coul%)=DIV(ADD(ADD(a%,b%),c%),3)
  39.   ADD adr_coul%,3
  40. NEXT coul%
  41. '
  42. ' Réduction de l'image /2 ou copie simple
  43. '
  44. ARRAYFILL image2&(),0
  45. adr_dat1%=ADD(adr_im1%,786)
  46. IF reduction!
  47.   FOR y_orig%=0 TO 1
  48.     PRINT AT(1,5);"Passe ";SUCC(y_orig%);"/2"
  49.     FOR y%=0 TO PRED(taille_y2%)
  50.       PRINT AT(1,6);"Ligne ";SUCC(y%);"/";taille_y2%;"    ";
  51.       adr_pix1%=ADD(adr_dat1%,MUL(taille_x%,ADD(SHL(y%,1),y_orig%)))
  52.       pos_pix2%=MUL(taille_x2%,y%)
  53.       FOR x%=0 TO PRED(taille_x2%)
  54.         niv%=SHL(ADD(ordre%(BYTE{adr_pix1%}),ordre%(BYTE{SUCC(adr_pix1%)})),2)
  55.         ADD image2&(pos_pix2%),niv%
  56.         ADD adr_pix1%,2
  57.         INC pos_pix2%
  58.       NEXT x%
  59.     NEXT y%
  60.   NEXT y_orig%
  61. ELSE
  62.   FOR y%=0 TO PRED(taille_y2%)
  63.     PRINT AT(1,5);"Ligne ";SUCC(y%);"/";taille_y2%;"    ";
  64.     adr_pix1%=ADD(adr_dat1%,MUL(taille_x%,y%))
  65.     pos_pix2%=MUL(taille_x2%,y%)
  66.     FOR x%=0 TO PRED(taille_x2%)
  67.       niv%=SHL(ordre%(BYTE{adr_pix1%}),4)
  68.       image2&(pos_pix2%)=SHL(ordre%(BYTE{adr_pix1%}),4)
  69.       INC adr_pix1%
  70.       INC pos_pix2%
  71.     NEXT x%
  72.   NEXT y%
  73. ENDIF
  74. '
  75. ' Palette de 16 couleurs
  76. '
  77. FOR coul%=0 TO 15
  78.   pal%(coul%)=MUL(coul%,&H111)
  79. NEXT coul%
  80. '
  81. ' Conversion en 16 couleurs
  82. ' Dispersion des erreurs par Floyd-Steinberg
  83. '
  84. CLS
  85. pos_img%=0
  86. FOR y%=0 TO PRED(taille_y2%)
  87.   PRINT AT(1,5);"Ligne ";SUCC(y%);"/";taille_y2%
  88.   FOR x%=0 TO PRED(taille_x2%)
  89.     coul_im%=image2&(pos_img%)
  90.     IF coul_im%>=0
  91.       coul_pal%=15
  92.       WHILE coul_im%<pal%(coul_pal%)
  93.         DEC coul_pal%
  94.       WEND
  95.       IF coul_pal%<15
  96.         IF SUB(pal%(SUCC(coul_pal%)),coul_im%)<SUB(coul_im%,pal%(coul_pal%))
  97.           INC coul_pal%
  98.         ENDIF
  99.       ENDIF
  100.     ELSE
  101.       coul_pal%=0
  102.     ENDIF
  103.     erreur%=SUB(coul_im%,pal%(coul_pal%))
  104.     image2&(pos_img%)=coul_pal%
  105.     ADD image2&(SUCC(pos_img%)),DIV(MUL(erreur%,7),16)
  106.     ADD image2&(ADD(pos_img%,taille_x2%)),DIV(MUL(erreur%,5),16)
  107.     ADD image2&(PRED(ADD(pos_img%,taille_x2%))),DIV(MUL(erreur%,3),16)
  108.     ADD image2&(SUCC(ADD(pos_img%,taille_x2%))),DIV(erreur%,16)
  109.     INC pos_img%
  110.   NEXT x%
  111. NEXT y%
  112. '
  113. ' Mise au format 1 octet = 1 point et alignement de la largeur à 8 pixels
  114. '
  115. taille_x2b%=ADD(taille_x2%,7) AND -8
  116. image1%(0)=taille_x2b%
  117. image1%(1)=taille_y2%
  118. adr_pix1%=V:image1%(2)
  119. pos_img%=0
  120. FOR y%=0 TO PRED(taille_y2%)
  121.   FOR x%=0 TO PRED(taille_x2%)
  122.     BYTE{adr_pix1%}=image2&(pos_img%)
  123.     INC adr_pix1%
  124.     INC pos_img%
  125.   NEXT x%
  126.   x%=taille_x2%
  127.   WHILE x%<taille_x2b%
  128.     BYTE{adr_pix1%}=0
  129.     INC adr_pix1%
  130.     INC x%
  131.   WEND
  132. NEXT y%
  133. '
  134. ' Sauvegarde
  135. '
  136. BSAVE path$+"sys\"+file2$,V:image1%(0),MUL(taille_x2b%,taille_y2%)
  137. END
  138. '
  139. '
  140. '
  141. FUNCTION intel_w(adr%)
  142.   RETURN ADD(BYTE{adr%},SHL(BYTE{SUCC(adr%)},8))
  143. ENDFUNC
  144.