#cs
	_RGB_to_CMY
	_CMY_to_RGB

	_RGB_to_XYZ
	_XYZ_to_RGB

	_RGB_to_HunterLab
	_HunterLab_to_RGB

	_RGB_to_CIELab
	_CIELab_to_RGB

	_RGB_to_HSV
	_HSV_to_RGB

	_XYZ_to_HunterLab
	_HunterLab_to_XYZ

	_XYZ_to_CIELab
	_CIELab_to_XYZ
#ce
;=======================================================================
;  einzig zu erklärender Parameter für alle Funktionen:
;
;  $retType  0-Standard  gibt Werte als Trennzeichnbasierter String zurück
;                        Trennzeichen ist das mit Opt('GUIDataSeparatorChar')
;                        definierte Zeichen (Standard '|')
;            1           gibt die Werte in einem Array zurück
;=======================================================================
#include-once
Func _RGB_to_CMY($iR, $iG, $iB, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iC = Round(1 - ($iR / 255), 5)
	Local $iM = Round(1 - ($iG / 255), 5)
	Local $iY = Round(1 - ($iB / 255), 5)
	If $retType Then
		Local $Out[3] = [$iC,$iM,$iY]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iC & $delim & $iM & $delim & $iY
	EndIf
	Return $Out
EndFunc  ;==>_RGB_to_CMY

Func _CMY_to_RGB($iC, $iM, $iY, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iR = Int((1 - $iC) * 255)
	Local $iG = Int((1 - $iM) * 255)
	Local $iB = Int((1 - $iY) * 255)
	If $retType Then
		Local $Out[3] = [$iR,$iG,$iB]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iR & $delim & $iG & $delim & $iB
	EndIf
	Return $Out
EndFunc  ;==>_CMY_to_RGB

Func _RGB_to_XYZ($iR, $iG, $iB, $retType=0); 0=String, 1=Array
	If $iR < 0 Or $iR > 255 Or $iG < 0 Or $iG > 255 Or $iB < 0 Or $iB > 255 Then Return SetError(1,0,0)
	If $retType <> 0 Then $retType = 1
	Local $iX, $iY, $iZ
	$iR /= 255
	$iG /= 255
	$iB /= 255
	If $iR > 0.04045 Then
		$iR = (($iR + 0.055 ) / 1.055 ) ^ 2.4
	Else
		$iR /= 12.92
	EndIf
	If $iG > 0.04045 Then
		$iG = (($iG + 0.055 ) / 1.055 ) ^ 2.4
	Else
		$iG /= 12.92
	EndIf
	If $iB > 0.04045 Then
		$iB = (($iB + 0.055 ) / 1.055 ) ^ 2.4
	Else
		$iB /= 12.92
	EndIf
	$iR *= 100
	$iG *= 100
	$iB *= 100
	; Observer = 2°, Illuminant = D65
	$iX = Round($iR * 0.4124 + $iG * 0.3576 + $iB * 0.1805, 3)
	$iY = Round($iR * 0.2126 + $iG * 0.7152 + $iB * 0.0722, 3)
	$iZ = Round($iR * 0.0193 + $iG * 0.1192 + $iB * 0.9505, 3)
	If $retType Then
		Local $Out[3] = [$iX,$iY,$iZ]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iX & $delim & $iY & $delim & $iZ
	EndIf
	Return $Out
EndFunc  ;==>_RGB_to_XYZ

Func _XYZ_to_RGB($iX, $iY, $iZ, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iR, $iG, $iB
	$iX /= 100
	$iY /= 100
	$iZ /= 100
	; Observer = 2°, Illuminant = D65
	$iR = ($iX *  3.2406) + ($iY * -1.5372) + ($iZ * -0.4986)
	$iG = ($iX * -0.9689) + ($iY *  1.8758) + ($iZ *  0.0415)
	$iB = ($iX *  0.0557) + ($iY * -0.2040) + ($iZ *  1.0570)
	If $iR > 0.0031308 Then
		$iR = 1.055 * ($iR ^ (1/2.4)) - 0.055
	Else
		$iR *= 12.92
	EndIf
	If $iG > 0.0031308 Then
		$iG = 1.055 * ($iG ^ (1/2.4)) - 0.055
	Else
		$iG *= 12.92
	EndIf
	If $iB > 0.0031308 Then
		$iB = 1.055 * ($iB ^ (1/2.4)) - 0.055
	Else
		$iB *= 12.92
	EndIf
	$iR = Int($iR*255)
	$iG = Int($iG*255)
	$iB = Int($iB*255)
	If $retType Then
		Local $Out[3] = [$iR,$iG,$iB]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iR & $delim & $iG & $delim & $iB
	EndIf
	Return $Out
EndFunc  ;==>_XYZ_to_RGB

Func _RGB_to_HunterLab($iR, $iG, $iB, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $aXYZ = _RGB_to_XYZ($iR, $iG, $iB, 1)
	Local $Out = _XYZ_to_HunterLab($aXYZ[0], $aXYZ[1], $aXYZ[2])
	If $retType Then
		Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
	Else
		Return $Out
	EndIf
EndFunc  ;==>_RGB_to_HunterLab

Func _HunterLab_to_RGB($H_L, $H_a, $H_b, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $aXYZ = _HunterLab_to_XYZ($H_L, $H_a, $H_b, 1)
	Local $Out = _XYZ_to_RGB($aXYZ[0], $aXYZ[1], $aXYZ[2])
	If $retType Then
		Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
	Else
		Return $Out
	EndIf
EndFunc  ;==>_HunterLab_to_RGB

Func _XYZ_to_HunterLab($iX, $iY, $iZ, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $H_L = Round(10 * Sqrt($iY), 3)
	Local $H_a = Round(17.5 * (((1.02 * $iX) - $iY) / Sqrt($iY)), 3)
	Local $H_b = Round(7 * (($iY - (0.847 * $iZ)) / Sqrt($iY)), 3)
	If $retType Then
		Local $Out[3] = [$H_L,$H_a,$H_b]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $H_L & $delim & $H_a & $delim & $H_b
	EndIf
	Return $Out
EndFunc  ;==>_XYZ_to_HunterLab

Func _HunterLab_to_XYZ($H_L, $H_a, $H_b, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iY = $H_L / 10
	Local $iX = $H_a / 17.5 * $H_L / 10
	Local $iZ = $H_b / 7 * $H_L / 10
	$iY = Round($iY ^ 2, 3)
	$iX = Round(($iX + $iY) / 1.02, 3)
	$iZ = Round(-1 * ($iZ - ($iY)) / 0.847, 3)
	If $retType Then
		Local $Out[3] = [$iX,$iY,$iZ]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iX & $delim & $iY & $delim & $iZ
	EndIf
	Return $Out
EndFunc  ;==>_HunterLab_to_XYZ

Func _XYZ_to_CIELab($iX, $iY, $iZ, $retType=0)
	If $retType <> 0 Then $retType = 1
	; Observer= 2°, Illuminant= D65
	$iX /= 95.047
	$iY /= 100
	$iZ /= 108.883
	If ($iX > 0.008856) Then
		$iX = $iX ^ (1/3)
	Else
		$iX = (7.787 * $iX) + (16 / 116)
	EndIf
	If ($iY > 0.008856) Then
		$iY = $iY ^ (1/3)
	Else
		$iY = (7.787 * $iY) + (16 / 116)
	EndIf
	If ($iZ > 0.008856) Then
		$iZ = $iZ ^ (1/3)
	Else
		$iZ = (7.787 * $iZ) + (16 / 116)
	EndIf
	Local $CIE_L = Round((116 * $iY) - 16, 3)
	Local $CIE_a = Round(500 * ($iX - $iY), 3)
	Local $CIE_b = Round(200 * ($iY - $iZ), 3)
	If $retType Then
		Local $Out[3] = [$CIE_L,$CIE_a,$CIE_b]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $CIE_L & $delim & $CIE_a & $delim & $CIE_b
	EndIf
	Return $Out
EndFunc  ;==>_XYZ_to_CIELab


Func _CIELab_to_XYZ($CIE_L, $CIE_a, $CIE_b, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iY = ($CIE_L + 16) / 116
	Local $iX = $CIE_a / 500 + $iY
	Local $iZ = $iY - $CIE_b / 200
	If ($iX^3 > 0.008856) Then
		$iX = $iX ^ 3
	Else
		$iX = ($iX - 16 / 116) / 7.787
	EndIf
	If ($iY^3 > 0.008856) Then
		$iY = $iY ^ 3
	Else
		$iY = ($iY - 16 / 116) / 7.787
	EndIf
	If ($iZ^3 > 0.008856) Then
		$iZ = $iZ ^ 3
	Else
		$iZ = ($iZ - 16 / 116) / 7.787
	EndIf
	; Observer = 2°, Illuminant = D65
	$iX = Round($iX * 95.047, 3)
	$iY = Round($iY * 100.000, 3)
	$iZ = Round($iZ * 108.883, 3)
	If $retType Then
		Local $Out[3] = [$iX,$iY,$iZ]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iX & $delim & $iY & $delim & $iZ
	EndIf
	Return $Out
EndFunc  ;==>_CIELab_to_XYZ

Func _RGB_to_CIELab($iR, $iG, $iB, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $aXYZ = _RGB_to_XYZ($iR, $iG, $iB, 1)
	Local $Out = _XYZ_to_CIELab($aXYZ[0], $aXYZ[1], $aXYZ[2])
	If $retType Then
		Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
	Else
		Return $Out
	EndIf
EndFunc  ;==>_RGB_to_CIELab

Func _CIELab_to_RGB($CIE_L, $CIE_a, $CIE_b, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $aXYZ = _CIELab_to_XYZ($CIE_L, $CIE_a, $CIE_b, 1)
	Local $Out = _XYZ_to_RGB($aXYZ[0], $aXYZ[1], $aXYZ[2])
	If $retType Then
		Return StringSplit($Out, Opt('GUIDataSeparatorChar'), 2)
	Else
		Return $Out
	EndIf
EndFunc  ;==>_CIELab_to_RGB

Func _RGB_to_HSV($iR, $iG, $iB, $retType=0)
	If $retType <> 0 Then $retType = 1
	$iR /= 255
	$iG /= 255
	$iB /= 255
	Local $Min = $iR
	If $iG < $Min Then $Min = $iG
	If $iB < $Min Then $Min = $iB
	Local $Max = $iR
	If $iG > $Max Then $Max = $iG
	If $iB > $Max Then $Max = $iB
	Local $Delta = $Max - $Min, $iH, $iS, $iV = $Max
	If $Delta = 0 Then
		$iH = 0
		$iS = 0
	Else
		$iS = $Delta / $Max
	    Local $del_R = ((($Max - $iR ) / 6) + ($Max / 2 )) / $Max
	    Local $del_G = ((($Max - $iG ) / 6) + ($Max / 2 )) / $Max
	    Local $del_B = ((($Max - $iB ) / 6) + ($Max / 2 )) / $Max
		If $iR = $Max Then
			$iH = $del_B - $del_G
		ElseIf $iG = $Max Then
			$iH = 1 / 3  + $del_R - $del_B
		Elseif $iB = $Max Then
			$iH = 2 / 3  + $del_G - $del_R
		EndIf
		If $iH < 0 Then $iH += 1
		If $iH > 1 Then $iH -= 1
	EndIf
	$iH = Round($iH, 4)
	$iS = Round($iS, 4)
	$iV = Round($iV, 4)
	If $retType Then
		Local $Out[3] = [$iH,$iS,$iV]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iH & $delim & $iS & $delim & $iV
	EndIf
	Return $Out
EndFunc  ;==>_RGB_to_HSV

Func _HSV_to_RGB($iH, $iS, $iV, $retType=0)
	If $retType <> 0 Then $retType = 1
	Local $iR, $iG, $iB
	If $iS = 0 Then
		$iR = Int($iV * 255)
		$iG = Int($iV * 255)
		$iB = Int($iV * 255)
	Else
		$iH *= 6
		If $iH = 6 Then $iH = 0
		Local $i = Int($iH)
		Local $1 = $iV * (1 - $iS)
		Local $2 = $iV * (1 - $iS * ($iH - $i))
		Local $3 = $iV * (1 - $iS * (1 - ($iH - $i)))
		Switch $i
			Case 0
				$iR = $iV
				$iG = $3
				$iB = $1
			Case 1
				$iR = $2
				$iG = $iV
				$iB = $1
			Case 2
				$iR = $1
				$iG = $iV
				$iB = $3
			Case 3
				$iR = $1
				$iG = $2
				$iB = $iV
			Case 4
				$iR = $3
				$iG = $1
				$iB = $iV
			Case Else
				$iR = $iV
				$iG = $1
				$iB = $2
		EndSwitch
		$iR = Int($iR * 255)
		$iG = Int($iG * 255)
		$iB = Int($iB * 255)
	EndIf
	If $retType Then
		Local $Out[3] = [$iR,$iG,$iB]
	Else
		Local $delim = Opt('GUIDataSeparatorChar')
		Local $Out = $iR & $delim & $iG & $delim & $iB
	EndIf
	Return $Out
EndFunc  ;==>_HSV_to_RGB
