;-- TIME_STAMP   2015-12-26 13:22:33   v 0.6
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <WinAPIMisc.au3>
#include <WinAPIGdi.au3>
#include <BorderConstants.au3>

Opt('GUIOnEventMode', 1)
OnAutoItExitRegister("OnExit")
OnAutoItExitRegister("_DelBinaryTempFiles")

Global $__hMouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hMouseProc), _WinAPI_GetModuleHandle(0))

Global $fExit = False, $fBGR = False, $fGradientSector = False
Global $hGUIMixer, $hGradient = -1, $hPickUp, $hZoom, $slRed, $slGreen, $slBlue, $lbRed, $lbBlue
Global $iSectorSelect = 0, $hDC, $hBitmap
Global $lbColorView, $InHex, $InRed, $InGreen, $InBlue, $cbBGR, $cbSector, $IndexUser = -1
Global $lbA, $lbB, $lbC, $cPic, $hPic, $lbHeaderSector, $lbRadios, $rA, $rB, $rC, $btCtrSector, $btBdrSector
Global $hGradient, $lbHeaderFull, $btCtrFull, $btBdrFull


Global $iMagZoom = 4.5, $iMagWidth = 20, $iMagHeight = 20

Global $tMouseSpeed = DllStructCreate('int Speed')
Global Const $SPI_GETMOUSESPEED = 112, $SPI_SETMOUSESPEED = 113
_WinAPI_SystemParametersInfo($SPI_GETMOUSESPEED, 0, DllStructGetPtr($tMouseSpeed), 0)
Global $iMouseSpeed = $tMouseSpeed.Speed

Global $hDCDesk, $hDCZoom, $hPenCross, $hPenBorder
Global $hUser32 = DllOpen("user32.dll"), $hGDI32 = DllOpen("gdi32.dll")

Global $aColors[30][2] = [[0x000000],[0x7F7F7F],[0x880015],[0xED1C24],[0xFF7F27],[0xFFF200],[0x22B14C],[0x00A2E8],[0x3F48CC],[0xA349A4], _
						  [0xFFFFFF],[0xC3C3C3],[0xB97A57],[0xFFAEC9],[0xFFC90E],[0xEFE4B0],[0xB5E61D],[0x99D9EA],[0x7092BE],[0xC8BFE7], _
						  [Null],[Null],[Null],[Null],[Null],[Null],[Null],[Null],[Null],[Null]]
Global $aMarker[10]

Global $INI = @ScriptDir & '\colormixer.ini', $aSection, $fStartBGR = False, $fStartSector = False, $iColorStart = 0xFFFFFF
Global $aSectorGrINI[3][2] = [[0xFF0000,0xFFF200],[0x00FF00,0xFFFFFF],[0x0000FF,0xFFFFFF]]
Global $iRead, $aTmp, $iFullGrINIstart = 0xFFF200, $iFullGrINIend = 0xED1C24
If FileExists($INI) Then
	$aSection = IniReadSection($INI, 'usercolor')
	If Not @error Then
		If $aSection[0][0] > 10 Then $aSection[0][0] = 10
		For $i = 1 To $aSection[0][0]
			$aColors[19+$i][0] = $aSection[$i][1]
		Next
	EndIf
	$fStartBGR = IniRead($INI, 'settings', 'BGR', 0) = 1 ? True : False
	$fStartSector = IniRead($INI, 'settings', 'Sector', 0) = 1 ? True : False
	Local $iLastColor = IniRead($INI, 'settings', 'Color', -1)
	$iColorStart = $iLastColor = -1 ? 0xFFFFFF : $iLastColor
	$iRead = IniRead($INI, 'settings', 'FullGradient_start', -1)
	$iFullGrINIstart = $iRead = -1 ? $iFullGrINIstart : $iRead
	$iRead = IniRead($INI, 'settings', 'FullGradient_end', -1)
	$iFullGrINIend = $iRead = -1 ? $iFullGrINIend : $iRead
	Local $sSectorCol = IniRead($INI, 'settings', 'Sector_Gradient', -1)
	If $sSectorCol <> -1 Then
		$aTmp = StringSplit($sSectorCol, ';')
		For $i = 0 To 2
			$aSectorGrINI[$i][0] = StringLeft($aTmp[$i+1], StringInStr($aTmp[$i+1], ',')-1)
			$aSectorGrINI[$i][1] = StringTrimLeft($aTmp[$i+1], StringInStr($aTmp[$i+1], ','))
		Next
	EndIf
EndIf


Global $fCmdLine = False
If $CMDLINE[0] Then
	Local $aCol = StringRegExp($CMDLINE[1], '[a-fA-F0-9]{6}$', 1)
	If IsArray($aCol) Then
		$iColorStart = '0x' & $aCol[0]
		$fCmdLine = True
	EndIf
EndIf

Global $sPathIcon = @TempDir & "\palette.ico"
Global $bData = "0x000001000100101000000000000068050000160000002800000010000000200000000100080000000000400100000000000000000000000000000000000000000000FFFFFF004141F000AE9827005ED5FB003CB87A0016609A008285F500B4D2F2007997A4002CA4FF00969B6A004480B800C5B65B008EB5E20061C898002BD5FF00596BED00699BD2005DACF20057A9B7009F9749002B6FAB005287F400538BCB0048B491006DC0FF006B8FE90093A5F5006F75F600A0C1ED0042D1FB0079ABE60041AAFB005992DF006DE2FF0053B4A1005BBFF1007D9592005A5BF60078A6D6003677B4006A9DE2006093C90085A8ED002268A3005FAAC200AACAEF004A84C300A998320067BFF00096B9EA006094D50086B3E9005BB3F9007FA9DC0087AEE10072A1E300598FCF0040B78100BAD7F3007FB0E70033A7FE006095E0003BCEFB003173AC003E7CB90099C0EC008EB4E9006598CD004A84BC001D65A00031D3FE00266BA70093B9E20077A4DC00A6C6ED00AFCDF00091BCEB006E9ED1003CA7FB009E984E003274B10019629D005D92D20075A4E40045B48E0099BCEA007CA8E6007CA9D90093B7E8003B7AB800689ACE00A3C4ED007CAEE7005C94DF00A9CAEC0093BAE500679CE200B2D0F100A8C8EE003878B6006396CC007AA6D8009EC0EC0098BBE80090B6E300ADCCF0007EADE70087B0E1006598CF001A639E00B1CFF0003576B3003F7DBA009ABDEB0092B9E40080B1E800588ECE005C91D10071A2E4006194CA0077A5D700256BA600ABCAF000A9C9ED00A6C7EC00A4C5ED00A2C3ED0097BAEA008FB7E3005991DE0086AFE1005B93DF00AD9827003CB87B002CD5FF00AECDF000ABCAEF00A8C7EE00A6C6EE009EC0ED0099BCEB0095B9EA008EB6E2007FAFE7007DAEE7006094C9006E9ED20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000476F000000000000000000000000007B38372B4100000000000000000000004F7339818F7906000000000000000052682A5F223F3338460000000000005B7A801E8D558583585A0C00006E590E7F8B4571931E091526446753184D7043918A4200295D310D865F8E47767D2C111B8994725C8C0B035162572D00611D07024E4D6B7C352E561478694900541C271750133D5E203B0F876C6A1600006D3C3E1A0A32402524051964280000000084360A2148238875922F4C65000000000034823C04101F08634A6600000000000000004B74607E9012300000000000000000000000773A000000000000FFFF0000FE7F0000FC1F0000FC070000F8030000F00100008000000001000000000000008000000080000000C0010000E0010000F0030000FC070000FF3F0000"
Local $hFileOut = FileOpen($sPathIcon, 2+8+16)
FileWrite($hFileOut, Binary($bData))
FileClose($hFileOut)

Func _DelBinaryTempFiles()
	FileDelete($sPathIcon)
EndFunc  ;==>_DelBinaryTempFiles



Local $iColorOut = _Main()
ClipPut($iColorOut)
If $fCmdLine Then ConsoleWrite($iColorOut & @CRLF)


Func _Main($_fGradientSector=False)
	$hGUIMixer = GUICreate("Color mixer  [ RGB ]", 443, 230, (@DesktopWidth/2)-221, (@DesktopHeight/2)-85, BitOR($WS_SYSMENU, $WS_CAPTION), $WS_EX_TOPMOST)
	GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
	GUISetIcon($sPathIcon, -1, $hGUIMixer)
	GUICtrlCreateGroup("", 10, 0, 423, 220)

	; 3-sector radial gradient
	$lbA = GUICtrlCreateLabel('A', 50, 8, 10, 17)
	GUICtrlSetFont(-1, 7, 300)
	$lbB = GUICtrlCreateLabel('B', 82, 60, 10, 17)
	GUICtrlSetFont(-1, 7, 300)
	$lbC = GUICtrlCreateLabel('C', 15, 60, 10, 17)
	GUICtrlSetFont(-1, 7, 300)
	$cPic = GUICtrlCreatePic('', 22, 15, 70, 70)
	GUICtrlSetOnEvent(-1, "_GradientClick")
	$hPic = GUICtrlGetHandle($cPic)
	$lbHeaderSector = GUICtrlCreateLabel('Gradient color', 100, 12, 70, 17, $SS_CENTER)
	$lbRadios = GUICtrlCreateLabel('A      B     C', 107, 30, 58, 13)
	GUICtrlSetFont(-1, 7, 300)
	$rA = GUICtrlCreateRadio('', 105, 43, 18, 20)
	GUICtrlSetFont(-1, 0)
	GUICtrlSetState(-1, $GUI_CHECKED)
	GUICtrlSetOnEvent(-1, '_RadioClick')
	$rB = GUICtrlCreateRadio('', 127, 43, 18, 20)
	GUICtrlSetFont(-1, 0)
	GUICtrlSetOnEvent(-1, '_RadioClick')
	$rC = GUICtrlCreateRadio('', 149, 43, 18, 20)
	GUICtrlSetFont(-1, 0)
	GUICtrlSetOnEvent(-1, '_RadioClick')
	$btCtrSector = GUICtrlCreateButton('Center', 97, 67, 37, 20)
	GUICtrlSetFont(-1, 7, 300)
	GUICtrlSetOnEvent(-1, '_GradientCenterChange')
	$btBdrSector = GUICtrlCreateButton('Border', 135, 67, 37, 20)
	GUICtrlSetFont(-1, 7, 300)
	GUICtrlSetOnEvent(-1, '_GradientBorderChange')

	; full radial gradient
	$hGradient = GUICtrlCreateGraphic(22, 15, 60, 60)
	GUICtrlSetOnEvent(-1, "_GradientClick")
	_RadialGradientFill($hGradient, 30, 35, 30, $iFullGrINIstart, $iFullGrINIend)
	$lbHeaderFull = GUICtrlCreateLabel('Gradient color', 90, 18, 80, 17, $SS_CENTER)
	$btCtrFull = GUICtrlCreateButton('Center', 105, 37, 50, 20)
	GUICtrlSetFont(-1, 7, 300)
	GUICtrlSetOnEvent(-1, '_GradientCenterChange')
	$btBdrFull = GUICtrlCreateButton('Border', 105, 58, 50, 20)
	GUICtrlSetFont(-1, 7, 300)
	GUICtrlSetOnEvent(-1, '_GradientBorderChange')

	Local $ixL = 176, $iyL = 15, $iIndex = 0
	For $i = 1 To 3
		For $j = 0 To 9
			If $i = 3 Then
				$aMarker[$j] = GUICtrlCreateLabel(' ', $ixL+$j*25, $iyL+23, 22, 3)
				GUICtrlSetBkColor(-1, 0xA349A4)
				GUICtrlSetState(-1, $GUI_HIDE)
			EndIf
			$aColors[$iIndex][1] = GUICtrlCreateLabel('', $ixL+$j*25, $iyL, 22, 22, $SS_SUNKEN)
			GUICtrlSetOnEvent(-1, '_ColorClick')
			If $aColors[$iIndex][0] <> Null Then GUICtrlSetBkColor(-1, $aColors[$iIndex][0])
			$iIndex += 1
		Next
		$iyL += 25
	Next

	$cbBGR = GUICtrlCreateCheckbox('  BGR', 22, 176, 50, 20)
	GUICtrlSetOnEvent(-1, '_ToggleRGB')
	If $fStartBGR Then GUICtrlSetState(-1, $GUI_CHECKED)
	$cbSector = GUICtrlCreateCheckbox(' Sector', 22, 196, 50, 20)
	GUICtrlSetOnEvent(-1, '_ToggleGradient')
	If $fStartSector Then GUICtrlSetState(-1, $GUI_CHECKED)
	GUICtrlCreateButton("Color Picker", 95, 185, 100, 24)
	GUICtrlSetOnEvent(-1, "_ColorPicker")
	GUICtrlCreateButton('Add to User Color', 209, 185, 100, 24)
	GUICtrlSetOnEvent(-1, '_AddUserColor')
	GUICtrlCreateButton("OK", 324, 185, 100, 24)
	GUICtrlSetOnEvent(-1, "_Exit")
	$slRed = GUICtrlCreateSlider(174, 99, 250, 20, 0)
	GUICtrlSetLimit(-1, 255, 0)
	GUICtrlSetData(-1, 255)
	GUICtrlSetBkColor(-1, 0xFF0000)
	GUICtrlSetOnEvent(-1, "_Slider2Hex")
	$slGreen = GUICtrlCreateSlider(174, 124, 250, 20, 0)
	GUICtrlSetLimit(-1, 255, 0)
	GUICtrlSetData(-1, 255)
	GUICtrlSetBkColor(-1, 0x00FF00)
	GUICtrlSetOnEvent(-1, "_Slider2Hex")
	$slBlue = GUICtrlCreateSlider(174, 149, 250, 20, 0)
	GUICtrlSetLimit(-1, 255, 0)
	GUICtrlSetData(-1, 255)
	GUICtrlSetBkColor(-1, 0x0000FF)
	GUICtrlSetOnEvent(-1, "_Slider2Hex")
	$InRed = GUICtrlCreateInput("255", 132, 99, 40, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
	GUICtrlSetOnEvent(-1, "_InRedChange")
	$InGreen = GUICtrlCreateInput("255", 132, 124, 40, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
	GUICtrlSetOnEvent(-1, "_InGreenChange")
	$InBlue = GUICtrlCreateInput("255", 132, 149, 40, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
	GUICtrlSetOnEvent(-1, "_InBlueChange")
	$lbRed = GUICtrlCreateLabel("R", 115, 103, 10, 17)
	GUICtrlCreateLabel("G", 115, 127, 10, 17)
	$lbBlue = GUICtrlCreateLabel("B", 115, 152, 10, 17)
	$lbColorView = GUICtrlCreateLabel("", 22, 99, 60, 46, $SS_SUNKEN)
	GUICtrlSetBkColor(-1, $iColorStart)
	$InHex = GUICtrlCreateInput("0x" & Hex($iColorStart,6), 22, 149, 60, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
	GUICtrlSetOnEvent(-1, "_InHexChange")
	GUICtrlCreateGroup("", -99, -99, 1, 1)

	$hPickUp = GUICreate('', 48, 48, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
	WinSetTrans($hPickUp, '', 10)
	GUISetCursor(3, 1, $hPickUp)

	$hZoom = GUICreate("Zoom Window", $iMagWidth * $iMagZoom, $iMagHeight * $iMagZoom, _
		MouseGetPos(0), MouseGetPos(1), $WS_POPUP+$WS_BORDER, $WS_EX_TOPMOST)

	_DrawRadialGradientChangeSector(-3, $aSectorGrINI) ; initialisiere zuletzt verwendete Farben
	If $fStartSector Then
		_SwitchState($GUI_SHOW, 'sector')
		_DrawRadialGradientChangeSector()
		$fGradientSector = True
	Else
		_SwitchState($GUI_HIDE, 'sector')
	EndIf
	If $fStartBGR Then
		_ToggleRGB()
	Else
		_InHexChange()
	EndIf

	GUISetState(@SW_SHOW, $hGUIMixer)

	While Sleep(10)
		If $fExit Then ExitLoop
	WEnd

	; wenn Usercolor vorhanden --> in INI schreiben
	If $aColors[20][0] <> Null Then
		If FileExists($INI) Then IniDelete($INI, 'usercolor')
		Local $sSection = ''
		For $i = 20 To 29
			If $aColors[$i][0] = Null Then ExitLoop
			$sSection &= $i & '=' & $aColors[$i][0] & @LF
		Next
		IniWriteSection($INI, 'usercolor', StringTrimRight($sSection, 1))
	EndIf
	; BGR, Section und letzte Farbe in INI schreiben
	IniWrite($INI, 'settings', 'BGR', (BitAND(GUICtrlRead($cbBGR),$GUI_CHECKED) = $GUI_CHECKED ? 1 : 0))
	IniWrite($INI, 'settings', 'Sector', (BitAND(GUICtrlRead($cbSector),$GUI_CHECKED) = $GUI_CHECKED ? 1 : 0))
	IniWrite($INI, 'settings', 'Color', GUICtrlRead($InHex))
	; letzte Farben aus Sektor-Gradient speichern
	$aColors = _DrawRadialGradientChangeSector(-2)
	Local $sWrite = ''
	For $i = 0 To UBound($aColors) -1
		$sWrite &= '0x' & Hex($aColors[$i][0],6) & ',0x' & Hex($aColors[$i][1],6) & ';'
	Next
	IniWrite($INI, 'settings', 'Sector_Gradient', StringTrimRight($sWrite, 1))
	; letzte Farben aus Full-Gradient in INI schreiben
	Local $tmp = _RadialGradientFill(-2)
	IniWrite($INI, 'settings', 'FullGradient_start', '0x' & Hex(StringLeft($tmp, StringInStr($tmp, ';')-1),6))
	IniWrite($INI, 'settings', 'FullGradient_end', '0x' & Hex(StringTrimLeft($tmp, StringInStr($tmp, ';')),6))
	Return GUICtrlRead($InHex)
EndFunc  ;==>_Main

Func _ColorClick()
	For $i = 0 To UBound($aColors) -1
		If $aColors[$i][1] = @GUI_CtrlId Then
			If $aColors[$i][0] <> Null Then
				If $fBGR Then
					GUICtrlSetData($InHex, _RGB2ABGR($aColors[$i][0],-1))
				Else
					GUICtrlSetData($InHex, '0x' & Hex($aColors[$i][0],6))
				EndIf
				_InHexChange()
				If $i > 19 Then _SelectUserColor($i)
			Else
				_SelectUserColor($i)
			EndIf
			ExitLoop
		EndIf
	Next
EndFunc  ;==>_ColorClick

Func _SelectUserColor($_iIndex)
	If $aColors[$_iIndex][0] = Null Then
		If $aColors[$_iIndex-1][0] <> Null Then
			$IndexUser = $_iIndex
			_SetColorMarker($IndexUser)
		Else
			_SelectUserColor($_iIndex-1)
		EndIf
	Else
		$IndexUser = $_iIndex
		_SetColorMarker($IndexUser)
		Local $iColor = '0x' & Hex($aColors[$_iIndex][0],6)
		If $fBGR Then $iColor = _RGB2ABGR($aColors[$_iIndex][0],-1)
		GUICtrlSetData($InHex, $iColor)
	EndIf
EndFunc  ;==>_SelectUserColor

Func _SetColorMarker($_iIndex)
	Local Static $iLastIndex = 0
	GUICtrlSetState($aMarker[$iLastIndex], $GUI_HIDE)
	GUICtrlSetState($aMarker[$_iIndex-20], $GUI_SHOW)
	$iLastIndex = $_iIndex -20
EndFunc  ;==>_SetColorMarker

Func _RadioClick()
	Switch @GUI_CtrlId
		Case $rA
			$iSectorSelect = 0
		Case $rB
			$iSectorSelect = 1
		Case $rC
			$iSectorSelect = 2
	EndSwitch
EndFunc  ;==>_RadioClick

Func _GradientCenterChange()
	If Not $fGradientSector Then
		If $fBGR Then
			_RadialGradientFill($hGradient, 30, 35, 30, _RGB2ABGR(GUICtrlRead($InHex),-1))
		Else
			_RadialGradientFill($hGradient, 30, 35, 30, GUICtrlRead($InHex))
		EndIf
	Else
		If $fBGR Then
			_DrawRadialGradientChangeSector($iSectorSelect, _RGB2ABGR(GUICtrlRead($InHex),-1))
		Else
			_DrawRadialGradientChangeSector($iSectorSelect, GUICtrlRead($InHex))
		EndIf
	EndIf
EndFunc  ;==>_GradientCenterChange

Func _GradientBorderChange()
	If Not $fGradientSector Then
		If $fBGR Then
			_RadialGradientFill($hGradient, 30, 35, 30, -1, _RGB2ABGR(GUICtrlRead($InHex),-1))
		Else
			_RadialGradientFill($hGradient, 30, 35, 30, -1, GUICtrlRead($InHex))
		EndIf
	Else
		If $fBGR Then
			_DrawRadialGradientChangeSector($iSectorSelect, -1, _RGB2ABGR(GUICtrlRead($InHex),-1))
		Else
			_DrawRadialGradientChangeSector($iSectorSelect, -1, GUICtrlRead($InHex))
		EndIf
	EndIf
EndFunc  ;==>_GradientBorderChange

Func _GradientClick()
	Local $iColor = PixelGetColor(MouseGetPos(0), MouseGetPos(1))
	If $fBGR Then
		GUICtrlSetData($InHex, _RGB2ABGR(Hex($iColor, 6),-1))
	Else
		GUICtrlSetData($InHex, '0x' & Hex($iColor, 6))
	EndIf
	_InHexChange()
EndFunc  ;==>_GradientClick

Func _AddUserColor()
	If $IndexUser = -1 Then _SelectUserColor(29)
	Local $iColor = GUICtrlRead($InHex)
	If $fBGR Then $iColor = _RGB2ABGR(GUICtrlRead($InHex),-1)
	GUICtrlSetBkColor($aColors[$IndexUser][1], $iColor)
	$aColors[$IndexUser][0] = GUICtrlRead($InHex)
EndFunc  ;==>_AddUserColor

Func _ToggleRGB()
	$fBGR = BitAND(GUICtrlRead($cbBGR), $GUI_CHECKED) ? True : False
	Local $iHex = GUICtrlRead($InHex)
	Local $red = Hex(BitAND(BitShift($iHex,16), 0xFF),2)
	Local $green = Hex(BitAND(BitShift($iHex,8), 0xFF),2)
	Local $blue = Hex(BitAND($iHex, 0xFF),2)
	GUICtrlSetData($InHex, '0x' & $blue & $green & $red)
	If $fBGR Then
		WinSetTitle($hGUIMixer, "", "Color mixer  [ BGR ]")
		GUICtrlSetBkColor($slRed, 0x0000FF)
		GUICtrlSetData($lbRed, "B")
		GUICtrlSetBkColor($slBlue, 0xFF0000)
		GUICtrlSetData($lbBlue, "R")
	Else
		WinSetTitle($hGUIMixer, "", "Color mixer  [ RGB ]")
		GUICtrlSetBkColor($slRed, 0xFF0000)
		GUICtrlSetData($lbRed, "R")
		GUICtrlSetBkColor($slBlue, 0x0000FF)
		GUICtrlSetData($lbBlue, "B")
	EndIf
	_InHexChange()
EndFunc  ;==>_ToggleRGB

Func _ToggleGradient()
	$fGradientSector = BitAND(GUICtrlRead($cbSector), $GUI_CHECKED) = $GUI_CHECKED ? True : False
	If $fGradientSector Then
		_SwitchState($GUI_HIDE)
		_DrawRadialGradientChangeSector()
	Else
		_SwitchState($GUI_SHOW)
	EndIf
EndFunc  ;==>_ToggleGradient

Func _SwitchState($_iState, $_sGradient='full')
	Local Static $aSector[] = [$lbA, $lbB, $lbC, $cPic, $hPic, $lbHeaderSector, $lbRadios, $rA, $rB, $rC, $btCtrSector, $btBdrSector]
	Local Static $aFull[] = [$hGradient, $lbHeaderFull, $btCtrFull, $btBdrFull]
	Local $iTmp, $iState2 = $_iState = $GUI_HIDE ? $GUI_SHOW : $GUI_HIDE
	If $_sGradient = 'sector' Then
		$iTmp = $_iState
		$_iState = $iState2
		$iState2 = $iTmp
	EndIf
	For $i = 0 To UBound($aFull) -1
		GUICtrlSetState($aFull[$i], $_iState)
	Next
	For $i = 0 To UBound($aSector) -1
		GUICtrlSetState($aSector[$i], $iState2)
	Next
EndFunc  ;==>_SwitchState

Func _Magnify($_iX=-1, $_iY=-1)
	Local Static $fInit = True
	If $fInit Then
		$fInit = False
		$hDCDesk = _WinAPI_GetDC(0)
		$hDCZoom = _WinAPI_GetDC($hZoom)
        $hPenCross = _WinAPI_CreatePen(0, 3, 0x00800000)
        $hPenBorder = _WinAPI_CreatePen(0, 1, 0x00000000)
	EndIf
	If $_iX = -1 Then
		$_iX = MouseGetPos(0)
		$_iY = MouseGetPos(1)
	EndIf
	Local $iW = $iMagWidth * $iMagZoom, $iH = $iMagHeight * $iMagZoom
    If Not @error Then
		_WinAPI_StretchBlt($hDCZoom, 0, 0, $iW, $iH, $hDCDesk, $_iX - $iMagWidth/2, $_iY - $iMagHeight/2, $iMagWidth, $iMagHeight, $SRCCOPY)
		; draw the crosshair
		_WinAPI_SelectObject($hDCZoom, $hPenCross)
		_WinAPI_DrawLine($hDCZoom, ($iW/2), ($iH/8), ($iW/2), 3*($iH/8))   ; vertical
		_WinAPI_DrawLine($hDCZoom, ($iW/2), 5*($iH/8), ($iW/2), 7*($iH/8)) ; vertical
		_WinAPI_DrawLine($hDCZoom, ($iW/8), ($iH/2), 3*($iW/8), ($iH/2))   ; horicontal
		_WinAPI_DrawLine($hDCZoom, 5*($iW/8), ($iH/2), 7*($iW/8), ($iH/2)) ; horicontal
		; draw a preview rectangle with color from the centered pixel
		Local $iColor = _RGB2ABGR(PixelGetColor($_iX, $_iY))
		Local $hBrush = _WinAPI_CreateSolidBrush($iColor)
		Local $tRect = _WinAPI_CreateRect($iW-25, 0, $iW, 25)
		_WinAPI_FillRect($hDCZoom, $tRect, $hBrush)
		_WinAPI_DeleteObject($hBrush)
		; draw a border left and bottom from preview rectangle
		_WinAPI_SelectObject($hDCZoom, $hPenBorder)
		_WinAPI_DrawLine($hDCZoom, $iW-25, 0, $iW-25, 25) ; vertical
		_WinAPI_DrawLine($hDCZoom, $iW-25, 25, $iW, 25)   ; horicontal
    EndIf
EndFunc  ;==>_Magnify

Func _RGB2ABGR($_iColor, $_iAlpha='00')
	Local $sH = IsInt($_iColor) ? Hex($_iColor,6) : $_iColor, $pattHex = '[0-9a-fA-F]{2}'
	Local $aRGB = StringRegExp($sH, "(" & $pattHex & ")(" & $pattHex & ")(" & $pattHex & ")$",1)
	$_iAlpha = $_iAlpha = -1 ? '0x' : '0x' & $_iAlpha
	Return StringFormat('%s%s%s%s', $_iAlpha, $aRGB[2], $aRGB[1], $aRGB[0])
EndFunc  ;==>_RGB2ABGR

Func _MouseProc($_nCode, $_wParam, $_lParam)
	Local $tMSLLHOOKSTRUCT = DllStructCreate("struct;LONG X;LONG Y;endstruct;struct;" & _
		"DWORD mouseData; DWORD flags; DWORD time; ULONG_PTR dwExtraInfo;endstruct", $_lParam)
	If $_nCode < 0 Then Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam)
	Local $iX = $tMSLLHOOKSTRUCT.X, $iY = $tMSLLHOOKSTRUCT.Y
	Local Static $fHoverGradient = False, $fPreviewChange = False
	Switch WinGetHandle('[ACTIVE]')
		Case $hPickUp
			Switch $_wParam
				Case $WM_LBUTTONDOWN
					_WinAPI_SystemParametersInfo($SPI_SETMOUSESPEED, 0, $iMouseSpeed)
					GUISetState(@SW_HIDE, $hPickUp)
					GUISetState(@SW_HIDE, $hZoom)
					GUICtrlSetData($InHex, '0x' & Hex(PixelGetColor($iX, $iY), 6))
					_InHexChange()
					GUISetState(@SW_SHOW, $hGUIMixer)
					WinActivate($hGUIMixer)

				Case $WM_MOUSEMOVE
					WinMove($hPickUp, "", $iX -24, $iY -24)
					Local $iXz = ($iX +24 + $iMagWidth*$iMagZoom > @DesktopWidth) ? $iX -(24 + $iMagWidth*$iMagZoom) : $iX +24
					Local $iYz = ($iY +24 + $iMagHeight*$iMagZoom > @DesktopHeight) ? $iY -(24 + $iMagHeight*$iMagZoom) : $iY +24
					WinMove($hZoom, "", $iXz + $iMagWidth/2, $iYz)
					_Magnify($iX, $iY)
			EndSwitch
		Case $hGUIMixer
			Switch $_wParam
				Case $WM_MOUSEMOVE
					Local $aCursor = GUIGetCursorInfo($hGUIMixer)
					If Not @error Then
						If $aCursor[4] = $hGradient Or $aCursor[4] = $cPic Then
							$fHoverGradient = True
							$fPreviewChange = True
							GUICtrlSetBkColor($lbColorView, PixelGetColor($iX, $iY))
						ElseIf $aCursor[4] <> $hGradient And $aCursor[4] <> $cPic And $fHoverGradient Then
							$fHoverGradient = False
						EndIf
					EndIf
					If Not $fHoverGradient And $fPreviewChange Then
						$fPreviewChange = False
						Local $iPreview = $fBGR ? _RGB2ABGR(Hex(GUICtrlRead($InHex),6),-1) : GUICtrlRead($InHex)
						GUICtrlSetBkColor($lbColorView, $iPreview)
					EndIf
			EndSwitch
	EndSwitch
	Return _WinAPI_CallNextHookEx($__hHook, $_nCode, $_wParam, $_lParam)
EndFunc  ;==>_MouseProc

Func _Exit()
	GUISetState(@SW_HIDE, $hGUIMixer)
	$fExit = True
EndFunc  ;==>_Exit

Func OnExit()
	_WinAPI_DeleteObject($hPenBorder)
	_WinAPI_DeleteObject($hPenCross)
	_WinAPI_ReleaseDC($hZoom, $hDCZoom)
	_WinAPI_ReleaseDC(0, $hDCDesk)
    _WinAPI_UnhookWindowsHookEx($__hHook)
    DllCallbackFree($__hMouseProc)
EndFunc  ;==>OnExit

Func _ColorPicker()
	GUISetState(@SW_HIDE, $hGUIMixer)
	WinMove($hZoom, '', MouseGetPos(0), MouseGetPos(1))
	GUISetState(@SW_SHOW, $hZoom)
	GUISetState(@SW_SHOW, $hPickUp)
	WinWaitActive($hPickUp, '', 1)
	_WinAPI_SystemParametersInfo($SPI_SETMOUSESPEED, 0, 5)
	_Magnify()
EndFunc  ;==>_ColorPicker

Func _InRedChange()
	Local $tmp = GUICtrlRead($InRed)
	If $tmp < 0 Or $tmp > 255 Then
		Return GUICtrlSetData($InRed, GUICtrlRead($slRed))
	EndIf
	GUICtrlSetData($slRed, $tmp)
	_Slider2Hex()
EndFunc  ;==>_InRedChange

Func _InGreenChange()
	Local $tmp = GUICtrlRead($InGreen)
	If $tmp < 0 Or $tmp > 255 Then
		Return GUICtrlSetData($InGreen, GUICtrlRead($slGreen))
	EndIf
	GUICtrlSetData($slGreen, $tmp)
	_Slider2Hex()
EndFunc  ;==>_InGreenChange

Func _InBlueChange()
	Local $tmp = GUICtrlRead($InBlue)
	If $tmp < 0 Or $tmp > 255 Then
		Return GUICtrlSetData($InBlue, GUICtrlRead($slBlue))
	EndIf
	GUICtrlSetData($slBlue, $tmp)
	_Slider2Hex()
EndFunc  ;==>_InBlueChange

Func _InHexChange()
	Local $tmp = GUICtrlRead($InHex)
	If Not StringRegExp($tmp, '(0x[0-9A-Fa-f]{6}(?!.))') Then
		Return _Slider2Hex()
	EndIf
	_Hex2Slider()
EndFunc  ;==>_InHexChange

Func _Slider2Hex()
	GUICtrlSetData($InBlue, GUICtrlRead($slBlue))
	GUICtrlSetData($InGreen, GUICtrlRead($slGreen))
	GUICtrlSetData($InRed, GUICtrlRead($slRed))
	Local $redHex = Hex(GUICtrlRead($slRed), 2)
	Local $greenHex = Hex(GUICtrlRead($slGreen), 2)
	Local $blueHex = Hex(GUICtrlRead($slBlue), 2)
	GUICtrlSetData($InHex, '0x' & $redHex & $greenHex & $blueHex)
	Local $iPreview
	If $fBGR Then
		$iPreview = '0x' & $blueHex & $greenHex & $redHex
	Else
		$iPreview = '0x' & $redHex & $greenHex & $blueHex
	EndIf
	GUICtrlSetBkColor($lbColorView, $iPreview)
EndFunc  ;==>_Slider2Hex

Func _Hex2Slider()
	Local $iHex = GUICtrlRead($InHex)
	Local $red = BitAND(BitShift($iHex,16), 0xFF)
	Local $green = BitAND(BitShift($iHex,8), 0xFF)
	Local $blue = BitAND($iHex, 0xFF)
	GUICtrlSetData($InRed, $red)
	GUICtrlSetData($InGreen, $green)
	GUICtrlSetData($InBlue, $blue)
	GUICtrlSetData($slRed, $red)
	GUICtrlSetData($slGreen, $green)
	GUICtrlSetData($slBlue, $blue)
	Local $iPreview
	If $fBGR Then
		$iPreview = _RGB2ABGR(Hex(GUICtrlRead($InHex),6),-1)
	Else
		$iPreview = GUICtrlRead($InHex)
	EndIf
	GUICtrlSetBkColor($lbColorView, $iPreview)
EndFunc  ;==>_Hex2Slider

; 3 Sektoren, je 120°; oben=0, rechts=1, links=2 ----> 0° sind in der Funktion bei 90° !!!
Func _DrawRadialGradientChangeSector($_iSector=-1, $_iColCenter=-1, $_iColBorder=-1)
	Local Static $aColor
	If $_iSector = -2 Then Return $aColor ; letzte Farben in INI schreiben
	If $_iSector = -3 Then
		$aColor = $_iColCenter ; Farben aus INI initialisieren (bei Aufruf Array an $_iColCenter)
		Return
	EndIf
	Local $hDC = _WinAPI_GetDC($hPic)
	Local $hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, 70, 70, 0xF0F0F0)
	Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC), $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
	If $_iSector <> -1 Then
		$aColor[$_iSector][0] = $_iColCenter = -1 ? $aColor[$_iSector][0] : $_iColCenter
		$aColor[$_iSector][1] = $_iColBorder = -1 ? $aColor[$_iSector][1] : $_iColBorder
	EndIf
    _WinAPI_RadialGradientFill($hDestDC, 30, 35, 30, $aColor[0][0], $aColor[0][1], -150, -30, 7)
    _WinAPI_RadialGradientFill($hDestDC, 30, 35, 30, $aColor[1][0], $aColor[1][1], -30, 90, 7)
    _WinAPI_RadialGradientFill($hDestDC, 30, 35, 30, $aColor[2][0], $aColor[2][1], 90, 210, 7)
	_WinAPI_ReleaseDC($hPic, $hDC)
	_WinAPI_SelectObject($hDestDC, $hDestSv)
	_WinAPI_DeleteDC($hDestDC)
	_SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
	Local $hObj = _SendMessage($hPic, $STM_GETIMAGE)
	If $hObj <> $hBitmap Then _WinAPI_DeleteObject($hBitmap)
EndFunc  ;==>_DrawRadialGradientChangeSector

Func _RadialGradientFill($hGraphic, $x1=-1, $y1=-1, $radius=-1, $left_color=-1, $right_color=-1)
	Local Static $start_color = $left_color, $end_color = $right_color
	If $hGraphic = -2 Then Return StringFormat('%s;%s', $start_color, $end_color) ; letzte Farben in INI schreiben
	If $hGraphic = -3 Then ; Farben aus INI initialisieren
		$start_color = $x1
		$end_color = $y1
		Return
	EndIf
	If $left_color <> -1 Then $start_color = $left_color
	If $right_color <> -1 Then $end_color = $right_color
	Local $left_red = BitAND(BitShift($start_color,16), 0xFF)
	Local $left_green = BitAND(BitShift($start_color,8), 0xFF)
	Local $left_blue = BitAND($start_color, 0xFF)
	Local $right_red = BitAND(BitShift($end_color,16), 0xFF)
	Local $right_green = BitAND(BitShift($end_color,8), 0xFF)
	Local $right_blue = BitAND($end_color, 0xFF)
    Local $color0 = ($left_red-$right_red)/$radius
    Local $color1 = ($left_green-$right_green)/$radius
    Local $color2 = ($left_blue-$right_blue)/$radius
	Local $red, $green, $blue, $col
    For $Y = $radius To 0 Step -1
        $red = $left_red - Floor($Y*$color0)
        $green = $left_green - Floor($Y*$color1)
        $blue = $left_blue - Floor($Y*$color2)
        ;Convert RGB to decimal
        $col = Dec(Hex($red,2) & Hex($green,2) & Hex($blue,2))
        GUICtrlSetGraphic($hGraphic, $GUI_GR_COLOR, $col, $col)
        GUICtrlSetGraphic($hGraphic, $GUI_GR_ELLIPSE, $x1-$Y, $y1-$Y, $Y*2, $Y*2)
    Next
	GUICtrlSetGraphic($hGraphic, $GUI_GR_REFRESH)
EndFunc  ;==>_RadialGradientFill
