#include <exec/types.h>
#include <intuition/gadgetclass.h>
#include <gadgets/colorwheel.h>
#include <gadgets/gradientslider.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/exec.h>
#include <clib/colorwheel_protos.h>
struct Library *ColorWheelBase=NULL;
struct Library *GradientSliderBase=NULL;
struct Screen *s=NULL;
struct Window *win=NULL;
struct Gadget *gslid=NULL, *cwheel=NULL;
ULONG CTable[100],maxpens=0;
struct ColorWheelHSB hsb;
struct ColorWheelRGB rgb;
#define MAXDEPTH 4
#define MAXCOLORS 16
#define SETBRIGHT(j) ()
struct Farben32Bit {
  UWORD len, pen;
  ULONG red,green,blue;
};
WORD MyPens[MAXCOLORS+1];
struct Farben32Bit Colors[MAXCOLORS+1];
void Loop(void) {
  struct IntuiMessage *imsg;
  BOOL running=TRUE;
  WORD j;
  while( running ) {
    Wait( 1L<<win->UserPort->mp_SigBit );
    while( imsg=GetMsg(win->UserPort) ) {
      switch( imsg->Class ) {
        case IDCMP_CLOSEWINDOW:
             running=FALSE; break;
        case IDCMP_MOUSEMOVE:
             GetAttr(WHEEL_HSB,cwheel,&hsb);
             j=0;
             while( j < maxpens ) {
               hsb.cw_Brightness = 0xFFFFFFFF-
                     ((0xFFFFFFFF/maxpens)*j);
               ConvertHSBToRGB(&hsb,&rgb);
               Colors[j].red=rgb.cw_Red;
               Colors[j].green=rgb.cw_Green;
               Colors[j++].blue=rgb.cw_Blue;
             }
             LoadRGB32(&s->ViewPort,Colors);
             break;
        default: break;
      }
      ReplyMsg((struct Message *)imsg);
    }
  }
}
main() {
IntuitionBase=OpenLibrary("intuition.library",39L);
GfxBase=OpenLibrary("graphics.library",39L);
ColorWheelBase=OpenLibrary(
                  "gadgets/colorwheel.gadget",39L);
GradientSliderBase=OpenLibrary(
              "gadgets/gradientslider.gadget",39L);
if( IntuitionBase && GfxBase && ColorWheelBase &&
                             GradientSliderBase ) {
  s=OpenScreenTags(NULL, SA_LikeWorkbench,TRUE,
     SA_Depth,MAXDEPTH, SA_SharePens,TRUE,TAG_DONE);
  if( s ) {
    GetRGB32(s->ViewPort.ColorMap,0L,32L,CTable);
    rgb.cw_Red=CTable[0]; rgb.cw_Green=CTable[1];
    rgb.cw_Blue=CTable[2];
    ConvertRGBToHSB(&rgb,&hsb);
    hsb.cw_Brightness = 0xFFFFFFFF;
    while( maxpens < MAXCOLORS ) {
      hsb.cw_Brightness = 0xFFFFFFFF-
              ((0xFFFFFFFF/MAXCOLORS) * maxpens );
      ConvertHSBToRGB(&hsb,&rgb);
      MyPens[maxpens]=ObtainPen(
          s->ViewPort.ColorMap,-1,rgb.cw_Red,
          rgb.cw_Green,rgb.cw_Blue,PEN_EXCLUSIVE);
      if( MyPens[maxpens] == -1 ) break;
      Colors[maxpens].len=1;
      Colors[maxpens].pen=MyPens[maxpens++];
    }
    MyPens[maxpens]=~0; Colors[maxpens].len=0;
    gslid=(struct Gadget *)NewObject(NULL,
     "gradientslider.gadget", GA_Top,20,GA_Left,230,
     GA_Width,20,GA_Height,200,GRAD_PenArray,MyPens,
     GA_ID,1L,PGA_Freedom,LORIENT_VERT,TAG_END);
    cwheel=(struct Gadget *)NewObject(NULL,
     "colorwheel.gadget",GA_Top,20,GA_Left,20,
     GA_Width,200,GA_Height,200,WHEEL_GradientSlider,
     gslid,GA_FollowMouse,TRUE,GA_Previous,gslid,
     GA_ID,2L,WHEEL_Red,CTable[0],WHEEL_Green,
     CTable[1],WHEEL_Blue,CTable[2],WHEEL_Screen,s,
     TAG_END);
    if( gslid && cwheel ) {
      win=OpenWindowTags(NULL, WA_Title,
        (ULONG)"MyWindow",WA_CustomScreen,s,
        WA_Flags, WFLG_ACTIVATE | WFLG_CLOSEGADGET,
        WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_MOUSEMOVE,
        WA_Gadgets, gslid, TAG_DONE);
      if( win ) {
        Loop(); CloseWindow(win);
      }
      DisposeObject(cwheel); DisposeObject(gslid);
      while( maxpens > 0 )
        ReleasePen(s->ViewPort.ColorMap,
                               MyPens[maxpens--]);
    }
    CloseScreen(s);
  }
}
if(IntuitionBase) CloseLibrary(IntuitionBase);
if(GfxBase) CloseLibrary(GfxBase);
if(ColorWheelBase) CloseLibrary(ColorWheelBase);
if(GradientSliderBase)
  CloseLibrary(GradientSliderBase);
}
