29static inline __m128 lab_f_inv_m(
const __m128 x)
31 const __m128 epsilon = _mm_set1_ps(0.20689655172413796f);
32 const __m128 kappa_rcp_x16 = _mm_set1_ps(16.0f * 27.0f / 24389.0f);
33 const __m128 kappa_rcp_x116 = _mm_set1_ps(116.0f * 27.0f / 24389.0f);
36 const __m128 res_big = x * x * x;
38 const __m128 res_small = kappa_rcp_x116 * x - kappa_rcp_x16;
41 const __m128
mask = _mm_cmpgt_ps(x, epsilon);
42 return _mm_or_ps(_mm_and_ps(mask, res_big), _mm_andnot_ps(mask, res_small));
46static inline __m128 dt_Lab_to_XYZ_sse2(
const __m128
Lab)
48 const __m128
d50 = _mm_set_ps(0.0f, 0.8249f, 1.0f, 0.9642f);
49 const __m128 coef = _mm_set_ps(0.0f, -1.0f / 200.0f, 1.0f / 116.0f, 1.0f / 500.0f);
50 const __m128 offset = _mm_set1_ps(0.137931034f);
54 const __m128
f = _mm_shuffle_ps(
Lab,
Lab, _MM_SHUFFLE(0, 2, 0, 1)) * coef;
56 return d50 * lab_f_inv_m(
f + _mm_shuffle_ps(
f,
f, _MM_SHUFFLE(1, 1, 3, 1)) + offset);
59static inline __m128 lab_f_m_sse2(
const __m128 x)
61 const __m128 epsilon = _mm_set1_ps(216.0f / 24389.0f);
62 const __m128 kappa = _mm_set1_ps(24389.0f / 27.0f);
66 const __m128 a = _mm_castsi128_ps(
67 _mm_add_epi32(_mm_cvtps_epi32(_mm_div_ps(_mm_cvtepi32_ps(_mm_castps_si128(x)), _mm_set1_ps(3.0f))),
68 _mm_set1_epi32(709921077)));
69 const __m128
a3 = a * a * a;
70 const __m128 res_big = a * (
a3 + x + x) / (a3 + a3 + x);
73 const __m128 res_small = (kappa * x + _mm_set1_ps(16.0f)) / _mm_set1_ps(116.0f);
76 const __m128
mask = _mm_cmpgt_ps(x, epsilon);
77 return _mm_or_ps(_mm_and_ps(mask, res_big), _mm_andnot_ps(mask, res_small));
81static inline __m128 dt_XYZ_to_Lab_sse2(
const __m128 XYZ)
83 const __m128 d50_inv = _mm_set_ps(1.0f, 0.8249f, 1.0f, 0.9642f);
84 const __m128 coef = _mm_set_ps(0.0f, 200.0f, 500.0f, 116.0f);
85 const __m128
f = lab_f_m_sse2(XYZ / d50_inv);
87 return coef * (_mm_shuffle_ps(
f,
f, _MM_SHUFFLE(3, 1, 0, 1)) - _mm_shuffle_ps(
f,
f, _MM_SHUFFLE(3, 2, 1, 3)));
92static inline __m128 dt_XYZ_to_sRGB_sse2(__m128 XYZ)
95 const __m128 xyz_to_srgb_0 = _mm_setr_ps(3.1338561f, -0.9787684f, 0.0719453f, 0.0f);
96 const __m128 xyz_to_srgb_1 = _mm_setr_ps(-1.6168667f, 1.9161415f, -0.2289914f, 0.0f);
97 const __m128 xyz_to_srgb_2 = _mm_setr_ps(-0.4906146f, 0.0334540f, 1.4052427f, 0.0f);
100 = xyz_to_srgb_0 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(0, 0, 0, 0)) +
101 xyz_to_srgb_1 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(1, 1, 1, 1)) +
102 xyz_to_srgb_2 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(2, 2, 2, 2));
105 __m128
mask = _mm_cmple_ps(rgb, _mm_set1_ps(0.0031308));
106 __m128 rgb0 = _mm_set1_ps(12.92) *
rgb;
107 __m128 rgb1 = _mm_set1_ps(1.0 + 0.055) *
_mm_pow_ps1(rgb, 1.0 / 2.4) - _mm_set1_ps(0.055);
108 return _mm_or_ps(_mm_and_ps(mask, rgb0), _mm_andnot_ps(mask, rgb1));
111static inline __m128 dt_sRGB_to_XYZ_sse2(__m128 rgb)
114 const __m128 srgb_to_xyz_0 = _mm_setr_ps(0.4360747f, 0.2225045f, 0.0139322f, 0.0f);
115 const __m128 srgb_to_xyz_1 = _mm_setr_ps(0.3850649f, 0.7168786f, 0.0971045f, 0.0f);
116 const __m128 srgb_to_xyz_2 = _mm_setr_ps(0.1430804f, 0.0606169f, 0.7141733f, 0.0f);
119 __m128
mask = _mm_cmple_ps(rgb, _mm_set1_ps(0.04045));
120 __m128 rgb0 = _mm_div_ps(rgb, _mm_set1_ps(12.92));
121 __m128 rgb1 =
_mm_pow_ps1(_mm_div_ps(_mm_add_ps(rgb, _mm_set1_ps(0.055)), _mm_set1_ps(1 + 0.055)), 2.4);
122 rgb = _mm_or_ps(_mm_and_ps(mask, rgb0), _mm_andnot_ps(mask, rgb1));
125 = srgb_to_xyz_0 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(0, 0, 0, 0)) +
126 srgb_to_xyz_1 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(1, 1, 1, 1)) +
127 srgb_to_xyz_2 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(2, 2, 2, 2));
133static inline __m128 dt_XYZ_to_prophotoRGB_sse2(__m128 XYZ)
136 const __m128 xyz_to_rgb_0 = _mm_setr_ps( 1.3459433f, -0.5445989f, 0.0000000f, 0.0f);
137 const __m128 xyz_to_rgb_1 = _mm_setr_ps(-0.2556075f, 1.5081673f, 0.0000000f, 0.0f);
138 const __m128 xyz_to_rgb_2 = _mm_setr_ps(-0.0511118f, 0.0205351f, 1.2118128f, 0.0f);
141 = xyz_to_rgb_0 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(0, 0, 0, 0)) +
142 xyz_to_rgb_1 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(1, 1, 1, 1)) +
143 xyz_to_rgb_2 * _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(2, 2, 2, 2));
149static inline __m128 dt_prophotoRGB_to_XYZ_sse2(__m128 rgb)
152 const __m128 rgb_to_xyz_0 = _mm_setr_ps(0.7976749f, 0.2880402f, 0.0000000f, 0.0f);
153 const __m128 rgb_to_xyz_1 = _mm_setr_ps(0.1351917f, 0.7118741f, 0.0000000f, 0.0f);
154 const __m128 rgb_to_xyz_2 = _mm_setr_ps(0.0313534f, 0.0000857f, 0.8252100f, 0.0f);
157 = rgb_to_xyz_0 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(0, 0, 0, 0)) +
158 rgb_to_xyz_1 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(1, 1, 1, 1)) +
159 rgb_to_xyz_2 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(2, 2, 2, 2));
165#pragma omp declare simd aligned(in,out)
168 dt_aligned_pixel_t out)
173 out[r] = matrix[0][r] * in[0] + matrix[1][r] * in[1] + matrix[2][r] * in[2];
177#pragma omp declare simd simdlen(4)
181 uint32_t *
const p = (uint32_t *)&
f;
182 *p = *p / 3 + 709921077;
187#pragma omp declare simd simdlen(4)
191 const float a3 = a * a * a;
192 const float b = a * (a3 +
R +
R) / (a3 + a3 +
R);
197#pragma omp declare simd simdlen(4)
199static inline float lab_f(
const float x)
201 const float epsilon = 216.0f / 24389.0f;
202 const float kappa = 24389.0f / 27.0f;
207static const dt_aligned_pixel_t
d50 = { 0.9642f, 1.0f, 0.8249f };
210#pragma omp declare simd aligned(Lab, XYZ:16) uniform(Lab, XYZ)
214 dt_aligned_pixel_t
f;
217 Lab[0] = 116.0f *
f[1] - 16.0f;
218 Lab[1] = 500.0f * (
f[0] -
f[1]);
219 Lab[2] = 200.0f * (
f[1] -
f[2]);
223#pragma omp declare simd simdlen(4)
227 const float epsilon = 0.20689655172413796f;
228 const float kappa = 24389.0f / 27.0f;
229 return (x > epsilon) ? x * x * x : (116.0f * x - 16.0f) / kappa;
234#pragma omp declare simd aligned(Lab, XYZ:16) uniform(Lab, XYZ)
238 const float fy = (
Lab[0] + 16.0f) / 116.0f;
239 const float fx =
Lab[1] / 500.0f + fy;
240 const float fz = fy -
Lab[2] / 200.0f;
241 const dt_aligned_pixel_t
f = { fx, fy, fz };
248#pragma omp declare simd aligned(xyY, XYZ:16)
250static inline void dt_XYZ_to_xyY(
const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t xyY)
252 const float sum = XYZ[0] + XYZ[1] + XYZ[2];
253 xyY[0] = XYZ[0] / sum;
254 xyY[1] = XYZ[1] / sum;
260#pragma omp declare simd aligned(xyY, XYZ:16)
262static inline void dt_xyY_to_XYZ(
const dt_aligned_pixel_t xyY, dt_aligned_pixel_t XYZ)
264 XYZ[0] = xyY[2] * xyY[0] / xyY[1];
266 XYZ[2] = xyY[2] * (1.f - xyY[0] - xyY[1]) / xyY[1];
271#pragma omp declare simd aligned(xyY, uvY:16)
273static inline void dt_xyY_to_uvY(
const dt_aligned_pixel_t xyY, dt_aligned_pixel_t uvY)
281 const float denominator = -2.f * xyY[0] + 12.f * xyY[1] + 3.f;
282 uvY[0] = 4.f * xyY[0] / denominator;
283 uvY[1] = 9.f * xyY[1] / denominator;
288#pragma omp declare simd
290static inline float cbf(
const float x)
297#pragma omp declare simd aligned(xyY, Luv:16)
299static inline void dt_xyY_to_Luv(
const dt_aligned_pixel_t xyY, dt_aligned_pixel_t Luv)
307 dt_aligned_pixel_t uvY;
311 const float threshold =
cbf(6.0f / 29.0f);
312 Luv[0] = (uvY[2] <= threshold) ?
cbf(29.0f / 3.0f) * uvY[2] : 116.0f * cbrtf(uvY[2]) - 16.f;
314 const float D50[2]
DT_ALIGNED_PIXEL = { 0.20915914598542354f, 0.488075320769787f };
315 Luv[1] = 13.f * Luv[0] * (uvY[0] - D50[0]);
316 Luv[2] = 13.f * Luv[0] * (uvY[1] - D50[1]);
322static inline void dt_Luv_to_Lch(
const dt_aligned_pixel_t Luv, dt_aligned_pixel_t Lch)
325 Lch[1] = hypotf(Luv[2], Luv[1]);
326 Lch[2] = atan2f(Luv[2], Luv[1]);
327 Lch[2] = (Lch[2] < 0.f) ? 2.f *
M_PI + Lch[2] : Lch[2];
331static inline void dt_xyY_to_Lch(
const dt_aligned_pixel_t xyY, dt_aligned_pixel_t Lch)
333 dt_aligned_pixel_t Luv;
340#pragma omp declare simd aligned(uvY, xyY:16)
342static inline void dt_uvY_to_xyY(
const dt_aligned_pixel_t uvY, dt_aligned_pixel_t xyY)
350 const float denominator = 6.0f * uvY[0] - 16.f * uvY[1] + 12.0f;
351 xyY[0] = 9.f * uvY[0] / denominator;
352 xyY[1] = 4.f * uvY[1] / denominator;
358#pragma omp declare simd aligned(xyY, Luv:16)
360static inline void dt_Luv_to_xyY(
const dt_aligned_pixel_t Luv, dt_aligned_pixel_t xyY)
368 dt_aligned_pixel_t uvY;
371 static const float threshold = 8.0f;
372 uvY[2] = (Luv[0] <= threshold) ? Luv[0] *
cbf(3.f / 29.f) :
cbf((Luv[0] + 16.f) / 116.f);
374 static const float D50[2]
DT_ALIGNED_PIXEL = { 0.20915914598542354f, 0.488075320769787f };
375 uvY[0] = Luv[1] / (Luv[0] * 13.f) + D50[0];
376 uvY[1] = Luv[2] / (Luv[0] * 13.f) + D50[1];
382static inline void dt_Lch_to_Luv(
const dt_aligned_pixel_t Lch, dt_aligned_pixel_t Luv)
385 Luv[1] = Lch[1] * cosf(Lch[2]);
386 Luv[2] = Lch[1] * sinf(Lch[2]);
389static inline void dt_Lch_to_xyY(
const dt_aligned_pixel_t Lch, dt_aligned_pixel_t xyY)
391 dt_aligned_pixel_t Luv;
398#pragma omp declare simd
404 { { 3.1338561f, -0.9787684f, 0.0719453f, 0.0f },
405 { -1.6168667f, 1.9161415f, -0.2289914f, 0.0f },
406 { -0.4906146f, 0.0334540f, 1.4052427f, 0.0f } };
415#pragma omp declare simd
422 { 3.2404542f, -0.9692660f, 0.0556434f, 0.0f },
423 { -1.5371385f, 1.8760108f, -0.2040259f, 0.0f },
424 { -0.4985314f, 0.0415560f, 1.0572252f, 0.0f },
433#pragma omp declare simd aligned(XYZ, sRGB)
435static inline void dt_XYZ_to_sRGB(
const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
438 dt_aligned_pixel_t rgb;
441 for(
size_t c = 0; c < 3; c++)
442 sRGB[c] = rgb[c] <= 0.0031308f ? 12.92f * rgb[c] : (1.0f + 0.055f) * powf(rgb[c], 1.0f / 2.4f) - 0.055f;
448#pragma omp declare simd aligned(XYZ, sRGB)
452 dt_aligned_pixel_t result;
456 sRGB[c] =
CLIP(result[c]);
461#pragma omp declare simd aligned(sRGB, XYZ_D50: 16)
468 { 0.4360747f, 0.2225045f, 0.0139322f, 0.0f },
469 { 0.3850649f, 0.7168786f, 0.0971045f, 0.0f },
470 { 0.1430804f, 0.0606169f, 0.7141733f, 0.0f }
477#pragma omp declare simd aligned(sRGB, RGB)
482 for(
int c = 0; c < 3; c++)
483 RGB[c] = sRGB[c] <= 0.04045f ? sRGB[c] / 12.92f : powf((sRGB[c] + 0.055f) / (1.0f + 0.055f), 2.4f);
487#pragma omp declare simd aligned(sRGB, XYZ)
489static inline void dt_sRGB_to_XYZ(
const dt_aligned_pixel_t sRGB, dt_aligned_pixel_t XYZ)
491 dt_aligned_pixel_t rgb = { 0 };
498#pragma omp declare simd aligned(XYZ,rgb)
504 { 1.3459433f, -0.5445989f, 0.0000000f, 0.0f },
505 { -0.2556075f, 1.5081673f, 0.0000000f, 0.0f },
506 { -0.0511118f, 0.0205351f, 1.2118128f, 0.0f }
512#pragma omp declare simd aligned(rgb, XYZ)
519 { 0.7976749f, 0.2880402f, 0.0000000f, 0.0f },
520 { 0.1351917f, 0.7118741f, 0.0000000f, 0.0f },
521 { 0.0313534f, 0.0000857f, 0.8252100f, 0.0f }
529static inline __m128 dt_XYZ_to_RGB_sse2(__m128 XYZ)
532 const __m128 xyz_to_srgb_0 = _mm_setr_ps(3.1338561f, -0.9787684f, 0.0719453f, 0.0f);
533 const __m128 xyz_to_srgb_1 = _mm_setr_ps(-1.6168667f, 1.9161415f, -0.2289914f, 0.0f);
534 const __m128 xyz_to_srgb_2 = _mm_setr_ps(-0.4906146f, 0.0334540f, 1.4052427f, 0.0f);
537 = _mm_add_ps(_mm_mul_ps(xyz_to_srgb_0, _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(0, 0, 0, 0))),
538 _mm_add_ps(_mm_mul_ps(xyz_to_srgb_1, _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(1, 1, 1, 1))),
539 _mm_mul_ps(xyz_to_srgb_2, _mm_shuffle_ps(XYZ, XYZ, _MM_SHUFFLE(2, 2, 2, 2)))));
544static inline __m128 dt_RGB_to_XYZ_sse2(__m128 rgb)
547 const __m128 srgb_to_xyz_0 = _mm_setr_ps(0.4360747f, 0.2225045f, 0.0139322f, 0.0f);
548 const __m128 srgb_to_xyz_1 = _mm_setr_ps(0.3850649f, 0.7168786f, 0.0971045f, 0.0f);
549 const __m128 srgb_to_xyz_2 = _mm_setr_ps(0.1430804f, 0.0606169f, 0.7141733f, 0.0f);
552 = ((srgb_to_xyz_0 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(0, 0, 0, 0)))
553 + (srgb_to_xyz_1 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(1, 1, 1, 1)))
554 + (srgb_to_xyz_2 * _mm_shuffle_ps(rgb, rgb, _MM_SHUFFLE(2, 2, 2, 2))));
561 { { 0.4360747f, 0.3850649f, 0.1430804f },
562 { 0.2225045f, 0.7168786f, 0.0606169f },
563 { 0.0139322f, 0.0971045f, 0.7141733f } };
567 { { 0.4360747f, 0.2225045f, 0.0139322f },
568 { 0.3850649f, 0.7168786f, 0.0971045f },
569 { 0.1430804f, 0.0606169f, 0.7141733f } };
578 { { 3.1338561f, -1.6168667f, -0.4906146f },
579 { -0.9787684f, 1.9161415f, 0.0334540f },
580 { 0.0719453f, -0.2289914f, 1.4052427f } };
584 { { 3.1338561f, -0.9787684f, 0.0719453f },
585 { -1.6168667f, 1.9161415f, -0.2289914f },
586 { -0.4906146f, 0.0334540f, 1.4052427f } };
595#pragma omp declare simd aligned(Lab, rgb)
599 dt_aligned_pixel_t XYZ = { 0.0f };
605#pragma omp declare simd aligned(rgb, Lab)
609 dt_aligned_pixel_t XYZ = { 0.0f };
616#pragma omp declare simd
618static inline float _dt_RGB_2_Hue(
const dt_aligned_pixel_t RGB,
const float max,
const float delta)
622 hue = (RGB[1] - RGB[2]) / delta;
623 else if(RGB[1] == max)
624 hue = 2.0f + (RGB[2] - RGB[0]) / delta;
626 hue = 4.0f + (RGB[0] - RGB[1]) / delta;
629 if(hue < 0.0f) hue += 1.0f;
630 if(hue > 1.0f) hue -= 1.0f;
635#pragma omp declare simd aligned(RGB: 16)
637static inline void _dt_Hue_2_RGB(dt_aligned_pixel_t RGB,
const float H,
const float C,
const float min)
639 const float h =
H * 6.0f;
640 const float i = floorf(h);
641 const float f = h - i;
642 const float fc =
f * C;
643 const float top = C + min;
644 const float inc = fc + min;
645 const float dec = top - fc;
646 const size_t i_idx = (size_t)i;
687#pragma omp declare simd aligned(RGB, HSL: 16)
691 const float min = fminf(RGB[0], fminf(RGB[1], RGB[2]));
692 const float max = fmaxf(RGB[0], fmaxf(RGB[1], RGB[2]));
693 const float delta = max - min;
695 const float L = (max + min) / 2.0f;
698 if(fabsf(max) > 1e-6f && fabsf(delta) > 1e-6f)
701 S = delta / (max + min);
703 S = delta / (2.0f - max - min);
718#pragma omp declare simd aligned(HSL, RGB: 16)
723 const float L =
HSL[2];
728 C = (1.0f - L) *
HSL[1];
729 const float m = L - C;
735#pragma omp declare simd aligned(RGB, HSV: 16)
737static inline void dt_RGB_2_HSV(
const dt_aligned_pixel_t RGB, dt_aligned_pixel_t HSV)
739 const float min = fminf(RGB[0], fminf(RGB[1], RGB[2]));
740 const float max = fmaxf(RGB[0], fmaxf(RGB[1], RGB[2]));
741 const float delta = max - min;
746 if(fabsf(max) > 1e-6f && fabsf(delta) > 1e-6f)
763#pragma omp declare simd aligned(HSV, RGB: 16)
765static inline void dt_HSV_2_RGB(
const dt_aligned_pixel_t HSV, dt_aligned_pixel_t RGB)
768 const float C = HSV[1] * HSV[2];
769 const float m = HSV[2] - C;
775#pragma omp declare simd aligned(RGB, HCV: 16)
777static inline void dt_RGB_2_HCV(
const dt_aligned_pixel_t RGB, dt_aligned_pixel_t HCV)
779 const float min = fminf(RGB[0], fminf(RGB[1], RGB[2]));
780 const float max = fmaxf(RGB[0], fmaxf(RGB[1], RGB[2]));
781 const float delta = max - min;
786 if(fabsf(max) > 1e-6f && fabsf(delta) > 1e-6f)
803#pragma omp declare simd
807 float var_H = atan2f(
Lab[2],
Lab[1]);
812 var_H = 1.0f - fabsf(var_H) / (2.0f *
DT_M_PI_F);
815 LCH[1] = hypotf(
Lab[1],
Lab[2]);
821#pragma omp declare simd
832 return (rgb[0] * 0.2225045f + rgb[1] * 0.7168786f + rgb[2] * 0.0606169f);
837#pragma omp declare simd aligned(XYZ_D50, XYZ_D65: 16)
844 { 0.9555766f, -0.0230393f, 0.0631636f, 0.0f },
845 { -0.0282895f, 1.0099416f, 0.0210077f, 0.0f },
846 { 0.0122982f, -0.0204830f, 1.3299098f, 0.0f },
850 { 0.9555766f, -0.0282895f, 0.0122982f, 0.0f },
851 { -0.0230393f, 1.0099416f, -0.0204830f, 0.0f },
852 { 0.0631636f, 0.0210077f, 1.3299098f, 0.0f },
856 XYZ_D65[x] = M_transposed[0][x] * XYZ_D50[0] + M_transposed[1][x] * XYZ_D50[1] + M_transposed[2][x] * XYZ_D50[2];
860#pragma omp declare simd aligned(XYZ_D50, XYZ_D65: 16)
867 { 1.0478112f, 0.0228866f, -0.0501270f, 0.0f },
868 { 0.0295424f, 0.9904844f, -0.0170491f, 0.0f },
869 { -0.0092345f, 0.0150436f, 0.7521316f, 0.0f },
873 { 1.0478112f, 0.0295424f, -0.0092345f, 0.0f },
874 { 0.0228866f, 0.9904844f, 0.0150436f, 0.0f },
875 { -0.0501270f, -0.0170491f, 0.7521316f, 0.0f },
879 XYZ_D50[x] = M_transposed[0][x] * XYZ_D65[0] + M_transposed[1][x] * XYZ_D65[1] + M_transposed[2][x] * XYZ_D65[2];
891#pragma omp declare simd aligned(XYZ_D65, JzAzBz: 16)
893static inline void dt_XYZ_2_JzAzBz(
const dt_aligned_pixel_t XYZ_D65, dt_aligned_pixel_t JzAzBz)
895 const float b = 1.15f;
896 const float g = 0.66f;
897 const float c1 = 0.8359375f;
898 const float c2 = 18.8515625f;
899 const float c3 = 18.6875f;
900 const float n = 0.159301758f;
901 const float p = 134.034375f;
902 const float d = -0.56f;
903 const float d0 = 1.6295499532821566e-11f;
905 { 0.41478972f, 0.579999f, 0.0146480f, 0.0f },
906 { -0.2015100f, 1.120649f, 0.0531008f, 0.0f },
907 { -0.0166008f, 0.264800f, 0.6684799f, 0.0f },
911 { 0.5f, 0.5f, 0.0f, 0.0f },
912 { 3.524000f, -4.066708f, 0.542708f, 0.0f },
913 { 0.199076f, 1.096799f, -1.295875f, 0.0f },
917 { 0.5f, 3.524000f, 0.199076f, 0.0f },
918 { 0.5f, -4.066708f, 1.096799f, 0.0f },
919 { 0.0f, 0.542708f, -1.295875f, 0.0f },
922 dt_aligned_pixel_t XYZ = { 0.0f, 0.0f, 0.0f, 0.0f };
923 dt_aligned_pixel_t LMS = { 0.0f, 0.0f, 0.0f, 0.0f };
926 XYZ[0] = b * XYZ_D65[0] - (b - 1.0f) * XYZ_D65[2];
927 XYZ[1] = g * XYZ_D65[1] - (g - 1.0f) * XYZ_D65[0];
932#pragma omp simd aligned(LMS, XYZ:16) aligned(M:64)
934 for(
int i = 0; i < 3; i++)
936 LMS[i] = M[i][0] * XYZ[0] + M[i][1] * XYZ[1] + M[i][2] * XYZ[2];
937 LMS[i] = powf(fmaxf(LMS[i] / 10000.f, 0.0f), n);
938 LMS[i] = powf((
c1 +
c2 * LMS[i]) / (1.0f + c3 * LMS[i]), p);
943 JzAzBz[c] = A_transposed[0][c] * LMS[0] + A_transposed[1][c] * LMS[1] + A_transposed[2][c] * LMS[2];
945 JzAzBz[0] = fmaxf(((1.0f + d) * JzAzBz[0]) / (1.0f + d * JzAzBz[0]) - d0, 0.f);
949#pragma omp declare simd aligned(JzAzBz, JzCzhz: 16)
953 float var_H = atan2f(JzAzBz[2], JzAzBz[1]) / (2.0f *
DT_M_PI_F);
954 JzCzhz[0] = JzAzBz[0];
955 JzCzhz[1] = hypotf(JzAzBz[1], JzAzBz[2]);
956 JzCzhz[2] = var_H >= 0.0f ? var_H : 1.0f + var_H;
960#pragma omp declare simd aligned(JzCzhz, JzAzBz: 16)
964 JzAzBz[0] = JzCzhz[0];
965 JzAzBz[1] = cosf(2.0f *
DT_M_PI_F * JzCzhz[2]) * JzCzhz[1];
966 JzAzBz[2] = sinf(2.0f *
DT_M_PI_F * JzCzhz[2]) * JzCzhz[1];
970#pragma omp declare simd aligned(JzAzBz, XYZ_D65: 16)
972static inline void dt_JzAzBz_2_XYZ(
const dt_aligned_pixel_t JzAzBz, dt_aligned_pixel_t XYZ_D65)
974 const float b = 1.15f;
975 const float g = 0.66f;
976 const float c1 = 0.8359375f;
977 const float c2 = 18.8515625f;
978 const float c3 = 18.6875f;
979 const float n_inv = 1.0f / 0.159301758f;
980 const float p_inv = 1.0f / 134.034375f;
981 const float d = -0.56f;
982 const float d0 = 1.6295499532821566e-11f;
984 { 1.9242264357876067f, -1.0047923125953657f, 0.0376514040306180f, 0.0f },
985 { 0.3503167620949991f, 0.7264811939316552f, -0.0653844229480850f, 0.0f },
986 { -0.0909828109828475f, -0.3127282905230739f, 1.5227665613052603f, 0.0f },
989 { 1.0f, 0.1386050432715393f, 0.0580473161561189f, 0.0f },
990 { 1.0f, -0.1386050432715393f, -0.0580473161561189f, 0.0f },
991 { 1.0f, -0.0960192420263190f, -0.8118918960560390f, 0.0f },
994 dt_aligned_pixel_t XYZ = { 0.0f, 0.0f, 0.0f, 0.0f };
995 dt_aligned_pixel_t LMS = { 0.0f, 0.0f, 0.0f, 0.0f };
996 dt_aligned_pixel_t IzAzBz = { 0.0f, 0.0f, 0.0f, 0.0f };
998 IzAzBz[0] = JzAzBz[0] + d0;
999 IzAzBz[0] = fmaxf(IzAzBz[0] / (1.0f + d - d * IzAzBz[0]), 0.f);
1000 IzAzBz[1] = JzAzBz[1];
1001 IzAzBz[2] = JzAzBz[2];
1005#pragma omp simd aligned(LMS, IzAzBz:16) aligned(AI:64)
1007 for(
int i = 0; i < 3; i++)
1009 LMS[i] = AI[i][0] * IzAzBz[0] + AI[i][1] * IzAzBz[1] + AI[i][2] * IzAzBz[2];
1010 LMS[i] = powf(fmaxf(LMS[i], 0.0f), p_inv);
1011 LMS[i] = 10000.f * powf(fmaxf((
c1 - LMS[i]) / (c3 * LMS[i] -
c2), 0.0f), n_inv);
1016#pragma omp simd aligned(LMS, XYZ:16) aligned(MI:64)
1018 for(
int i = 0; i < 3; i++) XYZ[i] = MI[i][0] * LMS[0] + MI[i][1] * LMS[1] + MI[i][2] * LMS[2];
1021 XYZ_D65[0] = (XYZ[0] + (b - 1.0f) * XYZ[2]) / b;
1022 XYZ_D65[1] = (XYZ[1] + (g - 1.0f) * XYZ_D65[0]) / g;
1023 XYZ_D65[2] = XYZ[2];
1035 = { { 0.257085f, 0.859943f, -0.031061f, 0.f },
1036 { -0.394427f, 1.175800f, 0.106423f, 0.f },
1037 { 0.064856f, -0.076250f, 0.559067f, 0.f } };
1040 = { { 1.80794659f, -1.29971660f, 0.34785879f, 0.f },
1041 { 0.61783960f, 0.39595453f, -0.04104687f, 0.f },
1042 { -0.12546960f, 0.20478038f, 1.74274183f, 0.f } };
1046#pragma omp declare simd aligned(LMS, XYZ: 16)
1048static inline void XYZ_to_LMS(
const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t LMS)
1054#pragma omp declare simd aligned(XYZ, LMS: 16)
1056static inline void LMS_to_XYZ(
const dt_aligned_pixel_t LMS, dt_aligned_pixel_t XYZ)
1069 = { { 0.95f, 0.38f, 0.00f, 0.f },
1070 { 0.05f, 0.62f, 0.03f, 0.f },
1071 { 0.00f, 0.00f, 0.97f, 0.f } };
1074 = { { 1.0877193f, -0.66666667f, 0.02061856f, 0.f },
1075 { -0.0877193f, 1.66666667f, -0.05154639f, 0.f },
1076 { 0.f, 0.f, 1.03092784f, 0.f } };
1079#pragma omp declare simd aligned(LMS, RGB: 16)
1087#pragma omp declare simd aligned(LMS, RGB: 16)
1100#pragma omp declare simd aligned(LMS, Yrg: 16)
1102static inline void LMS_to_Yrg(
const dt_aligned_pixel_t LMS, dt_aligned_pixel_t Yrg)
1105 const float Y = 0.68990272f * LMS[0] + 0.34832189f * LMS[1];
1108 const float a = LMS[0] + LMS[1] + LMS[2];
1109 dt_aligned_pixel_t lms = { 0.f };
1110 for_four_channels(c, aligned(LMS, lms : 16)) lms[c] = (a == 0.f) ? 0.f : LMS[c] / a;
1113 dt_aligned_pixel_t rgb = { 0.f };
1122#pragma omp declare simd aligned(Yrg, LMS: 16)
1124static inline void Yrg_to_LMS(
const dt_aligned_pixel_t Yrg, dt_aligned_pixel_t LMS)
1126 const float Y = Yrg[0];
1129 const float r = Yrg[1];
1130 const float g = Yrg[2];
1131 const float b = 1.f - r - g;
1132 const dt_aligned_pixel_t rgb = { r, g, b, 0.f };
1135 dt_aligned_pixel_t lms = { 0.f };
1139 const float denom = (0.68990272f * lms[0] + 0.34832189f * lms[1]);
1140 const float a = (denom == 0.f) ? 0.f : Y / denom;
1149#pragma omp declare simd aligned(Ych, Yrg: 16)
1151static inline void Yrg_to_Ych(
const dt_aligned_pixel_t Yrg, dt_aligned_pixel_t Ych)
1153 const float Y = Yrg[0];
1158 const float r = Yrg[1] - 0.21902143f;
1159 const float g = Yrg[2] - 0.54371398f;
1160 const float c = hypotf(g, r);
1161 const float h = atan2f(g, r);
1168#pragma omp declare simd aligned(Ych, Yrg: 16)
1170static inline void Ych_to_Yrg(
const dt_aligned_pixel_t Ych, dt_aligned_pixel_t Yrg)
1172 const float Y = Ych[0];
1173 const float c = Ych[1];
1174 const float h = Ych[2];
1175 const float r = c * cosf(h) + 0.21902143f;
1176 const float g = c * sinf(h) + 0.54371398f;
1187#pragma omp declare simd aligned(Ych, RGB: 16)
1191 dt_aligned_pixel_t Yrg = { 0.f };
1192 dt_aligned_pixel_t LMS = { 0.f };
1200#pragma omp declare simd aligned(Ych, RGB: 16)
1204 dt_aligned_pixel_t Yrg = { 0.f };
1205 dt_aligned_pixel_t LMS = { 0.f };
1213#pragma omp declare simd aligned(Ych, XYZ: 16)
1215static inline void XYZ_to_Ych(
const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t Ych)
1218 dt_aligned_pixel_t Yrg = { 0.f };
1219 dt_aligned_pixel_t LMS = { 0.f };
1227#pragma omp declare simd aligned(Ych, XYZ: 16)
1229static inline void Ych_to_XYZ(
const dt_aligned_pixel_t Ych, dt_aligned_pixel_t XYZ)
1232 dt_aligned_pixel_t Yrg = { 0.f };
1233 dt_aligned_pixel_t LMS = { 0.f };
1246 dt_aligned_pixel_t Yrg = { 0.f };
1252 const float D65_r = 0.21902143f;
1253 const float D65_g = 0.54371398f;
1255 float max_c = Ych[1];
1256 const float cos_h = cosf(Ych[2]);
1257 const float sin_h = sinf(Ych[2]);
1261 max_c = fminf(-D65_r / cos_h, max_c);
1265 max_c = fminf(-D65_g / sin_h, max_c);
1267 if(Yrg[1] + Yrg[2] > 1.f)
1269 max_c = fminf((1.f - D65_r - D65_g) / (cos_h + sin_h), max_c);
1287 const float Y_hat = powf(Y, 0.631651345306265f);
1288 return 2.098883786377f * Y_hat / (Y_hat + 1.12426773749357f);
1294 return powf((1.12426773749357f * L_star / (2.098883786377f - L_star)), 1.5831518565279648f);
1299#pragma omp declare simd aligned(xyY: 16)
1304 const dt_aligned_pixel_t x_factors = { -0.783941002840055f, 0.745273540913283f, 0.318707282433486f, 0.f };
1305 const dt_aligned_pixel_t y_factors = { 0.277512987809202f, -0.205375866083878f, 2.16743692732158f, 0.f };
1306 const dt_aligned_pixel_t offsets = { 0.153836578598858f, -0.165478376301988f, 0.291320554395942f, 0.f };
1308 dt_aligned_pixel_t UVD = { 0.f };
1310 UVD[c] = x_factors[c] * xyY[0] + y_factors[c] * xyY[1] + offsets[c];
1315 float UV_star[2] = { 0.f };
1316 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1317 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
1318 for(
int c = 0; c < 2; c++)
1319 UV_star[c] = factors[c] * UVD[c] / (fabsf(UVD[c]) + half_values[c]);
1322 UV_star_prime[0] = -1.124983854323892f * UV_star[0] - 0.980483721769325f * UV_star[1];
1323 UV_star_prime[1] = 1.86323315098672f * UV_star[0] + 1.971853092390862f * UV_star[1];
1329#pragma omp declare simd aligned(xyY, JCH: 16)
1331static inline void xyY_to_dt_UCS_JCH(
const dt_aligned_pixel_t xyY,
const float L_white, dt_aligned_pixel_t JCH)
1342 float UV_star_prime[2];
1346 const float M2 = UV_star_prime[0] * UV_star_prime[0] + UV_star_prime[1] * UV_star_prime[1];
1349 JCH[0] = L_star / L_white;
1350 JCH[1] = 15.932993652962535f * powf(L_star, 0.6523997524738018f) * powf(M2, 0.6007557017508491f) / L_white;
1351 JCH[2] = atan2f(UV_star_prime[1], UV_star_prime[0]);
1356#pragma omp declare simd aligned(xyY, JCH: 16)
1358static inline void dt_UCS_JCH_to_xyY(
const dt_aligned_pixel_t JCH,
const float L_white, dt_aligned_pixel_t xyY)
1370 const float L_star = JCH[0] * L_white;
1371 const float M = powf(JCH[1] * L_white / (15.932993652962535f * powf(L_star, 0.6523997524738018f)), 0.8322850678616855f);
1373 const float U_star_prime = M * cosf(JCH[2]);
1374 const float V_star_prime = M * sinf(JCH[2]);
1377 const float UV_star[2] = { -5.037522385190711f * U_star_prime - 2.504856328185843f * V_star_prime,
1378 4.760029407436461f * U_star_prime + 2.874012963239247f * V_star_prime };
1380 float UV[2] = { 0.f };
1381 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1382 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
1383 for(
int c = 0; c < 2; c++)
1384 UV[c] = -half_values[c] * UV_star[c] / (fabsf(UV_star[c]) - factors[c]);
1386 const dt_aligned_pixel_t U_factors = { 0.167171472114775f, -0.150959086409163f, 0.940254742367256f, 0.f };
1387 const dt_aligned_pixel_t V_factors = { 0.141299802443708f, -0.155185060382272f, 1.000000000000000f, 0.f };
1388 const dt_aligned_pixel_t offsets = { -0.00801531300850582f, -0.00843312433578007f, -0.0256325967652889f, 0.f };
1390 dt_aligned_pixel_t xyD = { 0.f };
1392 xyD[c] = U_factors[c] * UV[0] + V_factors[c] * UV[1] + offsets[c];
1394 xyY[0] = xyD[0] / xyD[2];
1395 xyY[1] = xyD[1] / xyD[2];
1402 HSB[2] = JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f);
1403 HSB[1] = (HSB[2] > 0.f) ? JCH[1] / HSB[2] : 0.f;
1411 JCH[1] = HSB[1] * HSB[2];
1412 JCH[0] = HSB[2] / (powf(JCH[1], 1.33654221029386f) + 1.f);
1418 HCB[2] = JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f);
1428 JCH[0] = HCB[2] / (powf(HCB[1], 1.33654221029386f) + 1.f);
1434 HPW[2] = sqrtf(HSB[1] * HSB[1] + HSB[2] * HSB[2]);
1435 HPW[1] = (HPW[2] > 0.f) ? HSB[1] / HPW[2] : 0.f;
1443 HSB[1] = HPW[1] * HPW[2];
1444 HSB[2] = fmaxf(sqrtf(HPW[2] * HPW[2] - HSB[1] * HSB[1]), 0.f);
#define m
Definition basecurve.c:231
@ HSL
Definition colorbalance.c:84
#define A(y, x)
Definition colorspaces.c:148
static void dt_prophotorgb_to_XYZ(const dt_aligned_pixel_t rgb, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:514
static void dt_sRGB_to_XYZ(const dt_aligned_pixel_t sRGB, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:489
static void dt_HSL_2_RGB(const dt_aligned_pixel_t HSL, dt_aligned_pixel_t RGB)
Definition colorspaces_inline_conversions.h:720
static void dt_JzCzhz_2_JzAzBz(const dt_aligned_pixel_t JzCzhz, dt_aligned_pixel_t JzAzBz)
Definition colorspaces_inline_conversions.h:962
static void xyY_to_dt_UCS_UV(const dt_aligned_pixel_t xyY, float UV_star_prime[2])
Definition colorspaces_inline_conversions.h:1301
static void LMS_to_XYZ(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:1056
static void XYZ_to_Ych(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t Ych)
Definition colorspaces_inline_conversions.h:1215
static void dt_apply_transposed_color_matrix(const dt_aligned_pixel_t in, const dt_colormatrix_t matrix, dt_aligned_pixel_t out)
Definition colorspaces_inline_conversions.h:167
static float cbrt_5f(float f)
Definition colorspaces_inline_conversions.h:179
static void dt_xyY_to_XYZ(const dt_aligned_pixel_t xyY, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:262
static void dt_XYZ_to_Rec709_D65(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
Definition colorspaces_inline_conversions.h:417
static void dt_xyY_to_uvY(const dt_aligned_pixel_t xyY, dt_aligned_pixel_t uvY)
Definition colorspaces_inline_conversions.h:273
static float cbrta_halleyf(const float a, const float R)
Definition colorspaces_inline_conversions.h:189
static void LMS_to_Yrg(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t Yrg)
Definition colorspaces_inline_conversions.h:1102
static void dt_XYZ_to_Rec709_D50(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
Definition colorspaces_inline_conversions.h:400
static void dt_Lch_to_Luv(const dt_aligned_pixel_t Lch, dt_aligned_pixel_t Luv)
Definition colorspaces_inline_conversions.h:382
static void dt_HSV_2_RGB(const dt_aligned_pixel_t HSV, dt_aligned_pixel_t RGB)
Definition colorspaces_inline_conversions.h:765
static void dt_UCS_JCH_to_xyY(const dt_aligned_pixel_t JCH, const float L_white, dt_aligned_pixel_t xyY)
Definition colorspaces_inline_conversions.h:1358
static void dt_XYZ_to_Lab(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t Lab)
Definition colorspaces_inline_conversions.h:212
static float dt_camera_rgb_luminance(const dt_aligned_pixel_t rgb)
Definition colorspaces_inline_conversions.h:830
static const dt_colormatrix_t sRGB_to_xyz_transposed
Definition colorspaces_inline_conversions.h:566
static void dt_linearRGB_to_XYZ(const dt_aligned_pixel_t linearRGB, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:571
static void dt_RGB_2_HSV(const dt_aligned_pixel_t RGB, dt_aligned_pixel_t HSV)
Definition colorspaces_inline_conversions.h:737
static void gradingRGB_to_Ych(const dt_aligned_pixel_t RGB, dt_aligned_pixel_t Ych)
Definition colorspaces_inline_conversions.h:1202
static void dt_XYZ_to_sRGB(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
Definition colorspaces_inline_conversions.h:435
static void dt_RGB_2_HCV(const dt_aligned_pixel_t RGB, dt_aligned_pixel_t HCV)
Definition colorspaces_inline_conversions.h:777
static void dt_Lab_2_LCH(const dt_aligned_pixel_t Lab, dt_aligned_pixel_t LCH)
Definition colorspaces_inline_conversions.h:805
static void dt_RGB_2_HSL(const dt_aligned_pixel_t RGB, dt_aligned_pixel_t HSL)
Definition colorspaces_inline_conversions.h:689
static const dt_aligned_pixel_t d50
Definition colorspaces_inline_conversions.h:207
static float cbf(const float x)
Definition colorspaces_inline_conversions.h:290
static void gamut_check_Yrg(dt_aligned_pixel_t Ych)
Definition colorspaces_inline_conversions.h:1240
static void xyY_to_dt_UCS_JCH(const dt_aligned_pixel_t xyY, const float L_white, dt_aligned_pixel_t JCH)
Definition colorspaces_inline_conversions.h:1331
static const dt_colormatrix_t filmlightRGB_D65_to_LMS_D65
Definition colorspaces_inline_conversions.h:1069
static void Ych_to_XYZ(const dt_aligned_pixel_t Ych, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:1229
static void dt_JzAzBz_2_XYZ(const dt_aligned_pixel_t JzAzBz, dt_aligned_pixel_t XYZ_D65)
Definition colorspaces_inline_conversions.h:972
static void dt_Lab_to_prophotorgb(const dt_aligned_pixel_t Lab, dt_aligned_pixel_t rgb)
Definition colorspaces_inline_conversions.h:597
static void Yrg_to_LMS(const dt_aligned_pixel_t Yrg, dt_aligned_pixel_t LMS)
Definition colorspaces_inline_conversions.h:1124
static float lab_f(const float x)
Definition colorspaces_inline_conversions.h:199
static const dt_colormatrix_t LMS_D65_to_filmlightRGB_D65
Definition colorspaces_inline_conversions.h:1074
static void dt_Luv_to_Lch(const dt_aligned_pixel_t Luv, dt_aligned_pixel_t Lch)
Definition colorspaces_inline_conversions.h:322
static void dt_UCS_JCH_to_HSB(const dt_aligned_pixel_t JCH, dt_aligned_pixel_t HSB)
Definition colorspaces_inline_conversions.h:1400
static void dt_UCS_HSB_to_JCH(const dt_aligned_pixel_t HSB, dt_aligned_pixel_t JCH)
Definition colorspaces_inline_conversions.h:1408
static void dt_UCS_JCH_to_HCB(const dt_aligned_pixel_t JCH, dt_aligned_pixel_t HCB)
Definition colorspaces_inline_conversions.h:1416
static float lab_f_inv(const float x)
Definition colorspaces_inline_conversions.h:225
static float dt_UCS_L_star_to_Y(const float L_star)
Definition colorspaces_inline_conversions.h:1291
static void dt_LCH_2_Lab(const dt_aligned_pixel_t LCH, dt_aligned_pixel_t Lab)
Definition colorspaces_inline_conversions.h:823
static void dt_XYZ_to_sRGB_clipped(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
Definition colorspaces_inline_conversions.h:450
static void dt_XYZ_2_JzAzBz(const dt_aligned_pixel_t XYZ_D65, dt_aligned_pixel_t JzAzBz)
Definition colorspaces_inline_conversions.h:893
static void LMS_to_gradingRGB(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t RGB)
Definition colorspaces_inline_conversions.h:1089
static void _dt_Hue_2_RGB(dt_aligned_pixel_t RGB, const float H, const float C, const float min)
Definition colorspaces_inline_conversions.h:637
static void XYZ_to_LMS(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t LMS)
Definition colorspaces_inline_conversions.h:1048
static void dt_UCS_HSB_to_HPW(const dt_aligned_pixel_t HSB, dt_aligned_pixel_t HPW)
Definition colorspaces_inline_conversions.h:1432
static void dt_XYZ_to_xyY(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t xyY)
Definition colorspaces_inline_conversions.h:250
static void dt_Lab_to_XYZ(const dt_aligned_pixel_t Lab, dt_aligned_pixel_t XYZ)
Definition colorspaces_inline_conversions.h:236
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
static void dt_JzAzBz_2_JzCzhz(const dt_aligned_pixel_t JzAzBz, dt_aligned_pixel_t JzCzhz)
Definition colorspaces_inline_conversions.h:951
static void dt_UCS_HCB_to_JCH(const dt_aligned_pixel_t HCB, dt_aligned_pixel_t JCH)
Definition colorspaces_inline_conversions.h:1424
static void Yrg_to_Ych(const dt_aligned_pixel_t Yrg, dt_aligned_pixel_t Ych)
Definition colorspaces_inline_conversions.h:1151
static void gradingRGB_to_LMS(const dt_aligned_pixel_t RGB, dt_aligned_pixel_t LMS)
Definition colorspaces_inline_conversions.h:1081
static float Y_to_dt_UCS_L_star(const float Y)
Definition colorspaces_inline_conversions.h:1284
static void Ych_to_gradingRGB(const dt_aligned_pixel_t Ych, dt_aligned_pixel_t RGB)
Definition colorspaces_inline_conversions.h:1189
static void dt_xyY_to_Lch(const dt_aligned_pixel_t xyY, dt_aligned_pixel_t Lch)
Definition colorspaces_inline_conversions.h:331
static void dt_sRGB_to_linear_sRGB(const dt_aligned_pixel_t sRGB, dt_aligned_pixel_t RGB)
Definition colorspaces_inline_conversions.h:479
static void Ych_to_Yrg(const dt_aligned_pixel_t Ych, dt_aligned_pixel_t Yrg)
Definition colorspaces_inline_conversions.h:1170
static void dt_Rec709_to_XYZ_D50(const dt_aligned_pixel_t sRGB, dt_aligned_pixel_t XYZ_D50)
Definition colorspaces_inline_conversions.h:463
static const dt_colormatrix_t xyz_to_srgb_transposed
Definition colorspaces_inline_conversions.h:583
static void dt_XYZ_D50_2_XYZ_D65(const dt_aligned_pixel_t XYZ_D50, dt_aligned_pixel_t XYZ_D65)
Definition colorspaces_inline_conversions.h:839
static float _dt_RGB_2_Hue(const dt_aligned_pixel_t RGB, const float max, const float delta)
Definition colorspaces_inline_conversions.h:618
static void dt_XYZ_to_linearRGB(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t linearRGB)
Definition colorspaces_inline_conversions.h:588
static void dt_uvY_to_xyY(const dt_aligned_pixel_t uvY, dt_aligned_pixel_t xyY)
Definition colorspaces_inline_conversions.h:342
static void dt_prophotorgb_to_Lab(const dt_aligned_pixel_t rgb, dt_aligned_pixel_t Lab)
Definition colorspaces_inline_conversions.h:607
static void dt_XYZ_to_prophotorgb(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t rgb)
Definition colorspaces_inline_conversions.h:500
static void dt_UCS_HPW_to_HSB(const dt_aligned_pixel_t HPW, dt_aligned_pixel_t HSB)
Definition colorspaces_inline_conversions.h:1440
static void dt_xyY_to_Luv(const dt_aligned_pixel_t xyY, dt_aligned_pixel_t Luv)
Definition colorspaces_inline_conversions.h:299
static void dt_Luv_to_xyY(const dt_aligned_pixel_t Luv, dt_aligned_pixel_t xyY)
Definition colorspaces_inline_conversions.h:360
static void dt_Lch_to_xyY(const dt_aligned_pixel_t Lch, dt_aligned_pixel_t xyY)
Definition colorspaces_inline_conversions.h:389
static void dt_XYZ_D65_2_XYZ_D50(const dt_aligned_pixel_t XYZ_D65, dt_aligned_pixel_t XYZ_D50)
Definition colorspaces_inline_conversions.h:862
#define S(V, params)
Definition common/histogram.c:32
#define DT_ALIGNED_PIXEL
Definition darktable.h:271
#define for_each_channel(_var,...)
Definition darktable.h:411
#define for_four_channels(_var,...)
Definition darktable.h:413
#define H
Definition diffuse.c:526
static float f(const float t, const float c, const float x)
Definition graduatednd.c:173
#define DT_M_PI_F
Definition math.h:44
#define CLIP(x)
Definition math.h:73
#define M_PI
Definition math.h:37
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:24
static void dot_product(const dt_aligned_pixel_t v_in, const dt_colormatrix_t M, dt_aligned_pixel_t v_out)
Definition matrices.h:178
a3
Definition derive_filmic_v6_gamut_mapping.py:38
rgb
Definition derive_filmic_v6_gamut_mapping.py:19
mask
Definition dtstyle_to_xmp.py:54
static __m128 _mm_pow_ps1(__m128 x, float y)
Definition sse.h:121