25 using namespace crn::pixel;
29 static const auto xr = 0.4124;
30 static const auto xg = 0.3576;
31 static const auto xb = 0.1805;
33 static const auto yr = 0.2126;
34 static const auto yg = 0.7152;
35 static const auto yb = 0.0722;
37 static const auto zr = 0.0193;
38 static const auto zg = 0.1192;
39 static const auto zb = 0.9505;
41 auto var_R = p.
r / 255.0;
42 auto var_G = p.
g / 255.0;
43 auto var_B = p.
b / 255.0;
46 var_R = pow((var_R + 0.055) / 1.055, 2.4);
51 var_G = pow((var_G + 0.055) / 1.055, 2.4);
56 var_B = pow((var_B + 0.055) / 1.055, 2.4);
64 x = var_R * xr + var_G * xg + var_B * xb;
65 y = var_R * yr + var_G * yg + var_B * yb;
66 z = var_R * zr + var_G * zg + var_B * zb;
71 y = 0.299 * p.
r + 0.587 * p.
g + 0.114 * p.
b;
72 u = 0.492 * (p.
b -
y);
73 v = 0.877 * (p.
r -
y);
78 auto var_Y = (p.
l + 16) / 116.0;
79 auto var_X = p.
a / 500.0 + var_Y;
80 auto var_Z = var_Y - p.
b / 200.0;
82 if (pow(var_Y, 3) > 0.008856)
83 var_Y = pow(var_Y, 3);
85 var_Y = (var_Y - 16 / 116.0) / 7.787;
86 if (pow(var_X, 3) > 0.008856)
87 var_X = pow(var_X, 3);
89 var_X = (var_X - 16 / 116.0) / 7.787;
90 if (pow(var_Z, 3) > 0.008856)
91 var_Z = pow(var_Z, 3);
93 var_Z = (var_Z - 16 / 116.0) / 7.787;
102 auto var_Y = (p.
l + 16) / 116.0;
103 if (pow(var_Y, 3) > 0.008856)
104 var_Y = pow(var_Y, 3);
106 var_Y = (var_Y - 16 / 116.0) / 7.787;
108 static const auto ref_X = 95.047;
109 static const auto ref_Y = 100.000;
110 static const auto ref_Z = 108.883;
111 static const auto ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
112 static const auto ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
114 auto var_U = p.
u / (13 * p.
l) + ref_U;
115 auto var_V = p.
v / (13 * p.
l) + ref_V;
118 x = -( 9 *
y * var_U ) / ( ( var_U - 4 ) * var_V - var_U * var_V );
119 z = ( 9 *
y - ( 15 * var_V *
y ) - ( var_V *
x ) ) / ( 3 * var_V );
124 auto var_X = p.
x / 95.047;
125 auto var_Y = p.
y / 100.000;
126 auto var_Z = p.
z / 108.883;
128 if (var_X > 0.008856)
129 var_X = pow(var_X, 1/3.0);
131 var_X = (7.787 * var_X) + (16 / 116.0);
132 if (var_Y > 0.008856)
133 var_Y = pow(var_Y, 1/3.0);
135 var_Y = (7.787 * var_Y) + (16 / 116.0);
136 if (var_Z > 0.008856)
137 var_Z = pow(var_Z, 1/3.0);
139 var_Z = (7.787 * var_Z) + (16 / 116.0);
141 l = (116 * var_Y) - 16;
142 a = 500 * (var_X - var_Y);
143 b = 200 * (var_Y - var_Z);
148 static const auto ref_X = 95.047;
149 static const auto ref_Y = 100.000;
150 static const auto ref_Z = 108.883;
151 static const auto ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
152 static const auto ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) );
154 auto var_Y = p.
y / 100.0;
155 if (var_Y > 0.008856 )
156 var_Y = pow(var_Y, 1.0 / 3.0);
158 var_Y = ( 7.787 * var_Y ) + 16.0 / 116.0;
159 l = 116.0 * var_Y - 16.0;
161 auto denom = p.
x + 15 * p.
y + 3 * p.
z;
164 auto var_U = (4 * p.
x) / denom;
165 auto var_V = (9 * p.
y) / denom;
166 u= 13 *
l * (var_U - ref_U);
167 v= 13 *
l * (var_V - ref_V);