; AGAiff
; > colorreq.s

ColorRequester	tst.l	crwindow-j(a5)
		bne	cr_Close
		; fall through

cr_Open		move.l	gadbase-j(a5),a6
		move.l	showscreen(pc),a0
		sub.l	a1,a1
		LIBCALL	GetVisualInfoA
		move.l	d0,crvisualinfo-j(a5)
		lea	crglistpointer-j(a5),a0
		LIBCALL	CreateContext
		move.l	d0,crgad-j(a5)
		beq	crnocontext
	
		move.l	colortablelength(pc),d1
		divu.w	#12,d1
		moveq	#-1,d0
		moveq	#7,d2
.finddepth	addq.w	#1,d0
		lsr.w	d1
		dbcs	d2,.finddepth
		move.w	d0,crgad0t+6-j(a5)
		move.w	#1,cr_actcolor-j(a5)

		move.w	wborderl(pc),d0
		move.w	wbordert(pc),d1
cr_add		macro
		add.w	d0,crgad\1-j(a5)
		add.w	d1,crgad\1+2-j(a5)
		endm
cr_sub		macro
		sub.w	d0,crgad\1-j(a5)
		sub.w	d1,crgad\1+2-j(a5)
		endm

		cr_add	0
		cr_add	1
		cr_add	2
		cr_add	3
		cr_add	4
		cr_add	5
	
Gadget5		macro		; Gadget5 KIND,struct,tags
		moveq	#\1,d0
		lea	\2(pc),a1
		lea	\3(pc),a2
		bsr	mgsub5
		beq	crnogadgets
		endm

		Gadget5	PALETTE_KIND,crgad0,crgad0t
		Gadget5	SLIDER_KIND,crgad1,crgad1t
		move.l	d0,crgad1p-j(a5)
		Gadget5	SLIDER_KIND,crgad2,crgad2t
		move.l	d0,crgad2p-j(a5)
		Gadget5	SLIDER_KIND,crgad3,crgad3t
		move.l	d0,crgad3p-j(a5)
		Gadget5	BUTTON_KIND,crgad4,notagz
		Gadget5	BUTTON_KIND,crgad5,notagz

		move.l	intbase-j(a5),a6
		lea	crnewwindow(pc),a0
		move.l	crglistpointer(pc),nw_FirstGadget(a0)
		move.l	showscreen(pc),a1
		move.w	18(a1),(a0)	;Fenster unter Maus
		move.w	16(a1),2(a0)	;plazieren !
		move.w	crnewwindowtags+6(pc),d0
		move.w	crnewwindowtags+14(pc),d1
		lsr.w	#1,d0
		lsr.w	#1,d1
		sub.w	d0,(a0)
		bpl.s	.0
		clr.w	(a0)
.0		sub.w	d1,2(a0)
		bpl.s	.1
		clr.w	2(a0)
.1		lea	crnewwindowtags(pc),a1
		move.l	showscreen(pc),nw_Screen(a0)
		LIBCALL	OpenWindowTagList
		move.l	d0,crwindow-j(a5)
		beq	crnowindow

		move.l	d0,a0
		move.l	wd_UserPort(a0),a0
		move.l	a0,crwindowport-j(a5)
		move.b	MP_SIGBIT(a0),Signal.colorreq

		move.l	gadbase-j(a5),a6
		move.l	crwindow(pc),a0
		sub.l	a1,a1
		LIBCALL	GT_RefreshWindow
	
		move.w	cr_actcolor(pc),d5
		bsr	cr_GUnewcolor
*** Hier stand in 1.99beta kein RTS - SCHEISSSEEEEEE!!
		rts
	
mgsub5		move.l	crgad-j(a5),a0
		move.l	#topaztextattr,12(a1)
		move.l	crvisualinfo-j(a5),22(a1)
		move.l	gadbase-j(a5),a6
		LIBCALL	CreateGadgetA
		move.l	d0,crgad-j(a5)
		rts

cr_Close	tst.l	crwindow-j(a5)
		beq.s	cralready
		move.l	intbase-j(a5),a6
		move.l	crwindow(pc),a0
		LIBCALL	CloseWindow
		clr.l	crwindow-j(a5)
		st	Signal.colorreq-j(a5)
crnogadgets
crnowindow	move.l	gadbase-j(a5),a6
		move.l	crglistpointer(pc),a0
		LIBCALL	FreeGadgets
crnocontext	move.l	gadbase-j(a5),a6
		move.l	crvisualinfo-j(a5),a0
		LIBCALL	FreeVisualInfo

		move.w	wborderl(pc),d0
		move.w	wbordert(pc),d1
		cr_sub	0
		cr_sub	1
		cr_sub	2
		cr_sub	3
		cr_sub	4
		cr_sub	5

cralready	rts

crwindow	dc.l	0
crwindowport	dc.l	0
crvisualinfo	dc.l	0
crglistpointer	dc.l	0
crgad	dc.l	0

topaztextattr	dc.l	topazname
	dc.w	8,0
crnewwindow	dc.w	0,0,0,0,1
	dc.l	SLIDERIDCMP!IDCMP_MOUSEBUTTONS!IDCMP_VANILLAKEY,$11002
	dc.l	0,0,crwindowname,0,0
	dc.w	0,0,-1,-1,15
crnewwindowtags	dc.l	WA_InnerWidth,200
	dc.l	WA_InnerHeight,128
	dc.l	WA_AutoAdjust,1
	dc.l	TAG_DONE
crwindowname	dc.b	"AGAiff Color Requester",0
	even
crgad0	dc.w	4,2,192,60
	dc.l	0,0
	dc.w	0
	dc.l	0,0,0
crgad0t	dc.l	GTPA_Depth,0
	dc.l	GTPA_Color,1
	dc.l	GTPA_IndicatorWidth,32
	dc.l	GTPA_IndicatorHeight,32
	dc.l	TAG_DONE

crgad1p	dc.l	0
crgad2p	dc.l	0
crgad3p	dc.l	0

crgad1	dc.w	20,64,144,13
	dc.l	crgad1text,0
	dc.w	1
	dc.l	0,0,0
crgad1t	dc.l	GTSL_Min,0
	dc.l	GTSL_Max,255
	dc.l	GTSL_Level,0
	dc.l	GTSL_MaxLevelLen,3
	dc.l	GTSL_LevelPlace,PLACETEXT_RIGHT
	dc.l	GTSL_LevelFormat,.1
	dc.l	GTSL_DispFunc,.2
	dc.l	TAG_DONE
.1	dc.b	"%ld",0
	even
.2	st	cr_colorchanged
	move.b	d0,cr_r
	rts
crgad1text	dc.b	"R",0

crgad2	dc.w	20,79,144,13
	dc.l	crgad2text,0
	dc.w	2
	dc.l	0,0,0
crgad2t	dc.l	GTSL_Min,0
	dc.l	GTSL_Max,255
	dc.l	GTSL_Level,0
	dc.l	GTSL_MaxLevelLen,3
	dc.l	GTSL_LevelPlace,PLACETEXT_RIGHT
	dc.l	GTSL_LevelFormat,.1
	dc.l	GTSL_DispFunc,.2
	dc.l	TAG_DONE
.1	dc.b	"%ld",0
	even
.2	st	cr_colorchanged
	move.b	d0,cr_g
	rts
crgad2text	dc.b	"G",0

crgad3	dc.w	20,94,144,13
	dc.l	crgad3text,0
	dc.w	3
	dc.l	0,0,0
crgad3t	dc.l	GTSL_Min,0
	dc.l	GTSL_Max,255
	dc.l	GTSL_Level,0
	dc.l	GTSL_MaxLevelLen,3
	dc.l	GTSL_LevelPlace,PLACETEXT_RIGHT
	dc.l	GTSL_LevelFormat,.1
	dc.l	GTSL_DispFunc,.2
	dc.l	TAG_DONE
.1	dc.b	"%ld",0
	even
.2	st	cr_colorchanged
	move.b	d0,cr_b
	rts
crgad3text	dc.b	"B",0

crgad4	dc.w	4,109,94,12
	dc.l	crgad4text,0
	dc.w	4
	dc.l	0,0,0
crgad4text	dc.b	"OK",0
	even
crgad5	dc.w	102,109,94,12
	dc.l	crgad5text,0
	dc.w	5
	dc.l	0,0,0
crgad5text	dc.b	"Cancel",0
	even


EvalColorReqMessage
		move.l	gadbase-j(a5),a6
		move.l	crwindowport(pc),a0
		LIBCALL	GT_GetIMsg
		tst.l	d0
		beq.s	.1
		move.l	d0,a1
		move.l	$14(a1),d4	;Class
		move.w	$18(a1),d5	;Code
		move.w	$1a(a1),d6	;Qualifier
		move.l	$1c(a1),a4	;IAddress
		LIBCALL	GT_ReplyIMsg
		tst.w	GUI_locknestcnt-j(a5)
		bne.s	.00001
		bsr	ecrm1
.00001		tst.l	crwindow-j(a5)
*** hier stand in 1.99b noch EvalWindowMessage-  SCHEIESSSSSEEE!!!
		bne.s	EvalColorReqMessage
.1		rts

ecrm1		cmp.l	#IDCMP_MOUSEBUTTONS,d4
		beq.s	.mousebuttons
		cmp.l	#IDCMP_MOUSEMOVE,d4
		beq.s	cr_Handle
		cmp.l	#IDCMP_GADGETUP,d4
		beq	cr_GadgetUp
		cmp.l	#IDCMP_VANILLAKEY,d4
		beq.s	.vanilla
		rts

.mousebuttons
		btst	#IEQUALIFIERB_RBUTTON,d6
		bne	WindowNachVorne
*** und hier stand in 1.99beta kein RTS - SCHEISSSEEEEEE!!
		rts

.vanilla
		lea	cr_vanillatab(pc),a0
.loop		move.b	(a0),d0
		bmi.s	.ende
		cmp.b	d0,d5
		bne.s	.loopon
		jmp	([2.w,a0])
.loopon		addq.w	#6,a0
		bra.s	.loop
.ende		rts
cr_vanillatab	dc.b	27,0
		dc.l	cr_GUcancel
		dc.b	32,0
		dc.l	cr_GUcancel
		dc.b	-1,0

cr_Handle	tst.w	cr_colorchanged-j(a5)
		bne.s	.0
		rts
.0		move.l	gfxbase-j(a5),a6
		move.l	showscreen(pc),a0
		lea	44(a0),a0	;Screen.ViewPort
		moveq	#0,d0
		move.w	cr_actcolor(pc),d0	;Farbe dem Slider
						;entsprechend neu
						;setzen
		lea	cr_r(pc),a1
		move.b	(a1),d1
		lsl.w	#8,d1
		move.b	(a1),d1
		lsl.l	#8,d1
		move.b	(a1),d1
		lsl.l	#8,d1
		move.b	(a1)+,d1
	
		move.b	(a1),d2
		lsl.w	#8,d2
		move.b	(a1),d2
		lsl.l	#8,d2
		move.b	(a1),d2
		lsl.l	#8,d2
		move.b	(a1)+,d2
	
		move.b	(a1),d3
		lsl.w	#8,d3
		move.b	(a1),d3
		lsl.l	#8,d3
		move.b	(a1),d3
		lsl.l	#8,d3
		move.b	(a1),d3
	
		LIBCALL	SetRGB32
		clr.w	cr_colorchanged-j(a5)
		rts

cr_GadgetUp	move.w	38(a4),d0
		tst.w	d0
		beq	cr_GUnewcolor
		subq.w	#4,d0
		beq	cr_GUok
		subq.w	#1,d0
		beq	cr_GUcancel
		rts

cr_GUnewcolor	moveq	#0,d0
		move.w	d5,d0
		move.w	d5,cr_actcolor-j(a5)
		move.l	gfxbase-j(a5),a6
		move.l	showscreen(pc),a0
		move.l	44+4(a0),a0		;Screen.Viewport->ColorMap
		moveq	#1,d1
		lea	cr_rgb(pc),a1
		move.l	a1,a4
		LIBCALL	GetRGB32		* neue Farbe holen

		move.l	gadbase-j(a5),a6	* und RGB-Slider entsprechend

		move.l	crgad1p(pc),a0		* setzen
		move.l	crwindow(pc),a1	;R
		sub.l	a2,a2
		lea	cr_GUnctags(pc),a3
		move.b	(a4),7(a3)
		LIBCALL	GT_SetGadgetAttrsA

		move.l	crgad2p(pc),a0	;G
		move.l	crwindow(pc),a1
		sub.l	a2,a2
		lea	cr_GUnctags(pc),a3
		move.b	4(a4),7(a3)
		LIBCALL	GT_SetGadgetAttrsA

		move.l	crgad3p(pc),a0	;B
		move.l	crwindow(pc),a1
		sub.l	a2,a2
		lea	cr_GUnctags(pc),a3
		move.b	8(a4),7(a3)
		LIBCALL	GT_SetGadgetAttrsA

		clr.w	cr_colorchanged
		rts
cr_GUnctags	dc.l	GTSL_Level,0
		dc.l	TAG_DONE

cr_GUok		bsr	cr_Close	* neue Farben in unsere
		move.l	gfxbase-j(a5),a6	* colortable übertragen !
		move.l	showscreen(pc),a2
		move.l	44+4(a2),a2	;Screen.Viewport->ColorMap
		move.l	colortable(pc),a3
		move.w	(a3),d2
		subq.w	#1,d2
		addq.l	#4,a3
		moveq	#0,d3
.getloop	move.l	a2,a0
		move.l	d3,d0
		moveq	#1,d1
		lea	cr_rgb(pc),a1
		LIBCALL	GetRGB32	;neue Farbe holen
		lea	cr_rgb(pc),a1
		move.l	(a1)+,(a3)+
		move.l	(a1)+,(a3)+
		move.l	(a1),(a3)+
		addq.l	#1,d3
		dbra	d2,.getloop
		rts

cr_GUcancel	bsr	cr_Close	* alte Farben uploaden !
		move.l	gfxbase-j(a5),a6
		move.l	showscreen(pc),a0
		lea	44(a0),a0	;Screen.ViewPort
		move.l	colortable(pc),a1
		LIBCALL	LoadRGB32
		rts

cr_colorchanged	dc.w	0
cr_r	dc.b	0
cr_g	dc.b	0
cr_b	dc.b	0
	even
cr_rgb	dc.l	0,0,0
cr_actcolor	dc.w	0
