#include <exec/types.h>
#include <pragma/all_lib.h>
#include <exec/memory.h>

#include <WMap.h>



void Unpack(ULONG UnPAddr, ULONG PAddr, ULONG Laenge)

{
ULONG  UnPackedD,PackedD,Ende;
UBYTE *Anz,*Inh,*Dest;
WORD   i;


UnPackedD=UnPAddr;
PackedD=PAddr;
Ende=UnPackedD+Laenge;
do {
   Anz=(UBYTE*)PackedD;   PackedD++;
   if (*Anz>127)
      {
      *Anz=*Anz-127;
      CopyMem((APTR)PackedD,(APTR)UnPackedD,*Anz);
      PackedD=PackedD+*Anz;
      UnPackedD=UnPackedD+*Anz;
      }
   else 
      {
      Inh=(UBYTE*)PackedD;        PackedD++;
      if (UnPackedD+*Anz>=Ende) *Anz=Ende-UnPackedD-1;
      for (i=1; i<=*Anz; i++)
         {
         Dest=(UBYTE*)UnPackedD; UnPackedD++;
         *Dest=*Inh;
         }
      }
   }
while ((UnPackedD<PackedD) && (UnPackedD<Ende) && (PackedD<Ende));
}



BOOL SETCOLORS(char *CPath, UWORD CNum, ViewPort *MyViewPort)

{
struct r_RGB
   {
   UBYTE r,g,b
   };
r_RGB     *RGB;

WORD       i;
BPTR       CFHandle=NULL;
ULONG      CMapSize;
APTR       CMemA;

CMapSize=(ULONG)(CNum*3);
if (!(CMemA=AllocVec(CMapSize,MEMF_FAST+MEMF_CLEAR))) return FALSE;
if ((CFHandle=Open(CPath,MODE_OLDFILE)))
   {
   Seek(CFHandle,8,OFFSET_BEGINNING);
   Read(CFHandle,CMemA,CMapSize);
   Close(CFHandle);
   for (i=0; i<=255; i++)
      {
      RGB=(r_RGB*)((ULONG)(CMemA)+i*3);
      SetRGB32(MyViewPort,i,(RGB->r)*0x1000000,(RGB->g)*0x1000000,(RGB->b)*0x1000000);
      }
   }
else return FALSE;
if (CMemA) FreeVec(CMemA);
CMemA=NULL;
}



BOOL DRAWPICTURE(char *PPath, WORD CNum, RastPort *MyRastPort, WORD PWidth, WORD PHeight, WORD PLeft, WORD PTop)

{
ULONG PicSize,RawPicSize;
APTR  PMemA=NULL;
BPTR  FHandle;
Image PicImg={0,0,0,0,0,NULL,0,0,NULL};

RawPicSize=PWidth*PHeight/8;
if (CNum==256)
   {
   RawPicSize=RawPicSize*8;
   PicImg.Depth=8;
   }
else if (CNum==128)
   {
   RawPicSize=RawPicSize*7;
   PicImg.Depth=7;
   }
else if (CNum==64)
   {
   RawPicSize=RawPicSize*6;
   PicImg.Depth=6;
   }
else if (CNum==32)
   {
   RawPicSize=RawPicSize*5;
   PicImg.Depth=5;
   }
else if (CNum==16)
   {
   RawPicSize=RawPicSize*4;
   PicImg.Depth=4;
   }
else if (CNum==8)
   {
   RawPicSize=RawPicSize*3;
   PicImg.Depth=3;
   }
else if (CNum==4)
   {
   RawPicSize=RawPicSize*2;
   PicImg.Depth=2;
   }
else if (CNum==2)
   {
   RawPicSize=RawPicSize*1;
   PicImg.Depth=1;
   }
if (!(PMemA=AllocVec(RawPicSize+256,MEMF_CHIP))) return FALSE;
if ((FHandle=Open(PPath,MODE_OLDFILE))) 
   {
   PicSize=Seek(FHandle,0,OFFSET_END);
   PicSize=Seek(FHandle,0,OFFSET_BEGINNING);
   if (PicSize==RawPicSize) Read(FHandle,PMemA,PicSize)
   else
     {
     Read(FHandle,(APTR)((LONG)PMemA+(RawPicSize+256-PicSize)),PicSize);
     Unpack((ULONG)PMemA,(LONG)PMemA+(RawPicSize+256-PicSize),RawPicSize+256);
     }
   Close(FHandle);
   }
else return FALSE;
PicImg.Width=PWidth;
PicImg.Height=PHeight;
PicImg.ImageData=(UWORD*)PMemA;
PicImg.PlanePick=CNum-1;
DrawImage(MyRastPort,&PicImg,PLeft,PTop);
FreeVec(PMemA);
}



void WRITE(WORD LEdge, WORD TEdge, WORD Color, WORD Flags, RastPort *MyRastPort, TextAttr *MyTA, char *Txt)

{
IntuiText MyIntuiText={0,0,0,LEdge,TEdge,MyTA,(UBYTE*)Txt,NULL};


if (Flags<=WRITE_CENTER)
   {
   MyIntuiText.FrontPen=Color;
   MyIntuiText.LeftEdge=LEdge;
   MyIntuiText.TopEdge=TEdge;
   MyIntuiText.IText=(UBYTE*)Txt;
   }
if (Flags==WRITE_CENTER) MyIntuiText.LeftEdge=LEdge-IntuiTextLength(&MyIntuiText)/2;
PrintIText(MyRastPort,&MyIntuiText,0,0);
}
