Color.au3 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include-Once
  2. #include "AutoItConstants.au3"
  3. ; #INDEX# =======================================================================================================================
  4. ; Title .........: Color
  5. ; AutoIt Version : 3.3.14.5
  6. ; Language ..... : English
  7. ; Description ...: Functions that assist with color management.
  8. ; Author(s) .....: Ultima, Jon, Jpm
  9. ; ===============================================================================================================================
  10. ; #CONSTANTS# ===================================================================================================================
  11. Global Const $__COLORCONSTANTS_HSLMAX = 240
  12. Global Const $__COLORCONSTANTS_RGBMAX = 255
  13. ; ===============================================================================================================================
  14. ; #CURRENT# =====================================================================================================================
  15. ; _ColorConvertHSLtoRGB
  16. ; _ColorConvertRGBtoHSL
  17. ; _ColorGetBlue
  18. ; _ColorGetGreen
  19. ; _ColorGetRed
  20. ; _ColorGetCOLORREF
  21. ; _ColorGetRGB
  22. ; _ColorSetCOLORREF
  23. ; _ColorSetRGB
  24. ; ===============================================================================================================================
  25. ; #INTERNAL_USE_ONLY#==============================================================================
  26. ; __ColorConvertHueToRGB
  27. ; ===============================================================================================================================
  28. ; #FUNCTION# ====================================================================================================================
  29. ; Author ........: Ultima
  30. ; Modified.......:
  31. ; ===============================================================================================================================
  32. Func _ColorConvertHSLtoRGB($aArray)
  33. If UBound($aArray) <> 3 Or UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(1, 0, 0)
  34. Local $nR, $nG, $nB
  35. Local $nH = Number($aArray[0]) / $__COLORCONSTANTS_HSLMAX
  36. Local $nS = Number($aArray[1]) / $__COLORCONSTANTS_HSLMAX
  37. Local $nL = Number($aArray[2]) / $__COLORCONSTANTS_HSLMAX
  38. If $nS = 0 Then
  39. ; Grayscale
  40. $nR = $nL
  41. $nG = $nL
  42. $nB = $nL
  43. Else
  44. ; Chromatic
  45. Local $nValA, $nValB
  46. If $nL <= 0.5 Then
  47. $nValB = $nL * ($nS + 1)
  48. Else
  49. $nValB = ($nL + $nS) - ($nL * $nS)
  50. EndIf
  51. $nValA = 2 * $nL - $nValB
  52. $nR = __ColorConvertHueToRGB($nValA, $nValB, $nH + 1 / 3)
  53. $nG = __ColorConvertHueToRGB($nValA, $nValB, $nH)
  54. $nB = __ColorConvertHueToRGB($nValA, $nValB, $nH - 1 / 3)
  55. EndIf
  56. $aArray[0] = $nR * $__COLORCONSTANTS_RGBMAX
  57. $aArray[1] = $nG * $__COLORCONSTANTS_RGBMAX
  58. $aArray[2] = $nB * $__COLORCONSTANTS_RGBMAX
  59. Return $aArray
  60. EndFunc ;==>_ColorConvertHSLtoRGB
  61. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  62. ; Name...........: __ColorConvertHueToRGB
  63. ; Description ...: Helper function for converting HSL to RGB
  64. ; Syntax.........: __ColorConvertHueToRGB ( $nA, $nB, $nH )
  65. ; Parameters ....: $nA - Value A
  66. ; $nB - Value B
  67. ; $nH - Hue
  68. ; Return values .: A value based on value A and value B, dependent on the inputted hue
  69. ; Author ........: Ultima
  70. ; Modified.......:
  71. ; Remarks .......: For Internal Use Only
  72. ; Related .......: See: <a href="http://www.easyrgb.com/math.php?MATH=M19#text19">EasyRGB - Color mathematics and conversion formulas.</a>
  73. ; Link ..........:
  74. ; Example .......:
  75. ; ===============================================================================================================================
  76. Func __ColorConvertHueToRGB($nA, $nB, $nH)
  77. If $nH < 0 Then $nH += 1
  78. If $nH > 1 Then $nH -= 1
  79. If (6 * $nH) < 1 Then Return $nA + ($nB - $nA) * 6 * $nH
  80. If (2 * $nH) < 1 Then Return $nB
  81. If (3 * $nH) < 2 Then Return $nA + ($nB - $nA) * 6 * (2 / 3 - $nH)
  82. Return $nA
  83. EndFunc ;==>__ColorConvertHueToRGB
  84. ; #FUNCTION# ====================================================================================================================
  85. ; Author ........: Ultima
  86. ; Modified.......:
  87. ; ===============================================================================================================================
  88. Func _ColorConvertRGBtoHSL($aArray)
  89. If UBound($aArray) <> 3 Or UBound($aArray, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(1, 0, 0)
  90. Local $nH, $nS, $nL
  91. Local $nR = Number($aArray[0]) / $__COLORCONSTANTS_RGBMAX
  92. Local $nG = Number($aArray[1]) / $__COLORCONSTANTS_RGBMAX
  93. Local $nB = Number($aArray[2]) / $__COLORCONSTANTS_RGBMAX
  94. Local $nMax = $nR
  95. If $nMax < $nG Then $nMax = $nG
  96. If $nMax < $nB Then $nMax = $nB
  97. Local $nMin = $nR
  98. If $nMin > $nG Then $nMin = $nG
  99. If $nMin > $nB Then $nMin = $nB
  100. Local $nMinMaxSum = ($nMax + $nMin)
  101. Local $nMinMaxDiff = ($nMax - $nMin)
  102. ; Lightness
  103. $nL = $nMinMaxSum / 2
  104. If $nMinMaxDiff = 0 Then
  105. ; Grayscale
  106. $nH = 0
  107. $nS = 0
  108. Else
  109. ; Saturation
  110. If $nL < 0.5 Then
  111. $nS = $nMinMaxDiff / $nMinMaxSum
  112. Else
  113. $nS = $nMinMaxDiff / (2 - $nMinMaxSum)
  114. EndIf
  115. ; Hue
  116. Switch $nMax
  117. Case $nR
  118. $nH = ($nG - $nB) / (6 * $nMinMaxDiff)
  119. Case $nG
  120. $nH = ($nB - $nR) / (6 * $nMinMaxDiff) + 1 / 3
  121. Case $nB
  122. $nH = ($nR - $nG) / (6 * $nMinMaxDiff) + 2 / 3
  123. EndSwitch
  124. If $nH < 0 Then $nH += 1
  125. If $nH > 1 Then $nH -= 1
  126. EndIf
  127. $aArray[0] = $nH * $__COLORCONSTANTS_HSLMAX
  128. $aArray[1] = $nS * $__COLORCONSTANTS_HSLMAX
  129. $aArray[2] = $nL * $__COLORCONSTANTS_HSLMAX
  130. Return $aArray
  131. EndFunc ;==>_ColorConvertRGBtoHSL
  132. ; #FUNCTION# ====================================================================================================================
  133. ; Author ........: Jonathan Bennett <jon at autoitscript dot com>
  134. ; Modified.......:
  135. ; ===============================================================================================================================
  136. Func _ColorGetBlue($iColor)
  137. Return BitAND($iColor, 0xFF)
  138. EndFunc ;==>_ColorGetBlue
  139. ; #FUNCTION# ====================================================================================================================
  140. ; Author ........: Jonathan Bennett <jon at autoitscript dot com>
  141. ; Modified.......:
  142. ; ===============================================================================================================================
  143. Func _ColorGetGreen($iColor)
  144. Return BitAND(BitShift($iColor, 8), 0xFF)
  145. EndFunc ;==>_ColorGetGreen
  146. ; #FUNCTION# ====================================================================================================================
  147. ; Author ........: Jonathan Bennett <jon at autoitscript dot com>
  148. ; Modified.......:
  149. ; ===============================================================================================================================
  150. Func _ColorGetRed($iColor)
  151. Return BitAND(BitShift($iColor, 16), 0xFF)
  152. EndFunc ;==>_ColorGetRed
  153. ; #FUNCTION# ====================================================================================================================
  154. ; Author ........: jpm
  155. ; Modified.......:
  156. ; ===============================================================================================================================
  157. Func _ColorGetCOLORREF($iColor, Const $_iCurrentExtended = @extended)
  158. If BitAND($iColor, 0xFF000000) Then Return SetError(1, 0, 0) ; invalid color value
  159. Local $aColor[3]
  160. $aColor[2] = BitAND(BitShift($iColor, 16), 0xFF)
  161. $aColor[1] = BitAND(BitShift($iColor, 8), 0xFF)
  162. $aColor[0] = BitAND($iColor, 0xFF)
  163. Return SetExtended($_iCurrentExtended, $aColor)
  164. EndFunc ;==>_ColorGetCOLORREF
  165. ; #FUNCTION# ====================================================================================================================
  166. ; Author ........: jpm
  167. ; Modified.......:
  168. ; ===============================================================================================================================
  169. Func _ColorGetRGB($iColor, Const $_iCurrentExtended = @extended)
  170. If BitAND($iColor, 0xFF000000) Then Return SetError(1, 0, 0) ; invalid color value
  171. Local $aColor[3]
  172. $aColor[0] = BitAND(BitShift($iColor, 16), 0xFF)
  173. $aColor[1] = BitAND(BitShift($iColor, 8), 0xFF)
  174. $aColor[2] = BitAND($iColor, 0xFF)
  175. Return SetExtended($_iCurrentExtended, $aColor)
  176. EndFunc ;==>_ColorGetRGB
  177. ; #FUNCTION# ====================================================================================================================
  178. ; Author ........: jpm
  179. ; Modified.......:
  180. ; ===============================================================================================================================
  181. Func _ColorSetCOLORREF($aColor, Const $_iCurrentExtended = @extended)
  182. If UBound($aColor) <> 3 Then Return SetError(1, 0, -1) ; invalid array
  183. Local $iColor = 0, $iColorI
  184. For $i = 2 To 0 Step -1
  185. $iColor = BitShift($iColor, -8)
  186. $iColorI = $aColor[$i]
  187. If $iColorI < 0 Or $iColorI > 255 Then Return SetError(2, $i, -1) ; invalid color value
  188. $iColor += $iColorI
  189. Next
  190. Return SetExtended($_iCurrentExtended, $iColor)
  191. EndFunc ;==>_ColorSetCOLORREF
  192. ; #FUNCTION# ====================================================================================================================
  193. ; Author ........: jpm
  194. ; Modified.......:
  195. ; ===============================================================================================================================
  196. Func _ColorSetRGB($aColor, Const $_iCurrentExtended = @extended)
  197. If UBound($aColor) <> 3 Then Return SetError(1, 0, -1) ; invalid array
  198. Local $iColor = 0, $iColorI
  199. For $i = 0 To 2
  200. $iColor = BitShift($iColor, -8)
  201. $iColorI = $aColor[$i]
  202. If $iColorI < 0 Or $iColorI > 255 Then Return SetError(2, 0, -1) ; invalid color value
  203. $iColor += $iColorI
  204. Next
  205. Return SetExtended($_iCurrentExtended, $iColor)
  206. EndFunc ;==>_ColorSetRGB