public static Color AdjustHSL(this Color c, int h, int s, int l, bool colorize = false) { var cc = (ColorRGB)c; float hh = cc.H * 360, ss = cc.S * 100, ll = cc.L * 100; if (colorize) { hh = h; } else { hh += h; } ss += s; ll += l; var hhh = clip((int)hh, 360, 0); var sss = clip((int)ss, 100, 0); var lll = clip((int)ll, 100, 0); var rgb = ColorRGB.FromHSLA(hhh / 360.0, sss / 100.0, lll / 100.0, c.A); return(rgb); }
// Given H,S,L,A in range of 0-1 // Returns a Color (RGB struct) in range of 0-255 public static ColorRGB FromHSLA(double H, double S, double L, double A) { double v; double r, g, b; if (A > 1.0) { A = 1.0; } r = L; // default to gray g = L; b = L; v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S); if (v > 0) { double m; double sv; int sextant; double fract, vsf, mid1, mid2; m = L + L - v; sv = (v - m) / v; H *= 6.0; sextant = (int)H; fract = H - sextant; vsf = v * sv * fract; mid1 = m + vsf; mid2 = v - vsf; switch (sextant) { case 0: r = v; g = mid1; b = m; break; case 1: r = mid2; g = v; b = m; break; case 2: r = m; g = v; b = mid1; break; case 3: r = m; g = mid2; b = v; break; case 4: r = mid1; g = m; b = v; break; case 5: r = v; g = m; b = mid2; break; } } ColorRGB rgb = new ColorRGB(); rgb.R = Convert.ToByte(r * 255.0f); rgb.G = Convert.ToByte(g * 255.0f); rgb.B = Convert.ToByte(b * 255.0f); rgb.A = Convert.ToByte(A * 255.0f); return(rgb); }