OSDN Git Service

silverlight5
[psychlops/silverlight.git] / dev4 / psychlops / extention / standard / CIEColor.cs
1 using System;\r
2 \r
3 namespace Psychlops\r
4 {\r
5         namespace ColorSpaces\r
6         {\r
7                 /*\r
8                  * CIE 1931\r
9                  * R: 700 nm\r
10                  * G: 546.1 nm\r
11                  * B: 435.8 nm\r
12                  * White Point: Illuminant E\r
13                  */\r
14                 public struct CIERGB\r
15                 {\r
16                         public double R, G, B;\r
17 \r
18                         public CIEXYZ convertToCIEXYZ()\r
19                         {\r
20                                 double[,] b =\r
21                         { \r
22                                 { 0.49, 0.31, 0.20 },\r
23                                 { 0.17697, 0.81240, 0.01063 },\r
24                                 { 0.00, 0.01, 0.99 }\r
25                         };\r
26 \r
27                                 CIEXYZ v;\r
28 \r
29                                 v.X = b[0, 0] * R + b[0, 1] * G + b[0, 2] * B;\r
30                                 v.Y = b[1, 0] * R + b[1, 1] * G + b[1, 2] * B;\r
31                                 v.Z = b[2, 0] * R + b[2, 1] * G + b[2, 2] * B;\r
32 \r
33                                 return v;\r
34                         }\r
35                 }\r
36 \r
37                 /*\r
38                  * CIE 1931\r
39                  */\r
40                 public struct CIEXYZ\r
41                 {\r
42                         public double X, Y, Z;\r
43 \r
44                         public CIExyY convertToCIExyY()\r
45                         {\r
46                                 CIExyY v;\r
47 \r
48                                 double denominator = X + Y + Z;\r
49                                 v.x = X / denominator;\r
50                                 v.y = Y / denominator;\r
51                                 v.Y = Y;\r
52 \r
53                                 return v;\r
54                         }\r
55                 }\r
56 \r
57                 public struct CIExyY\r
58                 {\r
59                         public double x, y, Y;\r
60 \r
61                         public CIEXYZ convertToCIEXYZ()\r
62                         {\r
63                                 CIEXYZ v;\r
64 \r
65                                 v.X = Y / y * x;\r
66                                 v.Y = Y;\r
67                                 v.Z = Y / y * (1 - x - y);\r
68 \r
69                                 return v;\r
70                         }\r
71 \r
72                         // Yn = 1.0 when RGB of white point is { 1, 1, 1 }\r
73                         public CIELuv convertToCIELuv(double Yn = 1.0)\r
74                         {\r
75 \r
76                                 CIELuv v;\r
77 \r
78                                 double denominator = (-2 * x + 12 * y + 3);\r
79                                 double up = 4 * x / denominator;\r
80                                 double vp = 9 * y / denominator;\r
81 \r
82                                 double Yd = Y / Yn;\r
83                                 v.L = Yd > System.Math.Pow(6 / 29, 3) ? 116 * System.Math.Pow(Yd, 3) : System.Math.Pow(29 / 3, 3) * Yd;\r
84                                 v.u = 13 * v.L * (up - 0.2009);\r
85                                 v.v = 13 * v.L * (vp - 0.4610);\r
86 \r
87                                 return v;\r
88                         }\r
89                 }\r
90 \r
91                 /* L*u*v*\r
92                  * CIE 1976\r
93                  * standard illuminant C\r
94                  */\r
95                 public struct CIELuv\r
96                 {\r
97                         public double L, u, v;\r
98 \r
99                 }\r
100 \r
101                 public struct CIELab\r
102                 {\r
103                         public double L, a, b;\r
104 \r
105                 }\r
106 \r
107         }\r
108 }