#Define _HLSMAX 240 #Define _RGBMAX 255 #Define _ACHROMATIC (_HLSMAX * 2 / 3) *+ hsl2rgbVal Function hsl2rgbVal(tnHue, tnSat, tnLum) Local lnRed, lnGreen, lnBlue, lnHue, lnSat, lnLum, i, F, p, q, T, lnMagic1, lnMagic2 If tnSat = 0 && _ACHROMATIC lnLum = Round(tnLum * _RGBMAX / _HLSMAX, 0) Return Rgb(lnLum, lnLum, lnLum) Endif * Chromatic lnLum = tnLum lnSat = tnSat * normalize hue to lie in 0<=h<360 lnHue = tnHue % 360 lnHue = Iif(lnHue < 0, lnHue * 360, 0) + lnHue * Set up magic numbers If (lnLum <= (_HLSMAX / 2)) lnMagic2 = (lnLum * (_HLSMAX + lnSat) + (_HLSMAX / 2)) / _HLSMAX Else lnMagic2 = lnLum + lnSat - ((lnLum * lnSat) + (_HLSMAX / 2)) / _HLSMAX Endif lnMagic1 = 2 *lnLum - lnMagic2 * Get RGB, change units from _HLSMAX to _RGBMAX lnRed = (This.hue2rgbVal(lnMagic1, lnMagic2, lnHue + (_HLSMAX / 3)) * _RGBMAX +(_HLSMAX / 2)) / _HLSMAX lnGreen = (This.hue2rgbVal(lnMagic1, lnMagic2, lnHue) * _RGBMAX + (_HLSMAX / 2)) / _HLSMAX lnBlue = (This.hue2rgbVal(lnMagic1, lnMagic2, lnHue - (_HLSMAX/3)) * _RGBMAX +(_HLSMAX / 2)) / _HLSMAX * Adjust for round errors lnRed = Int(Max(Min(lnRed, 255), 0)) lnGreen = Int(Max(Min(lnGreen, 255), 0)) lnBlue = Int(Max(Min(lnBlue, 255), 0)) Return Rgb(lnRed, lnGreen, lnBlue) Endfunc *+ rgb2hsl Function rgb2hsl(tnRed, tnGreen, tnBlue) Local lnMax, lnMin, lnHue, lnSaturation, lnLum, lnDiff, lnRDelta, lnGDelta, lnBDelta lnMax = Max(tnRed, tnGreen, tnBlue) lnMin = Min(tnRed, tnGreen, tnBlue) lnDiff = (lnMax-lnMin) lnLum = (((lnMax + lnMin) * _HLSMAX) + _RGBMAX) / (2 * _RGBMAX) If lnMax = lnMin && _ACHROMATIC lnSaturation = 0 lnHue = _ACHROMATIC Else && chromatic If (lnLum <= (_HLSMAX / 2)) lnSaturation = ((lnDiff * _HLSMAX) + ((lnMax + lnMin) / 2)) / (lnMax + lnMin) Else lnSaturation = ((lnDiff * _HLSMAX) + (2 * _RGBMAX - lnMax - lnMin) / 2) / (2 * _RGBMAX - lnMax - lnMin) Endif lnRDelta = (((lnMax - tnRed) * (_HLSMAX / 6)) + ((lnDiff) / 2)) / (lnDiff) lnGDelta = (((lnMax - tnGreen) * (_HLSMAX / 6)) + ((lnDiff) / 2)) / (lnDiff) lnBDelta = (((lnMax - tnBlue) * (_HLSMAX / 6)) + ((lnDiff) / 2)) / (lnDiff) Do Case Case tnRed = lnMax lnHue = lnBDelta - lnGDelta Case tnGreen = lnMax lnHue = (_HLSMAX / 3) + lnRDelta - lnBDelta Case tnBlue = lnMax lnHue = ((2 * _HLSMAX) / 3) + lnGDelta - lnRDelta Endcase lnHue = Int(lnHue) + Iif(lnHue < 0, _HLSMAX, Iif(lnHue > _HLSMAX, -_HLSMAX, 0)) Endif Return Alltrim(Str(lnHue)) + ',' + Alltrim(Str(Int(lnSaturation))) + ',' + Alltrim(Str(Int(lnLum))) Endfunc