OSDN Git Service

da
[psychlops/silverlight.git] / dev5 / psychlops / extension / standard / CIEColor.cs
1 using System;\r
2 \r
3 namespace Psychlops\r
4 {\r
5         namespace ColorSpaces\r
6         {\r
7                 public struct HSV\r
8                 {\r
9                         public double H, S, V, A;\r
10 \r
11                         public Color toRGB()\r
12                         {\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
16                                            p = V*(1.0-S),\r
17                                            q = V*(1.0-f*S),\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
26                         }\r
27 \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
31                                 double h;\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
37                                 double v = MAX, s;\r
38                                 if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; }\r
39                                 H = h;\r
40                                 S = s;\r
41                                 V = v;\r
42                                 A = o.a;\r
43                         }\r
44                 }\r
45 \r
46                 /*\r
47                  * CIE 1931\r
48                  * R: 700 nm\r
49                  * G: 546.1 nm\r
50                  * B: 435.8 nm\r
51                  * White Point: Illuminant E\r
52                  */\r
53                 public struct CIERGB\r
54                 {\r
55                         public double R, G, B;\r
56 \r
57                         public CIEXYZ convertToCIEXYZ()\r
58                         {\r
59                                 double[,] b =\r
60                         { \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
64                         };\r
65 \r
66                                 CIEXYZ v;\r
67 \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
71 \r
72                                 return v;\r
73                         }\r
74                 }\r
75 \r
76                 /*\r
77                  * CIE 1931\r
78                  */\r
79                 public struct CIEXYZ\r
80                 {\r
81                         public double X, Y, Z;\r
82 \r
83                         public CIExyY convertToCIExyY()\r
84                         {\r
85                                 CIExyY v;\r
86 \r
87                                 double denominator = X + Y + Z;\r
88                                 v.x = X / denominator;\r
89                                 v.y = Y / denominator;\r
90                                 v.Y = Y;\r
91 \r
92                                 return v;\r
93                         }\r
94                 }\r
95 \r
96                 public struct CIExyY\r
97                 {\r
98                         public double x, y, Y;\r
99 \r
100                         public CIEXYZ convertToCIEXYZ()\r
101                         {\r
102                                 CIEXYZ v;\r
103 \r
104                                 v.X = Y / y * x;\r
105                                 v.Y = Y;\r
106                                 v.Z = Y / y * (1 - x - y);\r
107 \r
108                                 return v;\r
109                         }\r
110 \r
111                         // Yn = 1.0 when RGB of white point is { 1, 1, 1 }\r
112                         public CIELuv convertToCIELuv(double Yn = 1.0)\r
113                         {\r
114 \r
115                                 CIELuv v;\r
116 \r
117                                 double denominator = (-2 * x + 12 * y + 3);\r
118                                 double up = 4 * x / denominator;\r
119                                 double vp = 9 * y / denominator;\r
120 \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
125 \r
126                                 return v;\r
127                         }\r
128                 }\r
129 \r
130                 /* L*u*v*\r
131                  * CIE 1976\r
132                  * standard illuminant C\r
133                  */\r
134                 public struct CIELuv\r
135                 {\r
136                         public double L, u, v;\r
137 \r
138                 }\r
139 \r
140                 public struct CIELab\r
141                 {\r
142                         public double L, a, b;\r
143 \r
144                 }\r
145 \r
146         }\r
147 }