#include-Once #include "AutoItConstants.au3" ; #INDEX# ======================================================================================================================= ; Title .........: Color ; AutoIt Version : 3.3.14.5 ; Language ..... : English ; Description ...: Functions that assist with color management. ; Author(s) .....: Ultima, Jon, Jpm ; =============================================================================================================================== ; #CONSTANTS# =================================================================================================================== Global Const $__COLORCONSTANTS_HSLMAX = 240 Global Const $__COLORCONSTANTS_RGBMAX = 255 ; =============================================================================================================================== ; #CURRENT# ===================================================================================================================== ; _ColorConvertHSLtoRGB ; _ColorConvertRGBtoHSL ; _ColorGetBlue ; _ColorGetGreen ; _ColorGetRed ; _ColorGetCOLORREF ; _ColorGetRGB ; _ColorSetCOLORREF ; _ColorSetRGB ; =============================================================================================================================== ; #INTERNAL_USE_ONLY#============================================================================== ; __ColorConvertHueToRGB ; =============================================================================================================================== ; #FUNCTION# ==================================================================================================================== ; Author ........: Ultima ; Modified.......: ; =============================================================================================================================== Func _ColorConvertHSLtoRGB($aArray) If UBound($aArray) <> 3 Or UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(1, 0, 0) Local $nR, $nG, $nB Local $nH = Number($aArray[0]) / $__COLORCONSTANTS_HSLMAX Local $nS = Number($aArray[1]) / $__COLORCONSTANTS_HSLMAX Local $nL = Number($aArray[2]) / $__COLORCONSTANTS_HSLMAX If $nS = 0 Then ; Grayscale $nR = $nL $nG = $nL $nB = $nL Else ; Chromatic Local $nValA, $nValB If $nL <= 0.5 Then $nValB = $nL * ($nS + 1) Else $nValB = ($nL + $nS) - ($nL * $nS) EndIf $nValA = 2 * $nL - $nValB $nR = __ColorConvertHueToRGB($nValA, $nValB, $nH + 1 / 3) $nG = __ColorConvertHueToRGB($nValA, $nValB, $nH) $nB = __ColorConvertHueToRGB($nValA, $nValB, $nH - 1 / 3) EndIf $aArray[0] = $nR * $__COLORCONSTANTS_RGBMAX $aArray[1] = $nG * $__COLORCONSTANTS_RGBMAX $aArray[2] = $nB * $__COLORCONSTANTS_RGBMAX Return $aArray EndFunc ;==>_ColorConvertHSLtoRGB ; #INTERNAL_USE_ONLY# =========================================================================================================== ; Name...........: __ColorConvertHueToRGB ; Description ...: Helper function for converting HSL to RGB ; Syntax.........: __ColorConvertHueToRGB ( $nA, $nB, $nH ) ; Parameters ....: $nA - Value A ; $nB - Value B ; $nH - Hue ; Return values .: A value based on value A and value B, dependent on the inputted hue ; Author ........: Ultima ; Modified.......: ; Remarks .......: For Internal Use Only ; Related .......: See: EasyRGB - Color mathematics and conversion formulas. ; Link ..........: ; Example .......: ; =============================================================================================================================== Func __ColorConvertHueToRGB($nA, $nB, $nH) If $nH < 0 Then $nH += 1 If $nH > 1 Then $nH -= 1 If (6 * $nH) < 1 Then Return $nA + ($nB - $nA) * 6 * $nH If (2 * $nH) < 1 Then Return $nB If (3 * $nH) < 2 Then Return $nA + ($nB - $nA) * 6 * (2 / 3 - $nH) Return $nA EndFunc ;==>__ColorConvertHueToRGB ; #FUNCTION# ==================================================================================================================== ; Author ........: Ultima ; Modified.......: ; =============================================================================================================================== Func _ColorConvertRGBtoHSL($aArray) If UBound($aArray) <> 3 Or UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(1, 0, 0) Local $nH, $nS, $nL Local $nR = Number($aArray[0]) / $__COLORCONSTANTS_RGBMAX Local $nG = Number($aArray[1]) / $__COLORCONSTANTS_RGBMAX Local $nB = Number($aArray[2]) / $__COLORCONSTANTS_RGBMAX Local $nMax = $nR If $nMax < $nG Then $nMax = $nG If $nMax < $nB Then $nMax = $nB Local $nMin = $nR If $nMin > $nG Then $nMin = $nG If $nMin > $nB Then $nMin = $nB Local $nMinMaxSum = ($nMax + $nMin) Local $nMinMaxDiff = ($nMax - $nMin) ; Lightness $nL = $nMinMaxSum / 2 If $nMinMaxDiff = 0 Then ; Grayscale $nH = 0 $nS = 0 Else ; Saturation If $nL < 0.5 Then $nS = $nMinMaxDiff / $nMinMaxSum Else $nS = $nMinMaxDiff / (2 - $nMinMaxSum) EndIf ; Hue Switch $nMax Case $nR $nH = ($nG - $nB) / (6 * $nMinMaxDiff) Case $nG $nH = ($nB - $nR) / (6 * $nMinMaxDiff) + 1 / 3 Case $nB $nH = ($nR - $nG) / (6 * $nMinMaxDiff) + 2 / 3 EndSwitch If $nH < 0 Then $nH += 1 If $nH > 1 Then $nH -= 1 EndIf $aArray[0] = $nH * $__COLORCONSTANTS_HSLMAX $aArray[1] = $nS * $__COLORCONSTANTS_HSLMAX $aArray[2] = $nL * $__COLORCONSTANTS_HSLMAX Return $aArray EndFunc ;==>_ColorConvertRGBtoHSL ; #FUNCTION# ==================================================================================================================== ; Author ........: Jonathan Bennett ; Modified.......: ; =============================================================================================================================== Func _ColorGetBlue($iColor) Return BitAND($iColor, 0xFF) EndFunc ;==>_ColorGetBlue ; #FUNCTION# ==================================================================================================================== ; Author ........: Jonathan Bennett ; Modified.......: ; =============================================================================================================================== Func _ColorGetGreen($iColor) Return BitAND(BitShift($iColor, 8), 0xFF) EndFunc ;==>_ColorGetGreen ; #FUNCTION# ==================================================================================================================== ; Author ........: Jonathan Bennett ; Modified.......: ; =============================================================================================================================== Func _ColorGetRed($iColor) Return BitAND(BitShift($iColor, 16), 0xFF) EndFunc ;==>_ColorGetRed ; #FUNCTION# ==================================================================================================================== ; Author ........: jpm ; Modified.......: ; =============================================================================================================================== Func _ColorGetCOLORREF($iColor, Const $_iCurrentExtended = @extended) If BitAND($iColor, 0xFF000000) Then Return SetError(1, 0, 0) ; invalid color value Local $aColor[3] $aColor[2] = BitAND(BitShift($iColor, 16), 0xFF) $aColor[1] = BitAND(BitShift($iColor, 8), 0xFF) $aColor[0] = BitAND($iColor, 0xFF) Return SetExtended($_iCurrentExtended, $aColor) EndFunc ;==>_ColorGetCOLORREF ; #FUNCTION# ==================================================================================================================== ; Author ........: jpm ; Modified.......: ; =============================================================================================================================== Func _ColorGetRGB($iColor, Const $_iCurrentExtended = @extended) If BitAND($iColor, 0xFF000000) Then Return SetError(1, 0, 0) ; invalid color value Local $aColor[3] $aColor[0] = BitAND(BitShift($iColor, 16), 0xFF) $aColor[1] = BitAND(BitShift($iColor, 8), 0xFF) $aColor[2] = BitAND($iColor, 0xFF) Return SetExtended($_iCurrentExtended, $aColor) EndFunc ;==>_ColorGetRGB ; #FUNCTION# ==================================================================================================================== ; Author ........: jpm ; Modified.......: ; =============================================================================================================================== Func _ColorSetCOLORREF($aColor, Const $_iCurrentExtended = @extended) If UBound($aColor) <> 3 Then Return SetError(1, 0, -1) ; invalid array Local $iColor = 0, $iColorI For $i = 2 To 0 Step -1 $iColor = BitShift($iColor, -8) $iColorI = $aColor[$i] If $iColorI < 0 Or $iColorI > 255 Then Return SetError(2, $i, -1) ; invalid color value $iColor += $iColorI Next Return SetExtended($_iCurrentExtended, $iColor) EndFunc ;==>_ColorSetCOLORREF ; #FUNCTION# ==================================================================================================================== ; Author ........: jpm ; Modified.......: ; =============================================================================================================================== Func _ColorSetRGB($aColor, Const $_iCurrentExtended = @extended) If UBound($aColor) <> 3 Then Return SetError(1, 0, -1) ; invalid array Local $iColor = 0, $iColorI For $i = 0 To 2 $iColor = BitShift($iColor, -8) $iColorI = $aColor[$i] If $iColorI < 0 Or $iColorI > 255 Then Return SetError(2, 0, -1) ; invalid color value $iColor += $iColorI Next Return SetExtended($_iCurrentExtended, $iColor) EndFunc ;==>_ColorSetRGB