Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : GFA Basic - Conversion de fichiers IFF en BOB ou sprites
(Article écrit par Stéphane Schreiber et extrait d'Amiga News Tech - janvier 1991)
|
|
L'application GFA Basic de ce mois-ci découle d'une idée toute bête : pourquoi ne pas utiliser Deluxe Paint pour
créer tous les objets graphiques - BOB et sprites en particulier - dont on peut avoir tôt ou tard grand besoin ?
Parce que je ne sais pas pour vous, mais moi, depuis le temps, j'en étais encore à utiliser cette ignominie d'ObjEdit
fourni avec le bon vieil AmigaBasic des familles. Remarquez, ce programme possède un avantage certain : il sauvegarde
des fichiers sprites - ou BOB, c'est pareil - directement exploitables par l'instruction OBJECT.SHAPE, instruction
qui, dans sa version GFA Basic, est parfaitement compatible avec celle de l'AmigaBasic. C'était toujours ça de pris.
Seulement, il faut bien reconnaître que question dessin, Deluxe Paint est encore ce qui se fait de mieux ; aucune
comparaison possible en tout cas avec ObjEdit. Du coup, je me suis dit qu'en écrivant une routine de conversion des
fichiers IFF en fichiers BOB ou sprites, puisque je vous dis que c'est pareil, j'arriverai peut-être à créer des
graphismes dignes de mon talent. Donc acte.
Passe-moi la brosse à reluire
Le programme qui suit est ma foi fort simple, tout autant que son mode d'emploi. Le désormais célèbre FileRequester
apparaît, dans lequel on sélectionne le nom du fichier IFF à convertir. Il est préférable que ce fichier
soit une brosse que vous aurez au préalable découpée sous Deluxe Paint, vu que le programme convertit le
fichier IFF en BOB sans se soucier une seule seconde de sa taille. Si vous voulez vous dessiner des BOB
de la taille de l'écran, rien ne vous en empêche. Une fois toutes les opérations correctement effectuées,
un nouveau fichier est créé du même nom que le premier, mais avec l'extension ".BOB" ou ".SPRITE" en sus.
Du côté des gadgets, il vous est possible de sauvegarder la palette séparément, pour la récupérer dans
vos programmes plus tard ; dans ce cas, un second fichier est également créé, d'extension ".PAL". Pour ceux
que les détails sordides intéressent réellement, je suis obligé d'avouer ne pas connaître ni d'Adam,
ni d'Eve, ni de qui que ce soit d'autre le format exact des chaînes de caractères utilisées dans l'instruction
OBJECT.SHAPE. M'enfin, qu'à cela ne tienne, il suffisait de regarder le listing d'ObjEdit pour faire
exactement la même chose que lui, tout pareil.
La routine de lecture d'une image IFF est quant à elle légèrement plus intéressante. C'est d'ailleurs
elle qui occupe la quasi-totalité de ce listing, c'est tout dire. Signalons pour ceux qui se sentiraient
concernés, que je me contente de lire les blocs de données BMHD (bitmap header pour les intimes), CAMG, BODY et
CMAP, ce dernier n'étant pas obligatoire (alors que les trois premiers, si). La routine s'étend de la
ligne "WHILE NOT EOF(#1)" jusqu'à la ligne "CLOSE #1" incluses. Les plus curieux peuvent toujours aller
la disséquer un peu, voire l'améliorer, je n'ai jamais prétendu posséder la science infuse...
CLEAR
ON BREAK GOSUB broken
OPTION BASE 0
'
FILESELECT "Nom du fichier IFF ILBM ? ","OK Boss","",image_iff$
IF LEN(image_iff$) AND EXIST(image_iff$)
OPEN "i",#1,image_iff$
IF INPUT$(4,#1)="FORM"
form_length%=CVL(INPUT$(4,#1))
IF INPUT$(4,#1)="ILBM"
flags&=0
WHILE NOT EOF(#1)
chunk_name$=INPUT$(4,#1)
chunk_length%=CVL(INPUT$(4,#1))
SELECT chunk_name$
CASE "BMHD"
flags&=BSET(flags&,0)
width&=CVI(INPUT$(2,#1))
height&=CVI(INPUT$(2,#1))
x&=CVI(INPUT$(2,#1))
y&=CVI(INPUT$(2,#1))
n_planes&=ASC(INPUT$(1,#1))
masking&=ASC(INPUT$(1,#1))
compression&=ASC(INPUT$(1,#1))
pad&=ASC(INPUT$(1,#1))
transparent_color&=CVI(INPUT$(2,#1))
x_aspect&=ASC(INPUT$(1,#1))
y_aspect&=ASC(INPUT$(1,#1))
page_width&=CVI(INPUT$(2,#1))
page_height&=CVI(INPUT$(2,#1))
IF page_width&=0
SELECT width&
CASE 1 TO 320
page_width&=320
CASE 321 TO 640
page_width&=640
DEFAULT
page_width&=width&
ENDSELECT
ENDIF
IF page_height&=0
SELECT height&
CASE 1 TO 256
page_height&=256
CASE 257 TO 512
page_height&=512
DEFAULT
page_height&=height&
ENDSELECT
ENDIF
CASE "BODY"
flags&=BSET(flags&,1)
body%=AllocMem(chunk_length%,&H10001) ! Public, Clear
IF body%
body_length%=chunk_length%
BGET #1,body%,body_length%
ELSE
ALERT 1,"Pas de mémoire pour|charger le BODY",3,"Zob",dummy&
END
ENDIF
CASE "CAMG"
flags&=BSET(flags&,2)
view_modes%=CVL(INPUT$(4,#1))
CASE "CMAP"
flags&=BSET(flags&,3)
nb_coul&=DIV(chunk_length%,3)
DIM coul&(nb_coul&)
FOR i&=0 TO PRED(nb_coul&)
coul&(i&)=SHL(ASC(INPUT$(1,#1)),4) OR ASC(INPUT$(1,#1)) OR SHR(ASC(INPUT$(1,#1)),4)
NEXT i&
DEFAULT
RELSEEK #1,chunk_length% ! Ignore le chunk
ENDSELECT
IF ODD(chunk_length%) ! Si longueur impaire
RELSEEK #1,1
ENDIF
WEND
CLOSE #1
' Il faut au moins le BMHD, le CAMG et le BODY pour décompacter l'image
IF flags& AND &X111
OPENS 1,0,0,page_width&,page_height&+11,n_planes&,view_modes%
OPENW #1,0,0,page_width&,page_height&+11,0,&H21D00
~SetWindowTitles(WINDOW(1),0,0)
IF flags& AND &X1000
~LoadRGB4(ViewPortAddress(WINDOW(1)),VARPTR(coul&(0)),nb_coul&)
ELSE
ALERT 1,"Pas de ColorMap",1,"Ah bon ?",dummy&
ENDIF
src%=body%
rastport%=SCREEN(1)+84
bitmap%=LONG{rastport%+4}
DIM bitplane%(n_planes&-1,height&-1)
longueur_ligne&=@row_bytes(page_width&)
FOR i&=0 TO PRED(n_planes&)
FOR j&=0 TO PRED(height&)
bitplane%(i&,j&)=LONG{bitmap%+8+(i&*4)}+((j&+11)*longueur_ligne&)
NEXT j&
NEXT i&
IF compression&
longueur_ligne&=@row_bytes(width&)
FOR ligne&=0 TO PRED(height&)
FOR plan&=0 TO PRED(n_planes&)
dest%=bitplane%(plan&,ligne&)
ll&=longueur_ligne&
WHILE ll&>0
n&=PEEK(src%) ! Octet de contrôle
INC src%
IF n&<128 ! suivi de (n+1) octets de données
INC n&
SUB ll&,n&
BMOVE src%,dest%,n&
ADD src%,n&
ADD dest%,n&
ELSE IF n&<>128 ! répète l'octet suivant (-n)+1 fois
n&=256-n&+1
SUB ll&,n&
a&=PEEK(src%)
INC src%
DO
POKE dest%,a&
INC dest%
DEC n&
LOOP WHILE n&>0
ENDIF
WEND
NEXT plan&
NEXT ligne&
ELSE
' image non compressée
size%=@row_bytes(width&)
FOR ligne&=0 TO PRED(height&)
FOR plan&=0 TO PRED(n_planes&)
BMOVE src%,bitplane%(plan&,ligne&),size%
ADD src%,size%
NEXT plan&
NEXT ligne&
ENDIF
'
fvsprite&=0
fichier_bob$=image_iff$+".BOB"
IF width&<=16
ALERT 1,"Créer un Bob ou un Sprite ?",1,"Bob|Sprite",r&
IF r&=1
fvsprite&=1
fichier_bob$=image_iff$+".SPRITE"
ENDIF
ENDIF
OPEN "o",#2,fichier_bob$
PRINT #2,MKL$(0); ! ColorSet
PRINT #2,MKL$(0); ! DataSet
PRINT #2,MKI$(n_planes&); ! Profondeur
PRINT #2,MKI$(width&); ! Largeur
PRINT #2,MKI$(height&); ! Hauteur
PRINT #2,MKI$(fvsprite&+24); ! Flags : SAVEBACK + OVERLAY + fvsprite
PRINT #2,MKI$(2^n_planes&-1); ! PlanePick
PRINT #2,MKI$(0); ! PlaneOnOff
FOR plan&=0 TO PRED(n_planes&) ! Plans de bits
FOR ligne&=0 TO PRED(height&)
BPUT #2,bitplane%(plan&,ligne&),@row_bytes(width&)
NEXT ligne&
NEXT plan&
IF fvsprite&
PRINT #2,MKI$(coul&(1));
PRINT #2,MKI$(coul&(2));
PRINT #2,MKI$(coul&(3));
ENDIF
CLOSE #2
'
OPEN "o",#3,image_iff$+".PAL"
BPUT #3,V:coul&(0),nb_coul&*2
CLOSE #3
'
CLOSEW #1
CLOSES 1
ELSE
ALERT 1,image_iff$+"|est incomplet.|Décompactage impossible.",1,"Prout",dummy&
CLOSE #1
ENDIF
IF body%
~FreeMem(body%,body_length%)
CLR body%
ENDIF
ELSE
ALERT 1,image_iff$+"|n'est pas un fichier ILBM",1,"Crotte",dummy&
END
ENDIF
ELSE
ALERT 1,image_iff$+"|n'est pas un fichier IFF",1,"Zut",dummy&
END
ENDIF
ENDIF
EDIT
'
FUNCTION row_bytes(row_pixels&)
RETURN SHL(SHR(ADD(row_pixels&,15),4),1)
ENDFUNC
'
PROCEDURE broken
CLOSEW #1
CLOSES 1
IF body%
~FreeMem(body%,body_length%)
ENDIF
EDIT
RETURN
|
|