home *** CD-ROM | disk | FTP | other *** search
- /*
-
- 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;
- }
- }
-
-
-