/**************************************************/
/* demo.c v1.0 											  */
/* 															  */
/* Jürgen Haage  Burgstraße 30						  */
/* 6552 Bad Münster a. St. Ebernburg 2 			  */
/**************************************************/
#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 RctBase   /* Lib Base */
  {
  struct Library Library;
  BPTR	SegList;
  struct ExecBase *SysBase;
  struct IntuitionBase *IntuiTionBase;
  struct DosBase *DosBase;
  struct GfxBase *GfxBase;
  };

struct RctBase *RctBase; /* Lib Base Pointer */
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],gadsize[16],aktfarbe = 0;

main()
{
BYTE *name;
SHORT ok = 1;
ULONG Class;
USHORT id,i,rotpot,grunpot,blaupot;

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

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(base = rctload("df0:demos/farbdemo.rct"))
	 {
	 if(req = (struct Requester *)rctaddr(base,0,FARBREQ))
		{
		if(wind = reqdrawwindow(base,req,0,"R.C.T. Demorequest"))
		  {
		  ak_rp = (struct RastPort *)req->ReqLayer->rp;
		  for(i = 0; i < 4;i++)
			 gadsize[i] = getgadstruct(base,req,F1,i+2);
		  for(i = 4; i < 8;i++)
			 gadsize[i] = getgadstruct(base,req,F2,(i-4)+2);
		  for(i = 8; i < 12;i++)
			 gadsize[i] = getgadstruct(base,req,F3,(i-8)+2);
		  for(i = 12; i < 16;i++)
			 gadsize[i] = getgadstruct(base,req,F4,(i-12)+2);
		  for(i = 0; i < 4;i++)
			 col[i] = GetRGB4((&(activscreen->ViewPort))->ColorMap,i);
		  SetDrMd(ak_rp,2);
		  drawbox(0);

		  while(ok)
			 {
			 id = reqwait(base,req,&Class);
			 switch(Class)
				{
				case GADGETDOWN:
				case GADGETUP:
				  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 = getpropgadstruct(base,req,ROTSLID,3);
						grunpot = getpropgadstruct(base,req,GRUNSLID,3);
						blaupot = getpropgadstruct(base,req,BLAUSLID,3);
						SetRGB4(&(activscreen->ViewPort),aktfarbe,(rotpot/4369),(grunpot/4369),(blaupot / 4369));
						break;
					 case F1:
					 case F2:
					 case F3:
					 case F4:
						drawbox(aktfarbe);
						drawbox(5-id);
					  break;
					 }
				  break;
				}
			 }
		  }
		else
		  cleanexit("Kann Requester nicht anzeigen");
		}
	 }
  else
	 cleanexit("Finde die .RCT-Datei nicht");
cleanexit("");
}

drawbox(x)
SHORT x;
{
register SHORT i;

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

box(gadsize[x*4]+1,gadsize[(x*4)+1]+1,(gadsize[x*4]+gadsize[(x*4)+2])-2,(gadsize[(x*4)+1]+gadsize[(x*4)+3])-2);
box(gadsize[x*4]+3,gadsize[(x*4)+1]+2,(gadsize[x*4]+gadsize[(x*4)+2])-4,(gadsize[(x*4)+1]+gadsize[(x*4)+3])-3);

setpropgadstruct(base,req,ROTSLID,3,((col1[x]>>8) & 15) * 4369);
setpropgadstruct(base,req,GRUNSLID,3,((col1[x]>>4) & 15) * 4369);
setpropgadstruct(base,req,BLAUSLID,3,(col1[x] & 15) * 4369);

redrawgad(base,req,BLAUSLID,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)
  reqend(base,req,wind);

if(base)
  rctfree(base);

if(IntuitionBase)
  CloseLibrary(IntuitionBase);

if(GfxBase)
  CloseLibrary(GfxBase);

if(RctBase)
  CloseLibrary(RctBase);

exit(0);
}
