#include <functions.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <exec/memory.h>

#define SCREEN IntuitionBase->ActiveScreen
#define BITMAP (&SCREEN->BitMap)
#define PLANESIZE ((long)((BITMAP->BytesPerRow)*(BITMAP->Rows)))
#define NOT_ENOUGH_CHIP -1000
#define USER_DEPTH (*argv[1])

struct IntuitionBase *IntuitionBase;
void *GfxBase;

long AtoB(i)
register unsigned i;
{
      if((i-=48)>15) i-=7;
      if(i>15) i-=32;
      return(((long)(i)));
}

main(argc,argv)
int argc;
char *argv[];
{
   register UBYTE i;
   register long red, green, blue, color=0;

   if(argc<3) {
      printf("Usage: %s <depth> <color> [<color> ...]\n",argv[0]);
      exit(FALSE);
   }

   if(!(IntuitionBase=(struct IntuitionBase *)
         OpenLibrary("intuition.library",0L))) exit(FALSE);
   if(!(GfxBase=OpenLibrary("graphics.library",0L)))
      { CloseLibrary(IntuitionBase); exit(FALSE); }

   if((USER_DEPTH-=48)>4 || USER_DEPTH==0) exit(puts("Wrong depth !"));

   if(BITMAP->Depth<USER_DEPTH)
      for(i=(BITMAP->Depth);i<USER_DEPTH;i++) 
         if(!(BITMAP->Planes[i]=(PLANEPTR)
               AllocMem(PLANESIZE,MEMF_CHIP | MEMF_CLEAR)))
            exit(NOT_ENOUGH_CHIP);

   while(BITMAP->Depth>USER_DEPTH)
      FreeMem((char *)BITMAP->Planes[--BITMAP->Depth],PLANESIZE);

   BITMAP->Depth=USER_DEPTH;

   for(i=2;i<argc;i++) {
      while(*argv[i]) {
         red=AtoB(*argv[i]++);
         green=AtoB(*argv[i]++);
         blue=AtoB(*argv[i]++);

         SetRGB4(&SCREEN->ViewPort,color,red,green,blue);
         color++;
      }
   }
   RemakeDisplay();
   CloseLibrary(GfxBase);
   CloseLibrary(IntuitionBase);
}
