home *** CD-ROM | disk | FTP | other *** search
- #include <WM.h>
- #include <MyStructs.h>
- #include <Image.h>
-
- extern SHORT gheight,gwidth;
-
- USHORT ReadIFF(UBYTE mod,UBYTE Imod,UBYTE *string)
- {
- UBYTE *wohin,*woher;
- USHORT ERR,BMHDFlag;
- if(suffix==1)
- {
- suffix=0;
- Change=0;
- }
- ERR=FileRequester(string,94);
- Datei=NULL;
- zeiger=NULL;
- ScreenToFront(WMsc);
- if(ERR == 1) return(1);
- if(ERR==2) return(4);
- Gwin=IntuitionBase->ActiveWindow;
- SetPointer(Gwin,Wecker,20,15,0,0);
- if(!(Datei=Open(FileName,MODE_OLDFILE))) return(3);
- write=Seek(Datei,NULL,OFFSET_END);
- if(write==-1) return(3);
- write=Seek(Datei,NULL,OFFSET_BEGINNING);
- if(write==-1) return(3);
- write-=12;
- CMAPFlag=FALSE;
- CAMGFlag=FALSE;
- BODYFlag=FALSE;
- BMHDFlag=FALSE;
- if(!(zeiger=(UBYTE*)AllocMem(write+1,MEMF_CLEAR|MEMF_PUBLIC)))
- return(1);
-
- /* auf 'FORM' testen */
-
- if(!(read=Read(Datei,Buffer,8))) return(3); /* DISK-ERROR */
- if(strncmp(Buffer,"FORM",4)) return(2); /* kein IFF */
-
- /* auf 'ILBM' testen */
-
- if(!(read=Read(Datei,Buffer,4))) return(3); /* DISK-ERROR */
- if(strncmp(Buffer,"ILBM",4)) return(2); /* kein ILBM */
-
- /* Daten einlesen und Werte retten */
-
- if(!(read=Read(Datei,zeiger,write))) return(3);
- Close(Datei);
- Datei=NULL;
- woher=zeiger;
- Planes=(woher+read);
-
- /* weitere Chunks überlesen, bis 'CMAP ', 'CAMG' oder 'BODY'-Chunk kommt */
-
- ok=TRUE;
- while(ok)
- {
- if(strncmp(woher,"BMHD",4)==0)
- {
- wohin=(UBYTE*)&BMHD;
- woher+=8;
- for(i=0; i<20; i++)
- *(wohin++)=*woher++;
- BMHDFlag=TRUE;
- }
- else if(strncmp(woher,"CMAP",4)==0)
- {
- woher+=8;
- BType=*(woher-1);
- wohin=(UBYTE *)&CMAPColors;
- for(i=0; i<BType; i++)
- *(wohin++)=*woher++;
- CMAPFlag=TRUE;
- }
- else if(strncmp(woher,"CAMG",4)==0)
- {
- woher+=8;
- wohin=(UBYTE *)&CAMG;
- for(i=0; i<4; i++)
- *(wohin++)=*woher++;
- CAMGFlag=TRUE;
- }
- else if(strncmp(woher,"BODY",4)==0)
- {
- woher+=8;
- ok=FALSE;
- BODYFlag=TRUE;
- }
- else
- {
- if(woher != Planes) woher++;
- else ok=FALSE;
- }
- }
-
- if(!BMHDFlag)
- {
- Ready1();
- Error(31,0,1);
- return(0);
- }
- /* BODY-Chunk nicht gefunden */
-
- if(!BODYFlag)
- {
- Ready1();
- Error(26,0,1);
- return(0);
- }
-
- /* Leseroutine abbrechen wenn nur CMAP-Chunk gebraucht wird */
-
- if(mod)
- {
- Ready1();
- return(0);
- }
-
- /* Speicher für Grafik reservieren */
-
- Iffx=((BMHD.Width+15) >> 4) << 1; /* Bytes pro Reihe */
- IffPSize=Iffx * BMHD.Height; /* Größe je Plane */
- IffSize=IffPSize*BMHD.BitPlanes; /* Gesamtgröße der Grafik */
- if(!(helpI=(struct MyImage *)AllocMem(sizeof(struct MyImage),
- MEMF_CLEAR|MEMF_PUBLIC)))
- return(3);
- if(!(helpI->ImageData=(USHORT*)AllocMem(IffSize+10,
- MEMF_CLEAR|MEMF_CHIP)))
- {
- FreeMem(helpI,sizeof(struct MyImage));
- return(3); /* nicht genug Speicher */
- }
-
- /* Grafik einlesen */
-
- depth=BMHD.BitPlanes;
- if(BMHD.Masking & 1) depth++;
- for(y=0; y < BMHD.Height; y++)
- {
- Iffy=y*Iffx;
- for(Iffb=0; Iffb < depth; Iffb++)
- {
- size=0;
- wert=0;
- Iff=Iffb*IffPSize;
- if(Iffb < BMHD.BitPlanes)
- {
- wert=1;
- wohin=(UBYTE*)helpI->ImageData+Iff+Iffy;
- }
- if(BMHD.Compression == 0)
- {
- while(size++ < Iffx)
- {
- if(wert) *wohin++ = *woher;
- woher++;
- }
- }
- if(BMHD.Compression == 1)
- {
- while(size < Iffx)
- {
- CodeSize=*woher++;
- if(CodeSize < 128)
- {
- for(i=0; i<CodeSize+1; i++)
- {
- if(wert)
- *wohin++ = *woher;
- woher++;
- size++;
- }
- }
- if(CodeSize > 128)
- {
- BType=*woher++;
- for(i=0; i<257-CodeSize; i++)
- {
- if(wert)
- *wohin++ = BType;
- size++;
- }
- }
- }
- }
- }
- }
- FreeMem(zeiger,write+1);
- zeiger=NULL;
- helpI->Width=BMHD.Width;
- helpI->Height=BMHD.Height;
- helpI->Depth=BMHD.BitPlanes;
- if(helpI->Depth > sc->BitMap.Depth)
- helpI->Depth = sc->BitMap.Depth;
- helpI->PlanePick=PWert[helpI->Depth-1];
- helpI->Size=IffSize;
- switch(Imod)
- {
- case 0: if((agad->GadgetType & 3)==3) agad->PropImage=helpI;
- else agad->GadgetImage=helpI;
- agad->Image=1;
- break;
- case 1: if((agad->GadgetType & 3)==3) agad->PSImage=helpI;
- else agad->SelectImage=helpI;
- agad->Image=1;
- break;
- case 2: aitem->ItemImage=helpI;
- break;
- case 3: aitem->SelectImage=helpI;
- break;
- case 4: asub->ItemImage=helpI;
- break;
- case 5: asub->SelectImage=helpI;
- break;
- case 6: awin->CheckMark=helpI;
- break;
- case 7: areq->ReqImage=helpI;
- break;
- }
- MakeImage();
- Ready1();
- return(0);
- }
- VOID Ready1()
- {
- ClearPointer(Gwin);
- }
- VOID SetIMDefines(UBYTE Imode)
- {
- status=0;
- helpI=NULL;
- ILoad.Flags=NULL;
- switch(Imode)
- {
- case 0: if((agad->GadgetType & 3)==3) helpI=agad->PropImage;
- else helpI=agad->GadgetImage;
- break;
- case 1: if((agad->GadgetType & 3)==3) helpI=agad->PSImage;
- else helpI=agad->SelectImage;
- break;
- case 2: helpI=aitem->ItemImage;
- break;
- case 3: helpI=aitem->SelectImage;
- break;
- case 4: helpI=asub->ItemImage;
- break;
- case 5: helpI=asub->SelectImage;
- break;
- case 6: helpI=awin->CheckMark;
- break;
- case 7: helpI=areq->ReqImage;
- break;
- }
- if(helpI != NULL)
- {
- left=helpI->LeftEdge;
- top=helpI->TopEdge;
- Ipick=helpI->PlanePick;
- Ionoff=helpI->PlaneOnOff;
- if(helpI->Size) ILoad.Flags=GADGDISABLED;
- status=1;
- }
- if(Imode==0 && (agad->GadgetType & 3)==1 && helpI==NULL)
- {
- helpI=(struct MyImage *)AllocMem(sizeof(struct MyImage),
- MEMF_CLEAR|MEMF_PUBLIC);
- helpI->LeftEdge=0;
- helpI->TopEdge=0;
- helpI->Width=agad->Width;
- helpI->Height=agad->Height;
- helpI->Depth=0;
- helpI->ImageData=NULL;
- helpI->PlanePick=Ipick;
- helpI->PlaneOnOff=Ionoff;
- helpI->Size=0;
- agad->GadgetImage=helpI;
- agad->Image=1;
- status=0;
- }
- if(helpI==NULL)
- {
- left=0;
- top=0;
- Ipick=PWert[sc->RastPort.BitMap->Depth-1];
- Ionoff=0;
- }
- sprintf(LEFTBuff,"%d",left);
- sprintf(TOPBuff,"%d",top);
- j=1;
- for(i=5; i>0; i--)
- {
- Pick[i].Flags=NULL;
- OnOff[i].Flags=NULL;
- if(Ipick & j) Pick[i].Flags=SELECTED;
- if(Ionoff & j) OnOff[i].Flags=SELECTED;
- j = j << 1;
- }
- }
- USHORT DefImage(UBYTE ImageMode)
- {
- USHORT OKI=1;
- ScreenToFront(WMsc);
- SetIMDefines(ImageMode);
- IMWindow.Screen=WMsc;
- if(IMW())
- {
- Error(0,1,1);
- return(1);
- }
- do
- {
- Wait(1L << Iwin->UserPort->mp_SigBit);
- GetMessage(Iwin);
- switch(class)
- {
- case GADGETUP:
- switch(Id)
- {
- /* ENDE */
- case 0: OKI=0;
- if(helpI != NULL && status==0)
- DelImage(ImageMode);
- break;
- /* O K */
- case 1: if(helpI != NULL)
- {
- helpI->LeftEdge=left;
- helpI->TopEdge=top;
- helpI->PlanePick=Ipick;
- helpI->PlaneOnOff=Ionoff;
- SaveOk=1;
- }
- OKI=2;
- break;
- /* LÖSCHEN */
- case 2: if(helpI != NULL)
- {
- if(Error(35,0,0)==0) break;
- DelImage(ImageMode);
- if(ImageMode < 2 && (agad->GadgetType & 3) != 3)
- {
- if(agad->GadgetImage==NULL && agad->SelectImage==NULL)
- {
- agad->Image=0;
- if(agad->GadgetBorder) agad->Border=1;
- }
- }
- OKI=2;
- }
- else Error(14,0,0);
- break;
- /* Image laden */
- case 3: if(helpI != NULL) DelImage(ImageMode);
- CloseWindow(Iwin);
- err=ReadIFF(0,ImageMode,"IFF-Datei laden !");
- if(Datei) Close(Datei);
- if(zeiger) FreeMem(zeiger,write+1);
- if(err>1 && err < 4) Ready1();
- if(err==3) Error(1,0,1);
- if(err==2) Error(27,0,1);
- if(err==1) Error(0,0,1);
- if(err==0) SetIMDefines(ImageMode);
- IMW();
- break;
- /* Image anpassen */
- case 4: if(helpI != NULL) {
- switch(ImageMode)
- {
- case 0:
- case 1: gheight=helpI->Height;
- gwidth=helpI->Width;
- BType=0;
- abor=agad->GadgetBorder;
- TestBorder();
- BType=1;
- abor=agad->SelectBorder;
- TestBorder();
- agad->Width=helpI->Width;
- if(agad->Flags & GRELWIDTH)
- agad->Width-=awin->Width;
- agad->Height=helpI->Height;
- if(agad->Flags & GRELHEIGHT)
- agad->Height-=awin->Height;
- break;
- case 2:
- case 3:
- case 4:
- case 5: RetteItem(0);
- NewImagePos();
- break;
- case 6: break;
- case 7: awin->Width=helpI->Width;
- awin->Height=helpI->Height;
- Mwidth=helpI->Width;
- Mheight=helpI->Height;
- BType=2;
- abor=areq->ReqBorder;
- TestBorder();
- break;
- } }
- break;
- /* TopEdge */
- case 5: top=TOPInfo.LongInt;
- break;
- /* LeftEdge */
- case 6: left=LEFTInfo.LongInt;
- break;
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12: j=32 >> (Id-7);
- Ipick ^= j;
- break;
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- case 18: j=32 >> (Id-13);
- Ionoff ^= j;
- break;
- default: break;
- } /* switch Id */
- break;
- } /* switch class */
- } while(OKI==1); /* do */
- CloseWindow(Iwin);
- Work();
- ScreenToFront(sc);
- if(OKI==2)
- {
- if(ImageMode < 2 || ImageMode > 6)
- SetNewWin(1);
- }
- Ready();
- return(0);
- }
- USHORT IMW()
- {
- if(!(Iwin=(struct Window *)OpenWindow(&IMWindow))) return(1);
- Irp=Iwin->RPort;
- WinBorder(Iwin);
- return(0);
- }
- VOID NewImagePos()
- {
- left=helpI->LeftEdge;
- top=helpI->TopEdge;
- sprintf(LEFTBuff,"%d",left);
- sprintf(TOPBuff,"%d",top);
- RefreshGList(&IMLeft,Iwin,NULL,2);
- }
- VOID CheckItem()
- {
- helpM=awin->MenuStrip;
- while(helpM)
- {
- aitem=helpM->FirstItem;
- while(aitem)
- {
- MType=1;
- if(aitem->Auto) ItemAuto();
- asub=aitem->Sub;
- MType=2;
- while(asub)
- {
- if(asub->Auto) ItemAuto();
- asub=asub->Next;
- }
- aitem=aitem->Next;
- }
- helpM=helpM->Next;
- }
- }
-
-
-