''
'' $Id: ColorWheel.bas,v 1.3 1994/03/16 11:52:25 alex Rel $
''
'' Simple example of colorwheel and gradient slider
''
'' Derived from Commodore-Amiga example (c) Copyright 1992 Commodore-Amiga, Inc.
''

DEFINT A-Z
REM $NOWINDOW
'REM $INCLUDE Exec.bh
'REM $INCLUDE Intuition.bh
'REM $INCLUDE Graphics.bh
'REM $INCLUDE Gadgets/ColorWheel.bh
'REM $INCLUDE Gadgets/GradientSlider.bc
'REM $INCLUDE Utility.bc

LIBRARY OPEN "exec.library", LIBRARY_MINIMUM&
LIBRARY OPEN "intuition.library", 39
LIBRARY OPEN "graphics.library", 39
LIBRARY OPEN "gadgets/colorwheel.gadget", 39
LIBRARY OPEN "gadgets/gradientslider.gadget", 39	' to force it into memory

DIM SHARED tl&(40)	' generic TagList; space for 20 tags
DIM SHARED mysc&	' my screen
DIM SHARED junk&

CONST GRADCOLORS = 4	' the number of pens in the gradient slider

SUB main
	STATIC displayhandle&, gradslid&, win&, colwheel&, mysc&
	STATIC numPens, closed, i, imsg&, imsgClass&
	DIM diminfo(DimensionInfo_sizeof \ 2)
	DIM colortable&(3)
	DIM rgb&(3), hsb&(3)
	DIM pens(GRADCOLORS)
	DIM color_list&((GRADCOLORS + 1) * 4)
	
	displayhandle& = FindDisplayInfo&(HIRES_KEY&)
	junk& = GetDisplayInfoData&(displayhandle&, VARPTR(diminfo(0)), _
	  DimensionInfo_sizeof, DTAG_DIMS&, NULL&)
	
	TAGLIST VARPTR(tl&(0)), _
	  SA_Depth&, PEEKW(VARPTR(diminfo(0)) + MaxDepth), _
	  SA_SharePens&, TRUE&, _
	  SA_LikeWorkbench&, TRUE&, _
	  SA_Interleaved&, TRUE&, _
	  TAG_END&
	mysc& = OpenScreenTagList&(NULL&, VARPTR(tl&(0)))

	IF mysc& THEN
		'Get colors and set up gradient slider as color 0
		GetRGB32 PEEKL(mysc& + ScreenViewPort + ColorMap), 0, 1, VARPTR(colortable&(0))
		rgb&(0) = colortable&(0)
		rgb&(1) = colortable&(1)
		rgb&(2) = colortable&(2)
					  
		'now convert the RGB values to HSB, and max out B component
		ConvertRGBToHSB VARPTR(rgb&(0)), VARPTR(hsb&(0))

		numPens = 0
		DO WHILE numPens < GRADCOLORS
			'compute brightness as a two-step process since BASIC has no unsigned
			'math...
			hsb&(2) = &hFFFF& - ((&hFFFF& \ GRADCOLORS) * numPens)
			hsb&(2) = (hsb&(2) << 16) OR hsb&(2)
			ConvertHSBToRGB VARPTR(hsb&(0)), VARPTR(rgb&(0))
			pens(numPens) = ObtainPen&(PEEKL(mysc& + ScreenViewPort + ColorMap), _
			  -1, rgb&(0), rgb&(1), rgb&(2), PEN_EXCLUSIVE&)

			IF pens(numPens) = -1 THEN EXIT DO
			
			'Set up LoadRGB32 structure for this pen
			color_list&(numPens * 4) = &h00010000 OR pens(numPens)
			numPens = numPens + 1
		LOOP
		pens(numPens) = NOT 0
		color_list&(numPens * 4) = 0

		'Create gradient slider and colorwheel gadgets
		TAGLIST VARPTR(tl&(0)), _
		  GA_Top&, 50, _
		  GA_Left&, 177, _
		  GA_Width&, 20, _
		  GA_Height&, 100, _
		  GRAD_PenArray&, VARPTR(pens(0)), _
		  PGA_Freedom&, LORIENT_VERT&, _
		  TAG_END&
		gradslid& = NewObjectA&(NULL&, SADD("gradientslider.gadget" + CHR$(0)), VARPTR(tl&(0)))
		
		TAGLIST VARPTR(tl&(0)), _
		  GA_Top&, 50, _
		  GA_Left&, 50, _
		  GA_Width&, 120, _
		  GA_Height&, 100, _
		  WHEEL_Red&, colortable&(0), _
		  WHEEL_Green&, colortable&(1), _
		  WHEEL_Blue&, colortable&(2), _
		  WHEEL_Screen&, mysc&, _
		  WHEEL_GradientSlider&, gradslid&, _
		  GA_FollowMouse&, TRUE&, _
		  GA_Previous&, gradslid&, _
		  TAG_END&
		colwheel& = NewObjectA&(NULL&, SADD("colorwheel.gadget" + CHR$(0)), VARPTR(tl&(0)))

		IF gradslid& <> NULL& AND colwheel& <> NULL& THEN
			TAGLIST VARPTR(tl&(0)), _
			  WA_Left&, 10, _
			  WA_Top&, 20, _
			  WA_Height&, 200, _
			  WA_Width&, 400, _
			  WA_CustomScreen&, mysc&, _
			  WA_IDCMP&, IDCMP_CLOSEWINDOW& OR IDCMP_MOUSEMOVE&, _
			  WA_SizeGadget&, TRUE&, _
			  WA_DragBar&, TRUE&, _
			  WA_CloseGadget&, TRUE&, _
			  WA_Activate&, TRUE&, _
			  WA_Gadgets&, gradslid&, _
			  TAG_DONE&
			win& = OpenWindowTagList&(NULL&, VARPTR(tl&(0)))
			IF win& <> NULL& THEN
				closed = FALSE&
				WHILE closed = FALSE&
					junk& = WaitPort&(PEEKL(win& + UserPort))
					DO
						imsg& = GetMsg&(PEEKL(win& + UserPort))
						IF imsg& <> NULL& THEN
							imsgClass& = PEEKL(imsg& + Class)
							ReplyMsg imsg&
							SELECT CASE imsgClass&
								CASE IDCMP_CLOSEWINDOW&
									closed = TRUE&
								CASE IDCMP_MOUSEMOVE&
								'Change gradient slider color each time colorwheel
								'knob is moved.  This is one method you can use.
								'
								'Query the colorwheel
									junk& = GetAttr&(WHEEL_HSB&, colwheel&, VARPTR(hsb&(0)))
									FOR i = 0 TO numPens - 1
										hsb&(2) = &hFFFF& - ((&hFFFF& \ GRADCOLORS) * i)
										hsb&(2) = (hsb&(2) << 16) OR hsb&(2)
										ConvertHSBToRGB VARPTR(hsb&(0)), VARPTR(rgb&(0))

										color_list&(i * 4 + 1) = rgb&(0)
										color_list&(i * 4 + 2) = rgb&(1)
										color_list&(i * 4 + 3) = rgb&(2)
									NEXT i
									LoadRGB32 mysc& + ScreenViewPort, VARPTR(color_list&(0))
							END SELECT
						END IF
					LOOP WHILE imsg& <> NULL&
				WEND
				CloseWindow win&
			END IF
			DisposeObject colwheel&
			DisposeObject gradslid&
			FOR i = 0 TO numPens - 1
				ReleasePen PEEKL(mysc& + ScreenViewPort + ColorMap), pens(numPens)
			NEXT i
		END IF
		junk& = CloseScreen&(mysc&)
	END IF
END SUB

main
END
