24static inline float4
matrix_dot(
const float4 vector,
const float4 matrix[3])
27 const float4 vector_copy = { vector.x, vector.y, vector.z, 0.f };
28 output.x =
dot(vector_copy, matrix[0]);
29 output.y =
dot(vector_copy, matrix[1]);
30 output.z =
dot(vector_copy, matrix[2]);
36static inline float4
matrix_product(
const float4 xyz, constant
const float *
const matrix)
38 const float R = matrix[0] * xyz.x + matrix[1] * xyz.y + matrix[2] * xyz.z;
39 const float G = matrix[3] * xyz.x + matrix[4] * xyz.y + matrix[5] * xyz.z;
40 const float B = matrix[6] * xyz.x + matrix[7] * xyz.y + matrix[8] * xyz.z;
41 const float a = xyz.w;
42 return (float4)(
R, G,
B, a);
48 const float R = matrix[0] * xyz.x + matrix[1] * xyz.y + matrix[2] * xyz.z;
49 const float G = matrix[4] * xyz.x + matrix[5] * xyz.y + matrix[6] * xyz.z;
50 const float B = matrix[8] * xyz.x + matrix[9] * xyz.y + matrix[10] * xyz.z;
51 const float a = xyz.w;
52 return (float4)(
R, G,
B, a);
61 const float L =
Lab.x;
64 return (float4)(L, C,
H,
Lab.w);
70 const float L = LCH.x;
71 const float a = cos(2.0f*
M_PI_F*LCH.z) * LCH.y;
72 const float b = sin(2.0f*
M_PI_F*LCH.z) * LCH.y;
74 return (float4)(L, a, b, LCH.w);
78static inline float4
lab_f(float4 x)
80 const float4 epsilon = 216.0f / 24389.0f;
81 const float4 kappa = 24389.0f / 27.0f;
82 return (x > epsilon) ? native_powr(x, (float4)(1.0f/3.0f)) : (kappa * x + (float4)16.0f) / ((float4)116.0f);
89 const float4
d50 = (float4)(0.9642f, 1.0f, 0.8249f, 1.0f);
91 lab.x = 116.0f * xyz.y - 16.0f;
92 lab.y = 500.0f * (xyz.x - xyz.y);
93 lab.z = 200.0f * (xyz.y - xyz.z);
101 const float4 epsilon = 0.206896551f;
102 const float4 kappa = 24389.0f / 27.0f;
103 return (x > epsilon) ? x*x*x : ((float4)116.0f * x - (float4)16.0f)/kappa;
109 const float4
d50 = (float4)(0.9642f, 1.0f, 0.8249f, 0.0f);
111 f.y = (
Lab.x + 16.0f)/116.0f;
112 f.x =
Lab.y/500.0f +
f.y;
113 f.z =
f.y -
Lab.z/200.0f;
119 const float rgb_to_xyz[3][3] = {
120 {0.7976749f, 0.1351917f, 0.0313534f},
121 {0.2880402f, 0.7118741f, 0.0000857f},
122 {0.0000000f, 0.0000000f, 0.8252100f},
124 float4 XYZ = (float4)(0.0f, 0.0f, 0.0f, 0.0f);
125 XYZ.x += rgb_to_xyz[0][0] * rgb.x;
126 XYZ.x += rgb_to_xyz[0][1] * rgb.y;
127 XYZ.x += rgb_to_xyz[0][2] * rgb.z;
128 XYZ.y += rgb_to_xyz[1][0] * rgb.x;
129 XYZ.y += rgb_to_xyz[1][1] * rgb.y;
130 XYZ.y += rgb_to_xyz[1][2] * rgb.z;
131 XYZ.z += rgb_to_xyz[2][0] * rgb.x;
132 XYZ.z += rgb_to_xyz[2][1] * rgb.y;
133 XYZ.z += rgb_to_xyz[2][2] * rgb.z;
139 const float xyz_to_rgb[3][3] = {
140 { 1.3459433f, -0.2556075f, -0.0511118f},
141 {-0.5445989f, 1.5081673f, 0.0205351f},
142 { 0.0000000f, 0.0000000f, 1.2118128f},
144 float4 rgb = (float4)(0.0f, 0.0f, 0.0f, 0.0f);
145 rgb.x += xyz_to_rgb[0][0] * XYZ.x;
146 rgb.x += xyz_to_rgb[0][1] * XYZ.y;
147 rgb.x += xyz_to_rgb[0][2] * XYZ.z;
148 rgb.y += xyz_to_rgb[1][0] * XYZ.x;
149 rgb.y += xyz_to_rgb[1][1] * XYZ.y;
150 rgb.y += xyz_to_rgb[1][2] * XYZ.z;
151 rgb.z += xyz_to_rgb[2][0] * XYZ.x;
152 rgb.z += xyz_to_rgb[2][1] * XYZ.y;
153 rgb.z += xyz_to_rgb[2][2] * XYZ.z;
174 const float R = RGB.x;
175 const float G = RGB.y;
176 const float B = RGB.z;
178 const float var_Min = fmin(
R, fmin(G,
B));
179 const float var_Max = fmax(
R, fmax(G,
B));
180 const float del_Max = var_Max - var_Min;
182 L = (var_Max + var_Min) / 2.0f;
191 if (L < 0.5f)
S = del_Max / (var_Max + var_Min);
192 else S = del_Max / (2.0f - var_Max - var_Min);
194 const float del_R = (((var_Max -
R) / 6.0f) + (del_Max / 2.0f)) / del_Max;
195 const float del_G = (((var_Max - G) / 6.0f) + (del_Max / 2.0f)) / del_Max;
196 const float del_B = (((var_Max -
B) / 6.0f) + (del_Max / 2.0f)) / del_Max;
198 if (
R == var_Max)
H = del_B - del_G;
199 else if (G == var_Max)
H = (1.0f / 3.0f) + del_R - del_B;
200 else if (
B == var_Max)
H = (2.0f / 3.0f) + del_G - del_R;
202 if (
H < 0.0f)
H += 1.0f;
203 if (
H > 1.0f)
H -= 1.0f;
206 return (float4)(
H,
S, L, RGB.w);
211static inline float Hue_2_RGB(
float v1,
float v2,
float vH)
213 if (vH < 0.0f) vH += 1.0f;
214 if (vH > 1.0f) vH -= 1.0f;
215 if ((6.0f * vH) < 1.0f)
return (v1 + (v2 - v1) * 6.0f * vH);
216 if ((2.0f * vH) < 1.0f)
return (v2);
217 if ((3.0f * vH) < 2.0f)
return (v1 + (v2 - v1) * ((2.0f / 3.0f) - vH) * 6.0f);
227 const float H =
HSL.x;
228 const float S =
HSL.y;
229 const float L =
HSL.z;
239 if (L < 0.5f) var_2 = L * (1.0f +
S);
240 else var_2 = (L +
S) - (
S * L);
242 var_1 = 2.0f * L - var_2;
250 return (float4)(
R, G,
B,
HSL.w);
257 const float minv = fmin(RGB.x, fmin(RGB.y, RGB.z));
258 const float maxv = fmax(RGB.x, fmax(RGB.y, RGB.z));
259 const float delta = maxv - minv;
264 if(fabs(maxv) > 1e-6f && fabs(delta) > 1e-6f)
266 HSV.y = delta / maxv;
276 HSV.x = (RGB.y - RGB.z) / delta;
277 else if (RGB.y == maxv)
278 HSV.x = 2.0f + (RGB.z - RGB.x) / delta;
280 HSV.x = 4.0f + (RGB.x - RGB.y) / delta;
294 if (fabs(HSV.y) < 1e-6f)
296 RGB.x = RGB.y = RGB.z = HSV.z;
301 const int i = floor(6.0f*HSV.x);
302 const float v = HSV.z;
303 const float w = HSV.w;
304 const float p = v * (1.0f - HSV.y);
305 const float q = v * (1.0f - HSV.y * (6.0f*HSV.x - i));
306 const float t = v * (1.0f - HSV.y * (1.0f - (6.0f*HSV.x - i)));
311 RGB = (float4)(v, t, p, w);
314 RGB = (float4)(q, v, p, w);
317 RGB = (float4)(p, v, t, w);
320 RGB = (float4)(p, q, v, w);
323 RGB = (float4)(t, p, v, w);
327 RGB = (float4)(v, p, q, w);
339 sRGB.x = 3.1338561f * XYZ.x - 1.6168667f * XYZ.y - 0.4906146f * XYZ.z;
340 sRGB.y = -0.9787684f * XYZ.x + 1.9161415f * XYZ.y + 0.0334540f * XYZ.z;
341 sRGB.z = 0.0719453f * XYZ.x - 0.2289914f * XYZ.y + 1.4052427f * XYZ.z;
353 XYZ.x = 0.4360747f * sRGB.x + 0.3850649f * sRGB.y + 0.1430804f * sRGB.z;
354 XYZ.y = 0.2225045f * sRGB.x + 0.7168786f * sRGB.y + 0.0606169f * sRGB.z;
355 XYZ.z = 0.0139322f * sRGB.x + 0.0971045f * sRGB.y + 0.7141733f * sRGB.z;
364 const float4 M[3] = { { 0.41478972f, 0.579999f, 0.0146480f, 0.0f },
365 { -0.2015100f, 1.120649f, 0.0531008f, 0.0f },
366 { -0.0166008f, 0.264800f, 0.6684799f, 0.0f } };
368 const float4
A[3] = { { 0.5f, 0.5f, 0.0f, 0.0f },
369 { 3.524000f, -4.066708f, 0.542708f, 0.0f },
370 { 0.199076f, 1.096799f, -1.295875f, 0.0f } };
374 temp1.x = 1.15f * XYZ_D65.x - 0.15f * XYZ_D65.z;
375 temp1.y = 0.66f * XYZ_D65.y + 0.34f * XYZ_D65.x;
379 temp2.x =
dot(M[0], temp1);
380 temp2.y =
dot(M[1], temp1);
381 temp2.z =
dot(M[2], temp1);
384 temp2 = native_powr(fmax(temp2 / 10000.f, 0.0f), 0.159301758f);
385 temp2 = native_powr((0.8359375f + 18.8515625f * temp2) / (1.0f + 18.6875f * temp2), 134.034375f);
387 temp1.x =
dot(
A[0], temp2);
388 temp1.y =
dot(
A[1], temp2);
389 temp1.z =
dot(
A[2], temp2);
391 temp1.x = fmax(0.44f * temp1.x / (1.0f - 0.56f * temp1.x) - 1.6295499532821566e-11f, 0.f);
398 const float b = 1.15f;
399 const float g = 0.66f;
400 const float c1 = 0.8359375f;
401 const float c2 = 18.8515625f;
402 const float c3 = 18.6875f;
403 const float n_inv = 1.0f / 0.159301758f;
404 const float p_inv = 1.0f / 134.034375f;
405 const float d = -0.56f;
406 const float d0 = 1.6295499532821566e-11f;
407 const float4 MI[3] = { { 1.9242264357876067f, -1.0047923125953657f, 0.0376514040306180f, 0.0f },
408 { 0.3503167620949991f, 0.7264811939316552f, -0.0653844229480850f, 0.0f },
409 { -0.0909828109828475f, -0.3127282905230739f, 1.5227665613052603f, 0.0f } };
410 const float4 AI[3] = { { 1.0f, 0.1386050432715393f, 0.0580473161561189f, 0.0f },
411 { 1.0f, -0.1386050432715393f, -0.0580473161561189f, 0.0f },
412 { 1.0f, -0.0960192420263190f, -0.8118918960560390f, 0.0f } };
414 float4 XYZ, LMS, IzAzBz;
418 IzAzBz.x = fmax(IzAzBz.x / (1.0f + d - d * IzAzBz.x), 0.f);
420 LMS.x =
dot(AI[0], IzAzBz);
421 LMS.y =
dot(AI[1], IzAzBz);
422 LMS.z =
dot(AI[2], IzAzBz);
425 LMS = native_powr(fmax(LMS, 0.0f), p_inv);
426 LMS = 10000.f * native_powr(fmax((
c1 - LMS) / (c3 * LMS -
c2), 0.0f), n_inv);
428 XYZ.x =
dot(MI[0], LMS);
429 XYZ.y =
dot(MI[1], LMS);
430 XYZ.z =
dot(MI[2], LMS);
434 XYZ_D65.x = (XYZ.x + (b - 1.0f) * XYZ.z) / b;
435 XYZ_D65.y = (XYZ.y + (g - 1.0f) * XYZ_D65.x) / g;
437 XYZ_D65.w = JzAzBz.w;
444 const float h = atan2(JzAzBz.z, JzAzBz.y) / (2.0f *
M_PI_F);
447 JzCzhz.y = native_sqrt(JzAzBz.y * JzAzBz.y + JzAzBz.z * JzAzBz.z);
448 JzCzhz.z = (h >= 0.0f) ? h : 1.0f + h;
465 = { { 0.257085f, 0.859943f, -0.031061f, 0.f },
466 { -0.394427f, 1.175800f, 0.106423f, 0.f },
467 { 0.064856f, -0.076250f, 0.559067f, 0.f } };
476 = { { 1.80794659f, -1.29971660f, 0.34785879f, 0.f },
477 { 0.61783960f, 0.39595453f, -0.04104687f, 0.f },
478 { -0.12546960f, 0.20478038f, 1.74274183f, 0.f } };
494 = { { 0.95f, 0.38f, 0.00f, 0.f },
495 { 0.05f, 0.62f, 0.03f, 0.f },
496 { 0.00f, 0.00f, 0.97f, 0.f } };
504 = { { 1.0877193f, -0.66666667f, 0.02061856f, 0.f },
505 { -0.0877193f, 1.66666667f, -0.05154639f, 0.f },
506 { 0.f, 0.f, 1.03092784f, 0.f } };
519 const float Y = 0.68990272f * LMS.x + 0.34832189f * LMS.y;
522 const float a = LMS.x + LMS.y + LMS.z;
523 const float4 lms = (a == 0.f) ? 0.f : LMS / a;
528 return (float4)(Y, rgb.x, rgb.y, LMS.w);
534 const float Y = Yrg.x;
537 const float r = Yrg.y;
538 const float g = Yrg.z;
539 const float b = 1.f - r - g;
540 const float4 rgb = { r, g, b, 0.f };
546 const float denom = (0.68990272f * lms.x + 0.34832189f * lms.y);
547 const float a = (denom == 0.f) ? 0.f : Y / denom;
558 const float Y = Yrg.x;
563 const float r = Yrg.y - 0.21902143f;
564 const float g = Yrg.z - 0.54371398f;
565 const float c = hypot(g, r);
566 const float h = atan2(g, r);
567 return (float4)(Y, c, h, Yrg.w);
573 const float Y = Ych.x;
574 const float c = Ych.y;
575 const float h = Ych.z;
576 const float r = c * native_cos(h) + 0.21902143f;
577 const float g = c * native_sin(h) + 0.54371398f;
578 return (float4)(Y, r, g, Ych.w);
590 const float denominator = -2.f * xyY.x + 12.f * xyY.y + 3.f;
592 uvY.x = 4.f * xyY.x / denominator;
593 uvY.y = 9.f * xyY.y / denominator;
608 const float denominator = 6.0f * uvY.x - 16.f * uvY.y + 12.0f;
610 xyY.x = 9.f * uvY.x / denominator;
611 xyY.y = 4.f * uvY.y / denominator;
620 const float sum = XYZ.x + XYZ.y + XYZ.z;
621 xyY.xy = XYZ.xy / sum;
630 XYZ.x = xyY.z * xyY.x / xyY.y;
632 XYZ.z = xyY.z * (1.f - xyY.x - xyY.y) / xyY.y;
643 { -0.7502f, 1.7135f, 0.0367f, 0.f },
644 { 0.0389f, -0.0685f, 1.0296f, 0.f } };
653 { 0.4323f, 0.5184f, 0.0493f, 0.f },
654 { -0.0085f, 0.0400f, 0.9685f, 0.f } };
662 const float4
XYZ_to_CAT16_LMS[3] = { { 0.401288f, 0.650173f, -0.051461f, 0.f },
663 { -0.250268f, 1.204414f, 0.045854f, 0.f },
664 { -0.002079f, 0.048952f, 0.953127f, 0.f } };
672 const float4
CAT16_LMS_to_XYZ[3] = { { 1.862068f, -1.011255f, 0.149187f, 0.f },
673 { 0.38752f , 0.621447f, -0.008974f, 0.f },
674 { -0.015841f, -0.034123f, 1.049964f, 0.f } };
680 const float4 origin_illuminant,
681 const float p,
const int full)
689 const float4 D50 = { 0.996078f, 1.020646f, 0.818155f, 0.f };
693 float4 temp = *lms_in / origin_illuminant;
696 temp.z = (temp.z > 0.f) ? native_powr(temp.z, p) : temp.z;
698 *lms_in = D50 * temp;
701 *lms_in *= D50 / origin_illuminant;
705 const float4 origin_illuminant,
706 const float D,
const int full)
713 const float4 D50 = { 0.994535f, 1.000997f, 0.833036f, 0.f };
715 if(full) *lms_in *= D50 / origin_illuminant;
716 else *lms_in *= (D * D50 / origin_illuminant + 1.f - D);
720 const float4 origin_illuminant)
726 const float4 D50 = { 0.9642119944211994f, 1.0f, 0.8251882845188288f, 0.f };
727 *lms_in *= D50 / origin_illuminant;
737 const float D65_r = 0.21902143f;
738 const float D65_g = 0.54371398f;
740 const float cos_h = native_cos(Ych.z);
741 const float sin_h = native_sin(Ych.z);
745 max_c = fmin(-D65_r / cos_h, max_c);
749 max_c = fmin(-D65_g / sin_h, max_c);
751 if(Yrg.y + Yrg.z > 1.f)
753 max_c = fmin((1.f - D65_r - D65_g) / (cos_h + sin_h), max_c);
774 const float Y_hat = native_powr(Y, 0.631651345306265f);
775 return 2.098883786377f * Y_hat / (Y_hat + 1.12426773749357f);
781 return native_powr((1.12426773749357f * L_star / (2.098883786377f - L_star)), 1.5831518565279648f);
786 float4 x_factors = { -0.783941002840055f, 0.745273540913283f, 0.318707282433486f, 0.f };
787 float4 y_factors = { 0.277512987809202f, -0.205375866083878f, 2.16743692732158f, 0.f };
788 float4 offsets = { 0.153836578598858f, -0.165478376301988f, 0.291320554395942f, 0.f };
790 float4 UVD = x_factors * xyY.x + y_factors * xyY.y + offsets;
793 float UV_star[2] = { 0.f };
794 const float factors[2] = { 1.39656225667f, 1.4513954287f };
795 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
796 for(
int c = 0; c < 2; c++)
797 UV_star[c] = factors[c] * ((
float *)&UVD)[c] / (fabs(((
float *)&UVD)[c]) + half_values[c]);
800 UV_star_prime[0] = -1.124983854323892f * UV_star[0] - 0.980483721769325f * UV_star[1];
801 UV_star_prime[1] = 1.86323315098672f * UV_star[0] + 1.971853092390862f * UV_star[1];
816 float UV_star_prime[2];
820 const float M2 = UV_star_prime[0] * UV_star_prime[0] + UV_star_prime[1] * UV_star_prime[1];
824 JCH.x = L_star / L_white;
825 JCH.y = 15.932993652962535f * native_powr(L_star, 0.6523997524738018f) * native_powr(M2, 0.6007557017508491f) / L_white;
826 JCH.z = atan2(UV_star_prime[1], UV_star_prime[0]);
843 const float L_star = JCH.x * L_white;
844 const float M = native_powr(JCH.y * L_white / (15.932993652962535f * native_powr(L_star, 0.6523997524738018f)), 0.8322850678616855f);
846 const float U_star_prime = M * native_cos(JCH.z);
847 const float V_star_prime = M * native_sin(JCH.z);
850 const float UV_star[2] = { -5.037522385190711f * U_star_prime - 2.504856328185843f * V_star_prime,
851 4.760029407436461f * U_star_prime + 2.874012963239247f * V_star_prime };
854 const float factors[2] = { 1.39656225667f, 1.4513954287f };
855 const float half_values[2] = { 1.49217352929f,1.52488637914f };
856 for(
int c = 0; c < 2; c++)
857 UV[c] = -half_values[c] * UV_star[c] / (fabs(UV_star[c]) - factors[c]);
859 const float4 U_factors = { 0.167171472114775f, -0.150959086409163f, 0.940254742367256f, 0.f };
860 const float4 V_factors = { 0.141299802443708f, -0.155185060382272f, 1.000000000000000f, 0.f };
861 const float4 offsets = { -0.00801531300850582f, -0.00843312433578007f, -0.0256325967652889f, 0.f };
863 float4 xyD = U_factors * UV[0] + V_factors * UV[1] + offsets;
866 xyY.x = xyD.x / xyD.z;
867 xyY.y = xyD.y / xyD.z;
876 HSB.z = JCH.x * (native_powr(JCH.y, 1.33654221029386f) + 1.f);
877 HSB.y = (HSB.z > 0.f) ? JCH.y / HSB.z : 0.f;
887 JCH.y = HSB.y * HSB.z;
888 JCH.x = HSB.z / (native_powr(JCH.y, 1.33654221029386f) + 1.f);
896 HCB.z = JCH.x * (native_powr(JCH.y, 1.33654221029386f) + 1.f);
908 JCH.x = HCB.z / (native_powr(HCB.y, 1.33654221029386f) + 1.f);
const dt_colormatrix_t CAT16_LMS_to_XYZ
Definition chromatic_adaptation.h:74
const dt_colormatrix_t XYZ_to_CAT16_LMS
Definition chromatic_adaptation.h:70
const dt_colormatrix_t XYZ_to_Bradford_LMS
Definition chromatic_adaptation.h:40
const dt_colormatrix_t Bradford_LMS_to_XYZ
Definition chromatic_adaptation.h:44
@ HSL
Definition colorbalance.c:84
static float4 dt_UCS_JCH_to_HCB(const float4 JCH)
Definition colorspace.h:893
static float4 RGB_2_HSV(const float4 RGB)
Definition colorspace.h:253
static float4 LCH_2_Lab(float4 LCH)
Definition colorspace.h:68
static float4 XYZ_to_JzAzBz(float4 XYZ_D65)
Definition colorspace.h:362
static float4 dt_xyY_to_XYZ(const float4 xyY)
Definition colorspace.h:627
static float4 Lab_to_prophotorgb(float4 Lab)
Definition colorspace.h:157
static float4 prophotorgb_to_Lab(float4 rgb)
Definition colorspace.h:163
static float4 dt_UCS_HSB_to_JCH(const float4 HSB)
Definition colorspace.h:883
static void CAT16_adapt_D50(float4 *lms_in, const float4 origin_illuminant, const float D, const int full)
Definition colorspace.h:704
static float4 gradingRGB_to_LMS(const float4 RGB)
Definition colorspace.h:491
static void xyY_to_dt_UCS_UV(const float4 xyY, float UV_star_prime[2])
Definition colorspace.h:784
static float4 XYZ_to_sRGB(float4 XYZ)
Definition colorspace.h:335
static float4 gamut_check_Yrg(float4 Ych)
Definition colorspace.h:730
static float4 dt_xyY_to_uvY(const float4 xyY)
Definition colorspace.h:582
static float4 XYZ_to_Lab(float4 xyz)
Definition colorspace.h:86
static float4 matrix_product_float4(const float4 xyz, constant const float *const matrix)
Definition colorspace.h:46
static float4 JzAzBz_2_XYZ(const float4 JzAzBz)
Definition colorspace.h:396
static float4 HSL_2_RGB(const float4 HSL)
Definition colorspace.h:223
static float4 LMS_to_XYZ(const float4 LMS)
Definition colorspace.h:473
static float4 prophotorgb_to_XYZ(float4 rgb)
Definition colorspace.h:117
static float4 Lab_2_LCH(float4 Lab)
Definition colorspace.h:55
static float4 convert_XYZ_to_bradford_LMS(const float4 XYZ)
Definition colorspace.h:639
static float4 JzAzBz_to_JzCzhz(float4 JzAzBz)
Definition colorspace.h:442
static float4 matrix_product(const float4 xyz, constant const float *const matrix)
Definition colorspace.h:36
static float4 Yrg_to_Ych(const float4 Yrg)
Definition colorspace.h:556
static float4 Ych_to_Yrg(const float4 Ych)
Definition colorspace.h:571
static float Hue_2_RGB(float v1, float v2, float vH)
Definition colorspace.h:211
static float4 dt_uvY_to_xyY(const float4 uvY)
Definition colorspace.h:600
static float4 convert_XYZ_to_CAT16_LMS(const float4 XYZ)
Definition colorspace.h:659
static void bradford_adapt_D50(float4 *lms_in, const float4 origin_illuminant, const float p, const int full)
Definition colorspace.h:679
static float4 lab_f(float4 x)
Definition colorspace.h:78
static float4 LMS_to_gradingRGB(const float4 LMS)
Definition colorspace.h:501
static void XYZ_adapt_D50(float4 *lms_in, const float4 origin_illuminant)
Definition colorspace.h:719
static float4 RGB_2_HSL(const float4 RGB)
Definition colorspace.h:169
static float4 dt_UCS_JCH_to_HSB(const float4 JCH)
Definition colorspace.h:873
static float4 matrix_dot(const float4 vector, const float4 matrix[3])
Definition colorspace.h:24
static float dt_UCS_L_star_to_Y(const float L_star)
Definition colorspace.h:778
static float4 dt_UCS_JCH_to_xyY(const float4 JCH, const float L_white)
Definition colorspace.h:831
static float4 HSV_2_RGB(const float4 HSV)
Definition colorspace.h:290
static float4 Yrg_to_LMS(const float4 Yrg)
Definition colorspace.h:532
static float4 LMS_to_Yrg(const float4 LMS)
Definition colorspace.h:516
static float Y_to_dt_UCS_L_star(const float Y)
Definition colorspace.h:771
static float4 lab_f_inv(float4 x)
Definition colorspace.h:99
static float4 xyY_to_dt_UCS_JCH(const float4 xyY, const float L_white)
Definition colorspace.h:805
static float4 dt_XYZ_to_xyY(const float4 XYZ)
Definition colorspace.h:617
static float4 convert_CAT16_LMS_to_XYZ(const float4 LMS)
Definition colorspace.h:669
static float4 Lab_to_XYZ(float4 Lab)
Definition colorspace.h:107
static float4 XYZ_to_prophotorgb(float4 XYZ)
Definition colorspace.h:137
static float4 convert_bradford_LMS_to_XYZ(const float4 LMS)
Definition colorspace.h:649
static float4 XYZ_to_LMS(const float4 XYZ)
Definition colorspace.h:462
static float4 dt_UCS_HCB_to_JCH(const float4 HCB)
Definition colorspace.h:903
static float4 sRGB_to_XYZ(float4 sRGB)
Definition colorspace.h:349
#define B(y, x)
Definition colorspaces.c:149
#define A(y, x)
Definition colorspaces.c:148
static const dt_aligned_pixel_t d50
Definition colorspaces_inline_conversions.h:207
static const dt_colormatrix_t filmlightRGB_D65_to_LMS_D65
Definition colorspaces_inline_conversions.h:1069
static const dt_colormatrix_t LMS_D65_to_filmlightRGB_D65
Definition colorspaces_inline_conversions.h:1074
static const dt_colormatrix_t XYZ_D65_to_LMS_2006_D65
Definition colorspaces_inline_conversions.h:1035
static const dt_colormatrix_t LMS_2006_D65_to_XYZ_D65
Definition colorspaces_inline_conversions.h:1040
#define S(V, params)
Definition common/histogram.c:32
#define M_PI_F
Definition data/kernels/common.h:32
#define H
Definition diffuse.c:526
static float f(const float t, const float c, const float x)
Definition graduatednd.c:173
static double dot(int g[], double x, double y, double z)
Definition grain.c:147