home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
097.lha
/
Ic.Source
/
lader.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-11-20
|
5KB
|
218 lines
/*
InvaderCraft von J.Hertel
(C) CW-Publikationen
"lader.c"
Kompilieren mit Aztec C Version 3.20a.
Aufruf: cc lader -a
as lader
Linken: siehe invadercraft.c
*/
#include <libraries/dos.h>
#include <graphics/gfx.h>
#include <exec/memory.h>
extern struct GfxBase *GfxBase;
extern long Read();
struct FileHandle *fpointer,*Open();
char *AllocMem(),*buffer;
char *ifferrord[4]={"ist nicht vorhanden!","ist keine IFF-Datei!",
"fehlerhaft!","ist keine Grafik-Datei!"};
struct chunk {
char name[4];
ULONG len;
} form,*chunk;
struct bmhd {
WORD width,height,xpos,ypos;
UBYTE planes,mask,comp,pad;
WORD trans;
BYTE xasp,yasp;
WORD pw,ph;
} *bmhd;
struct cmap {
UBYTE rgb[32][3];
} *cmap;
getiff(name,b,c)
char *name;
struct BitMap *b;
UWORD c[];
/* Laden eines IFF-Bilds von Diskette
name Zeiger auf Dateiname
b Zeiger auf eine uninitialisierte Bitmap-Struktur
c Zeiger auf ein uninitialisiertes Array von UWORDs
Mit dieser Funktion wird eine Bitmap mit den Ausmassen und der Grafik des
IFF-Bilds, oder IFF-Pinsels, bereitgestellt. In das Array c[] werden die
Farben uebertragen (Format wie in Color-Table: 0xrgb). Die Anzahl an UWORDs
muss groesser oder gleich der Anzahl an Farben sein. */
{
ULONG index;
int n,i,j,k,z;
BYTE *body,*plane;
LONG yversatz=0;
if((fpointer=Open(name,MODE_OLDFILE))==0)
iffend(name,0);
if(Read(fpointer,&form,8L)!=8L)
iffend(name,1);
if(cmp("FORM",form.name))
iffend(name,1);
if((buffer=AllocMem(form.len,MEMF_PUBLIC))==0)
iffend(name,-1);
if(Read(fpointer,buffer,form.len)!=form.len)
iffend(name,2);
index=0;
if(cmp("ILBM",buffer+index))
iffend(name,3);
index+=4; chunk=(struct chunk *)(buffer+index);
if(cmp("BMHD",chunk->name))
iffend(name,2);
index+=8; bmhd=(struct bmhd *)(buffer+index);
allocbitmap(b,(long)bmhd->planes,(long)bmhd->width,(long)bmhd->height);
index+=chunk->len; index+=index%2;
chunk=(struct chunk *)(buffer+index);
while(cmp("CMAP",chunk)) {
index+=chunk->len+8; index+=index%2;
chunk=(struct chunk *)(buffer+index);
if(index>form.len-8)
iffend(name,2);
}
index+=8; cmap=(struct cmap *)(buffer+index);
for(i=0;i<chunk->len/3;i++) {
c[i]=(UWORD)cmap->rgb[i][0]<<4|(UWORD)cmap->rgb[i][1]|
(UWORD)cmap->rgb[i][2]>>4;
}
index+=chunk->len; index+=index%2;
chunk=(struct chunk *)(buffer+index);
while(cmp("BODY",chunk)) {
index+=chunk->len+8; index+=index%2;
chunk=(struct chunk *)(buffer+index);
if(index>form.len-8)
iffend(name,2);
}
index+=8; body=buffer+index;
if(chunk->len==0)
iffend(name,2);
if(bmhd->comp) {
/* Dekomprimieren */
for(i=0;i<bmhd->height;i++) {
for(j=0;j<bmhd->planes;j++) {
plane=(BYTE *)b->Planes[j]+yversatz;
z=0;
while(z<b->BytesPerRow) {
n=*body++;
if(n<0) {
for(k=0;k<-n;k++)
*plane++=*body;
*plane++=*body++;
z++;
}
else {
for(k=0;k<n+1;k++)
*plane++=*body++;
}
z+=k;
}
}
yversatz+=b->BytesPerRow;
}
}
else {
/* Unkomprimierte Daten */
for(i=0;i<bmhd->height;i++) {
for(j=0;j<bmhd->planes;j++) {
plane=(BYTE *)b->Planes[j]+yversatz;
for(k=0;k<b->BytesPerRow;k++) {
*plane++=*body++;
}
}
yversatz+=b->BytesPerRow;
}
}
iffend(name,-2);
}
cmp(s1,s2)
char *s1,*s2;
/* Vergleich zweier Chunk-Namen, cmp()==1, wenn ungleich */
{
if(*s1!=*s2 || *(s1+1)!=*(s2+1) || *(s1+2)!=*(s2+2) || *(s1+3)!=*(s2+3))
return(1);
else
return(0);
}
iffend(name,fehler)
char *name;
int fehler;
/* Alles wieder dem System zurueckgeben und evtl. Ausdrucken einer Fehler-
meldung */
{
if(fpointer)
Close(fpointer);
if(buffer) {
FreeMem(buffer,form.len);
buffer=0;
}
if(fehler==-2)
return();
else if(fehler==-1)
closeall(1);
else {
printf("Datei %s %s\n",name,ifferrord[fehler]);
closeall(0);
}
}
allocbitmap(b,t,w,h)
struct BitMap *b;
long t,w,h;
/* Bitmap initialisieren und entsprechend Speicher anfordern
b Zeiger auf uninitialisierte Bitmap-Struktur
t Tiefe (Anzahl an Bitplanes) Anzahl Farben = 2 ^ t
w Breite
h Hoehe */
{
int i;
InitBitMap(b,t,w,h);
for(i=0;i<t;i++) {
if((b->Planes[i]=(PLANEPTR)AllocMem((long)RASSIZE(w,h),
MEMF_CHIP|MEMF_CLEAR))==0)
closeall(1);
}
}
freebitmap(b)
struct BitMap *b;
/* Speicher fuer Bitmap freigeben, b ist Zeiger auf Bitmap-Struktur */
{
int i;
for(i=0;i<b->Depth;i++)
if(b->Planes[i]) {
FreeMem(b->Planes[i],(long)RASSIZE(8L*b->BytesPerRow,
(long)b->Rows));
b->Planes[i]=0;
}
}