5 namespace ColorSpaces
\r
9 public double H, S, V, A;
\r
11 public Color toRGB()
\r
13 if (S == 0.0) return new Color(V, V, V, A);
\r
14 int hi = (int)Math.floor(H/60.0);
\r
15 double f = (H / 60.0) - (double)hi,
\r
18 t = V*(1.0-(1.0-f)*S);
\r
19 if (hi == 0) { return new Color(V, t, p, A); }
\r
20 else if (hi == 1) { return new Color(q, V, p, A); }
\r
21 else if (hi == 2) { return new Color(p, V, t, A); }
\r
22 else if (hi == 3) { return new Color(p, q, V, A); }
\r
23 else if (hi == 4) { return new Color(t, p, V, A); }
\r
24 else if (hi == 5) { return new Color(V, p, q, A); }
\r
25 else return Color.transparent;
\r
28 public void fromRGB(Color o) {
\r
29 double MAX = Math.max(Math.max(o.r, o.g), o.b);
\r
30 double MIN = Math.min(Math.min(o.r, o.g), o.b);
\r
32 if(MAX==MIN) { h=0.0; }
\r
33 else if(o.r>o.g && o.r>o.b) { h=60.0*(o.g-o.b)/(MAX-MIN)+360.0; }
\r
34 else if(o.g>o.b) { h=60.0*(o.b-o.r)/(MAX-MIN)+120.0; }
\r
35 else { h=60.0*(o.r-o.g)/(MAX-MIN)+240.0; }
\r
36 h = Math.mod(h, 360.0);
\r
38 if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; }
\r
51 * White Point: Illuminant E
\r
53 public struct CIERGB
\r
55 public double R, G, B;
\r
57 public CIEXYZ convertToCIEXYZ()
\r
61 { 0.49, 0.31, 0.20 },
\r
62 { 0.17697, 0.81240, 0.01063 },
\r
63 { 0.00, 0.01, 0.99 }
\r
68 v.X = b[0, 0] * R + b[0, 1] * G + b[0, 2] * B;
\r
69 v.Y = b[1, 0] * R + b[1, 1] * G + b[1, 2] * B;
\r
70 v.Z = b[2, 0] * R + b[2, 1] * G + b[2, 2] * B;
\r
79 public struct CIEXYZ
\r
81 public double X, Y, Z;
\r
83 public CIExyY convertToCIExyY()
\r
87 double denominator = X + Y + Z;
\r
88 v.x = X / denominator;
\r
89 v.y = Y / denominator;
\r
96 public struct CIExyY
\r
98 public double x, y, Y;
\r
100 public CIEXYZ convertToCIEXYZ()
\r
106 v.Z = Y / y * (1 - x - y);
\r
111 // Yn = 1.0 when RGB of white point is { 1, 1, 1 }
\r
112 public CIELuv convertToCIELuv(double Yn = 1.0)
\r
117 double denominator = (-2 * x + 12 * y + 3);
\r
118 double up = 4 * x / denominator;
\r
119 double vp = 9 * y / denominator;
\r
121 double Yd = Y / Yn;
\r
122 v.L = Yd > System.Math.Pow(6 / 29, 3) ? 116 * System.Math.Pow(Yd, 3) : System.Math.Pow(29 / 3, 3) * Yd;
\r
123 v.u = 13 * v.L * (up - 0.2009);
\r
124 v.v = 13 * v.L * (vp - 0.4610);
\r
132 * standard illuminant C
\r
134 public struct CIELuv
\r
136 public double L, u, v;
\r
140 public struct CIELab
\r
142 public double L, a, b;
\r