#include "functions.h"
#include "exec/exec.h"
#include "intuition/intuition.h"
#include "intuition/intuitionbase.h"
#include "graphics/gfx.h"
#include "graphics/gfxbase.h"
#include "graphics/gfxmacros.h"
#include "exec/execbase.h"
#include "exec/libraries.h"
#include "libraries/dosextens.h"


#define FARBREQ  0  /* Requester */
#define FABBRUCH 0  /* Gadget */
#define FOK 	  1  /* Gadget */
#define F4		  2  /* Gadget */
#define F3		  3  /* Gadget */
#define F2		  4  /* Gadget */
#define F1		  5  /* Gadget */
#define BLAUSLID 6  /* Gadget */
#define GRUNSLID 7  /* Gadget */
#define ROTSLID  8  /* Gadget */
#define FUNDO	  9  /* Gadget */

struct NewWindow NW =
  {
  219,66,209,137,0,1,GADGETDOWN|GADGETUP,
  WINDOWDRAG|WINDOWDEPTH|ACTIVATE|GIMMEZEROZERO|NOCAREREFRESH,
  NULL,NULL,"R.C.T. Demorequest",NULL,NULL,1,1,640,245,WBENCHSCREEN
  };

struct TextAttr farbdemotxtattr[] = {
/* 0 */{(UBYTE *)"topaz.font",8,0,65},
/* 1 */{(UBYTE *)"topaz.font",8,0,65},
/* 2 */{(UBYTE *)"topaz.font",8,0,65},
/* 3 */{(UBYTE *)"topaz.font",8,0,65},
/* 4 */{(UBYTE *)"topaz.font",8,0,65},
/* 5 */{(UBYTE *)"topaz.font",8,0,65},
/* 6 */{(UBYTE *)"topaz.font",8,0,65},
/* 7 */{(UBYTE *)"topaz.font",8,0,65},
/* 8 */{(UBYTE *)"topaz.font",8,0,65},
/* 9 */{(UBYTE *)"topaz.font",8,0,65},
  };

struct IntuiText farbdemointtxt[] = {
/* 0 */{0,0,0,16,6,(struct TextAttr *)&farbdemotxtattr[0],(UBYTE *)"Abbruch",(struct IntuiText *)0L},
/* 1 */{0,0,0,36,6,(struct TextAttr *)&farbdemotxtattr[1],(UBYTE *)"OK",(struct IntuiText *)0L},
/* 2 */{1,0,1,8,3,(struct TextAttr *)&farbdemotxtattr[2],(UBYTE *)"",(struct IntuiText *)0L},
/* 3 */{1,0,1,8,3,(struct TextAttr *)&farbdemotxtattr[3],(UBYTE *)"",(struct IntuiText *)0L},
/* 4 */{1,0,1,8,3,(struct TextAttr *)&farbdemotxtattr[4],(UBYTE *)"",(struct IntuiText *)0L},
/* 5 */{1,0,1,8,3,(struct TextAttr *)&farbdemotxtattr[5],(UBYTE *)"",(struct IntuiText *)0L},
/* 6 */{0,0,0,1,-9,(struct TextAttr *)&farbdemotxtattr[6],(UBYTE *)"B",(struct IntuiText *)0L},
/* 7 */{0,0,0,1,-9,(struct TextAttr *)&farbdemotxtattr[7],(UBYTE *)"G",(struct IntuiText *)0L},
/* 8 */{0,0,0,1,-9,(struct TextAttr *)&farbdemotxtattr[8],(UBYTE *)"R",(struct IntuiText *)0L},
/* 9 */{0,0,0,71,1,(struct TextAttr *)&farbdemotxtattr[9],(UBYTE *)"Farben",(struct IntuiText *)0L},
  };

struct PropInfo farbdemopropinf[] = {
/* 0 */{13, 65535, 18735, 0, 4096, 0, 0, 0, 0, 0, 0},
/* 1 */{13, 65535, 24288, 0, 4096, 0, 0, 0, 0, 0, 0},
/* 2 */{13, 65535, 12070, 0, 4096, 0, 0, 0, 0, 0, 0},
  };

SHORT farbdemobrddat[] = {
/* 0 */	2 , 20 , 89 , 20 , 89 ,  2 , 88 , -1 , 88 , -1 , 88 , 19 , -1 , 19 , -1 , -1 , 88 , -1 ,
/* 18 */  2 , 20 , 89 , 20 , 89 ,  2 , 88 , -1 , 88 , -1 , 88 , 19 , -1 , 19 , -1 , -1 , 88 , -1 ,
/* 36 */ -1 , -1 , 88 , -1 , 88 , 14 , -1 , 14 , -1 ,  0 ,
/* 46 */ -1 , -1 , 88 , -1 , 88 , 14 , -1 , 14 , -1 ,  0 ,
/* 56 */ -1 , -1 , 88 , -1 , 88 , 14 , -1 , 14 , -1 ,  0 ,
/* 66 */  1 , 11 ,191 , 11 ,191 ,  1 ,190 , -1 ,190 , -1 ,190 , 10 , -1 , 10 , -1 , -1 ,189 , -1 ,
/* 84 */  0 ,	0 ,144 ,  0 ,144 ,-64 ,140 ,-66 ,143 ,-66 ,143 , -1 , -2 , -1 , -2 ,-66 ,142 ,-66 ,
/* 102 */  0 ,  0 ,	9 ,  0 ,  9 ,-64 ,  9 ,-64 ,	8 ,-66 ,  8 , -1 , -2 , -1 , -2 ,-66 ,  8 ,-66 ,
/* 120 */  0 ,  0 ,	9 ,  0 ,  9 ,-64 ,  9 ,-64 ,	8 ,-66 ,  8 , -1 , -2 , -1 , -2 ,-66 ,  8 ,-66 ,
/* 138 */  0 ,  0 ,	9 ,  0 ,  9 ,-64 ,  9 ,-64 ,	8 ,-66 ,  8 , -1 , -2 , -1 , -2 ,-66 ,  8 ,-66 ,
  };

struct Border farbdemobrd[] = {
/* 0 */{0, 0, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[0], (struct Border *)0L},
/* 1 */{0, 0, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[18], (struct Border *)0L},
/* 2 */{0, 16, 0, 9, 0, 5,(SHORT *)&farbdemobrddat[36], (struct Border *)0L},
/* 3 */{0, 21, 0, 9, 0, 5,(SHORT *)&farbdemobrddat[46], (struct Border *)0L},
/* 4 */{0, 10, 0, 9, 0, 5,(SHORT *)&farbdemobrddat[56], (struct Border *)0L},
/* 5 */{0, 0, 0, 0, 1, 9,(SHORT *)&farbdemobrddat[66], (struct Border *)0L},
/* 6 */{52, 93, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[84],(struct Border *)&farbdemobrd[7]},
/* 7 */{37, 93, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[102],(struct Border *)&farbdemobrd[8]},
/* 8 */{7, 93, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[120],(struct Border *)&farbdemobrd[9]},
/* 9 */{22, 93, 0, 0, 0, 9,(SHORT *)&farbdemobrddat[138], (struct Border *)0L},
  };

struct Gadget farbdemogad[] = {
/* 0 */{(struct Gadget *)&farbdemogad[1], 107, 99, 88, 19, 0, 1, 4097, (struct Border *)&farbdemobrd[0], (LONG)0, (struct IntuiText *)&farbdemointtxt[0], (LONG)0, (LONG)0, FABBRUCH, (LONG)71},
/* 1 */{(struct Gadget *)&farbdemogad[2], 6, 99, 88, 19, 0, 1, 4097, (struct Border *)&farbdemobrd[1], (LONG)0, (struct IntuiText *)&farbdemointtxt[1], (LONG)0, (LONG)0, FOK, (LONG)71},
/* 2 */{(struct Gadget *)&farbdemogad[3], 123, 60, 72, 32, 0, 1, 4097, (LONG)0, (LONG)0, (struct IntuiText *)&farbdemointtxt[2], (LONG)0, (LONG)0, F4, (LONG)199},
/* 3 */{(struct Gadget *)&farbdemogad[4], 51, 60, 72, 32, 0, 1, 4097, (LONG)0, (LONG)0, (struct IntuiText *)&farbdemointtxt[3], (LONG)0, (LONG)0, F3, (LONG)135},
/* 4 */{(struct Gadget *)&farbdemogad[5], 123, 28, 72, 32, 0, 1, 4097, (LONG)0, (LONG)0, (struct IntuiText *)&farbdemointtxt[4], (LONG)0, (LONG)0, F2, (LONG)71},
/* 5 */{(struct Gadget *)&farbdemogad[6], 51, 28, 72, 32, 0, 1, 4097, (LONG)0, (LONG)0, (struct IntuiText *)&farbdemointtxt[5], (LONG)0, (LONG)0, F1, (LONG)7},
/* 6 */{(struct Gadget *)&farbdemogad[7], 36, 28, 9, 64, 0, 3, 4099, (struct Border *)&farbdemobrd[2], (LONG)0, (struct IntuiText *)&farbdemointtxt[6], (LONG)0, (struct PropInfo *)&farbdemopropinf[0], BLAUSLID, (LONG)-1},
/* 7 */{(struct Gadget *)&farbdemogad[8], 21, 28, 9, 64, 0, 3, 4099, (struct Border *)&farbdemobrd[3], (LONG)0, (struct IntuiText *)&farbdemointtxt[7], (LONG)0, (struct PropInfo *)&farbdemopropinf[1], GRUNSLID, (LONG)-1},
/* 8 */{(struct Gadget *)&farbdemogad[9], 6, 28, 9, 64, 0, 3, 4099, (struct Border *)&farbdemobrd[4], (LONG)0, (struct IntuiText *)&farbdemointtxt[8], (LONG)0, (struct PropInfo *)&farbdemopropinf[2], ROTSLID, (LONG)-1},
/* 9 */{(struct Gadget *)0L, 5, 5, 190, 10, 3, 1, 4097, (struct Border *)&farbdemobrd[5], (LONG)0, (struct IntuiText *)&farbdemointtxt[9], (LONG)0, (LONG)0, FUNDO, (LONG)71},
  };


struct Requester farbreq;

struct IntuitionBase *IntuitionBase;
struct GfXBase *GfxBase;
APTR base;
struct Window *wind;
struct Requester *req;
struct RastPort *ak_rp;
struct Screen *activscreen;
USHORT col[4],col1[4],aktfarbe = 0;
SHORT pattern[] = {0xFFFF,0xFFFF};


main()
{
SHORT ok = 1;
ULONG Class;
struct Gadget *Adress;
struct IntuiMessage *mess;
USHORT id,i,rotpot,grunpot,blaupot;

if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0)))
  cleanexit("Kann intuition.library nicht öffnen");

if(!(GfxBase = (struct IntuitionBase *)OpenLibrary("graphics.library",0)))
  cleanexit("Kann graphics.library nicht öffnen");

activscreen = (struct Screen *)IntuitionBase->ActiveScreen;

if(wind = OpenWindow(&NW))
  {
  if(req = farbreqstart())
	 {
	 for(i = 0; i < 4;i++)
		col[i] = GetRGB4((&(activscreen->ViewPort))->ColorMap,i);

	 ak_rp = (struct RastPort *)req->ReqLayer->rp;
	 SetDrMd(ak_rp,0);
	 SetAfPt(ak_rp,&pattern[0],1);
	 for(i = 0; i < 4; i++)
		{
		Adress = (struct Gadget *)&farbdemogad[i+2];
		SetAPen(ak_rp,3-i);
		RectFill(ak_rp,Adress->LeftEdge,Adress->TopEdge,Adress->LeftEdge + Adress->Width-1,Adress->TopEdge + Adress->Height-1);
		}
	 SetDrMd(ak_rp,2);
	 drawbox(0);

	 while(ok)
		{
		while(mess = (struct IntuiMessage *)GetMsg(wind->UserPort))
		  {
		  Class = mess->Class;
		  Adress = mess->IAddress;
		  ReplyMsg(mess);

		  switch(Class)
			 {
			 case GADGETDOWN:
			 case GADGETUP:
				id = Adress->GadgetID;
				switch(id)
				  {
				  case FABBRUCH:
				  case FOK:
					 if(id == FABBRUCH)
						{
						for(i = 0; i < 4; i++)
						  SetRGB4(&(activscreen->ViewPort),i,((col[i]>>8) & 15),((col[i]>>4) & 15) ,(col[i] & 15));
						}
					 ok = 0;
					 break;
				  case FUNDO:
					 for(i = 0; i < 4; i++)
						SetRGB4(&(activscreen->ViewPort),i,((col[i]>>8) & 15),((col[i]>>4) & 15) ,(col[i] & 15));
					 drawbox(aktfarbe);
					 drawbox(aktfarbe);
					 break;
				  case ROTSLID:
				  case GRUNSLID:
				  case BLAUSLID:
					 rotpot = farbdemopropinf[2].VertPot / 4369;
					 grunpot = farbdemopropinf[1].VertPot / 4369;
					 blaupot = farbdemopropinf[0].VertPot / 4369;
					 SetRGB4(&(activscreen->ViewPort),aktfarbe,rotpot,grunpot,blaupot);
					 break;
				  case F1:
				  case F2:
				  case F3:
				  case F4:
					 drawbox(aktfarbe);
					 drawbox(5-id);
					 break;
				  }
				}
			 break;
		  }
		}
	 }
  else
	 cleanexit("Kann Requester nicht anzeigen");
  }
else
  cleanexit("Kann Window nicht öffnen");
cleanexit("");
}

drawbox(x)
SHORT x;
{
register SHORT i;
struct Gadget *cgag;

for(i = 0; i < 4; i++)
  col1[i] = GetRGB4((&(activscreen->ViewPort))->ColorMap,i);
aktfarbe = x;

cgag = &farbdemogad[5-x];

box(cgag->LeftEdge+1,cgag->TopEdge+1,cgag->LeftEdge+cgag->Width-2,cgag->TopEdge+cgag->Height-2);
box(cgag->LeftEdge+2,cgag->TopEdge+2,cgag->LeftEdge+cgag->Width-3,cgag->TopEdge+cgag->Height-3);

farbdemopropinf[0].VertPot = (col1[x] & 15) * 4369;
farbdemopropinf[1].VertPot = ((col1[x]>>4) & 15) * 4369;
farbdemopropinf[2].VertPot = ((col1[x]>>8) & 15) * 4369;

RefreshGList(&farbdemogad[6],wind,req,3);
}

box(x,y,x1,y1)
register SHORT x,y,x1,y1;
{
Move(ak_rp,x,y);
Draw(ak_rp,x1,y);
Draw(ak_rp,x1,y1);
Draw(ak_rp,x,y1);
Draw(ak_rp,x,y +1);
}

cleanexit(error)
UBYTE *error;
{

if(*error)
  printf("%s\n",error);

if(wind)
  {
  if(req)
	 EndRequest(req,wind);
  CloseWindow(wind);
  }

if(IntuitionBase)
  CloseLibrary(IntuitionBase);

if(GfxBase)
  CloseLibrary(GfxBase);

exit(0);
}


farbreqstart()
{
InitRequester(&farbreq);
farbreq.LeftEdge = 0;
farbreq.TopEdge = 0;
farbreq.Width = 201;
farbreq.Height = 124;
farbreq.BackFill = 1;
farbreq.Flags = 0;
farbreq.ReqGadget = &farbdemogad[0];
farbreq.ReqBorder = &farbdemobrd[6];
farbreq.ReqText = 0L;
if( Request( &farbreq,wind))
  return(&farbreq);
return(0);
}


