38static inline __m128 lab_f_inv_m(
const __m128
x)
40 const __m128 epsilon = _mm_set1_ps(0.20689655172413796f);
41 const __m128 kappa_rcp_x16 = _mm_set1_ps(16.0f * 27.0f / 24389.0f);
42 const __m128 kappa_rcp_x116 = _mm_set1_ps(116.0f * 27.0f / 24389.0f);
45 const __m128 res_big =
x *
x *
x;
47 const __m128 res_small = kappa_rcp_x116 *
x - kappa_rcp_x16;
50 const __m128
mask = _mm_cmpgt_ps(
x, epsilon);
51 return _mm_or_ps(_mm_and_ps(mask, res_big), _mm_andnot_ps(mask, res_small));
55static inline __m128 dt_Lab_to_XYZ_sse2(
const __m128
Lab)
57 const __m128
d50 = _mm_set_ps(0.0f, 0.8249f, 1.0f, 0.9642f);
58 const __m128 coef = _mm_set_ps(0.0f, -1.0f / 200.0f, 1.0f / 116.0f, 1.0f / 500.0f);
59 const __m128 offset = _mm_set1_ps(0.137931034f);
63 const __m128
f = _mm_shuffle_ps(
Lab,
Lab, _MM_SHUFFLE(0, 2, 0, 1)) * coef;
65 return d50 * lab_f_inv_m(
f + _mm_shuffle_ps(
f,
f, _MM_SHUFFLE(1, 1, 3, 1)) + offset);
68static inline __m128 lab_f_m_sse2(
const __m128
x)
70 const __m128 epsilon = _mm_set1_ps(216.0f / 24389.0f);
71 const __m128 kappa = _mm_set1_ps(24389.0f / 27.0f);
75 const __m128
a = _mm_castsi128_ps(
76 _mm_add_epi32(_mm_cvtps_epi32(_mm_div_ps(_mm_cvtepi32_ps(_mm_castps_si128(
x)), _mm_set1_ps(3.0f))),
77 _mm_set1_epi32(709921077)));
78 const __m128
a3 =
a *
a *
a;
79 const __m128 res_big =
a * (
a3 +
x +
x) / (a3 + a3 +
x);
82 const __m128 res_small = (kappa *
x + _mm_set1_ps(16.0f)) / _mm_set1_ps(116.0f);
85 const __m128
mask = _mm_cmpgt_ps(
x, epsilon);
86 return _mm_or_ps(_mm_and_ps(mask, res_big), _mm_andnot_ps(mask, res_small));
90static inline __m128 dt_XYZ_to_Lab_sse2(
const __m128
XYZ)
92 const __m128 d50_inv = _mm_set_ps(1.0f, 0.8249f, 1.0f, 0.9642f);
93 const __m128 coef = _mm_set_ps(0.0f, 200.0f, 500.0f, 116.0f);
94 const __m128
f = lab_f_m_sse2(
XYZ / d50_inv);
96 return coef * (_mm_shuffle_ps(
f,
f, _MM_SHUFFLE(3, 1, 0, 1)) - _mm_shuffle_ps(
f,
f, _MM_SHUFFLE(3, 2, 1, 3)));
101static inline __m128 dt_XYZ_to_sRGB_sse2(__m128
XYZ)
104 const __m128 xyz_to_srgb_0 = _mm_setr_ps(3.1338561f, -0.9787684f, 0.0719453f, 0.0f);
105 const __m128 xyz_to_srgb_1 = _mm_setr_ps(-1.6168667f, 1.9161415f, -0.2289914f, 0.0f);
106 const __m128 xyz_to_srgb_2 = _mm_setr_ps(-0.4906146f, 0.0334540f, 1.4052427f, 0.0f);
109 = xyz_to_srgb_0 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(0, 0, 0, 0)) +
110 xyz_to_srgb_1 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(1, 1, 1, 1)) +
111 xyz_to_srgb_2 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(2, 2, 2, 2));
114 __m128
mask = _mm_cmple_ps(
rgb, _mm_set1_ps(0.0031308));
115 __m128 rgb0 = _mm_set1_ps(12.92) *
rgb;
116 __m128 rgb1 = _mm_set1_ps(1.0 + 0.055) *
_mm_pow_ps1(
rgb, 1.0 / 2.4) - _mm_set1_ps(0.055);
117 return _mm_or_ps(_mm_and_ps(mask, rgb0), _mm_andnot_ps(mask, rgb1));
120static inline __m128 dt_sRGB_to_XYZ_sse2(__m128
rgb)
123 const __m128 srgb_to_xyz_0 = _mm_setr_ps(0.4360747f, 0.2225045f, 0.0139322f, 0.0f);
124 const __m128 srgb_to_xyz_1 = _mm_setr_ps(0.3850649f, 0.7168786f, 0.0971045f, 0.0f);
125 const __m128 srgb_to_xyz_2 = _mm_setr_ps(0.1430804f, 0.0606169f, 0.7141733f, 0.0f);
128 __m128
mask = _mm_cmple_ps(
rgb, _mm_set1_ps(0.04045));
129 __m128 rgb0 = _mm_div_ps(
rgb, _mm_set1_ps(12.92));
130 __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);
131 rgb = _mm_or_ps(_mm_and_ps(mask, rgb0), _mm_andnot_ps(mask, rgb1));
134 = srgb_to_xyz_0 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(0, 0, 0, 0)) +
135 srgb_to_xyz_1 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(1, 1, 1, 1)) +
136 srgb_to_xyz_2 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(2, 2, 2, 2));
142static inline __m128 dt_XYZ_to_prophotoRGB_sse2(__m128
XYZ)
145 const __m128 xyz_to_rgb_0 = _mm_setr_ps( 1.3459433f, -0.5445989f, 0.0000000f, 0.0f);
146 const __m128 xyz_to_rgb_1 = _mm_setr_ps(-0.2556075f, 1.5081673f, 0.0000000f, 0.0f);
147 const __m128 xyz_to_rgb_2 = _mm_setr_ps(-0.0511118f, 0.0205351f, 1.2118128f, 0.0f);
150 = xyz_to_rgb_0 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(0, 0, 0, 0)) +
151 xyz_to_rgb_1 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(1, 1, 1, 1)) +
152 xyz_to_rgb_2 * _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(2, 2, 2, 2));
158static inline __m128 dt_prophotoRGB_to_XYZ_sse2(__m128
rgb)
161 const __m128 rgb_to_xyz_0 = _mm_setr_ps(0.7976749f, 0.2880402f, 0.0000000f, 0.0f);
162 const __m128 rgb_to_xyz_1 = _mm_setr_ps(0.1351917f, 0.7118741f, 0.0000000f, 0.0f);
163 const __m128 rgb_to_xyz_2 = _mm_setr_ps(0.0313534f, 0.0000857f, 0.8252100f, 0.0f);
166 = rgb_to_xyz_0 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(0, 0, 0, 0)) +
167 rgb_to_xyz_1 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(1, 1, 1, 1)) +
168 rgb_to_xyz_2 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(2, 2, 2, 2));
173static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
180#pragma omp declare simd aligned(in,out:16) aligned(matrix:64) uniform(matrix)
187 dt_colormatrix_row_to_simd(
matrix, 1),
188 dt_colormatrix_row_to_simd(
matrix, 2)));
192#pragma omp declare simd simdlen(4)
196 uint32_t *
const p = (uint32_t *)&
f;
197 *
p = *
p / 3 + 709921077;
202#pragma omp declare simd simdlen(4)
206 const float a3 =
a *
a *
a;
207 const float b =
a * (a3 +
R +
R) / (a3 + a3 +
R);
212#pragma omp declare simd simdlen(4)
216 const float epsilon = 216.0f / 24389.0f;
217 const float kappa = 24389.0f / 27.0f;
222static const dt_aligned_pixel_t
d50 = { 0.9642f, 1.0f, 0.8249f };
225#pragma omp declare simd aligned(Lab, XYZ:16) uniform(Lab, XYZ)
229 dt_aligned_pixel_t
f;
232 Lab[0] = 116.0f *
f[1] - 16.0f;
233 Lab[1] = 500.0f * (
f[0] -
f[1]);
234 Lab[2] = 200.0f * (
f[1] -
f[2]);
238#pragma omp declare simd simdlen(4)
242 const float epsilon = 0.20689655172413796f;
243 const float kappa = 24389.0f / 27.0f;
244 return (
x > epsilon) ?
x *
x *
x : (116.0f *
x - 16.0f) / kappa;
249#pragma omp declare simd aligned(Lab, XYZ:16) uniform(Lab, XYZ)
253 const float fy = (
Lab[0] + 16.0f) / 116.0f;
254 const float fx =
Lab[1] / 500.0f + fy;
255 const float fz = fy -
Lab[2] / 200.0f;
256 const dt_aligned_pixel_t
f = {
fx, fy,
fz };
263#pragma omp declare simd aligned(xyY, XYZ:16)
267 const float sum =
XYZ[0] +
XYZ[1] +
XYZ[2];
274dt_XYZ_to_xyY_simd(
const dt_aligned_pixel_simd_t
XYZ)
276 const float sum =
XYZ[0] +
XYZ[1] +
XYZ[2];
277 return (dt_aligned_pixel_simd_t){
XYZ[0] / sum,
XYZ[1] / sum,
XYZ[1], 0.f };
282#pragma omp declare simd aligned(xyY, XYZ:16)
291static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
292dt_xyY_to_XYZ_simd(
const dt_aligned_pixel_simd_t
xyY)
294 const float y_over_x =
xyY[2] /
xyY[1];
295 return (dt_aligned_pixel_simd_t){ y_over_x *
xyY[0],
xyY[2], y_over_x * (1.f -
xyY[0] -
xyY[1]), 0.f };
300#pragma omp declare simd aligned(xyY, uvY:16)
310 const float denominator = -2.f *
xyY[0] + 12.f *
xyY[1] + 3.f;
311 uvY[0] = 4.f *
xyY[0] / denominator;
312 uvY[1] = 9.f *
xyY[1] / denominator;
317#pragma omp declare simd
319static inline float cbf(
const float x)
326#pragma omp declare simd aligned(xyY, Luv:16)
336 dt_aligned_pixel_t
uvY;
344 Luv[1] = 13.f *
Luv[0] * (
uvY[0] - D50[0]);
345 Luv[2] = 13.f *
Luv[0] * (
uvY[1] - D50[1]);
360static inline __attribute__((always_inline))
void dt_xyY_to_Lch(
const dt_aligned_pixel_t
xyY, dt_aligned_pixel_t
Lch)
362 dt_aligned_pixel_t
Luv;
369#pragma omp declare simd aligned(uvY, xyY:16)
379 const float denominator = 6.0f *
uvY[0] - 16.f *
uvY[1] + 12.0f;
380 xyY[0] = 9.f *
uvY[0] / denominator;
381 xyY[1] = 4.f *
uvY[1] / denominator;
387#pragma omp declare simd aligned(xyY, Luv:16)
397 dt_aligned_pixel_t
uvY;
403 static const float D50[2]
DT_ALIGNED_PIXEL = { 0.20915914598542354f, 0.488075320769787f };
404 uvY[0] =
Luv[1] / (
Luv[0] * 13.f) + D50[0];
405 uvY[1] =
Luv[2] / (
Luv[0] * 13.f) + D50[1];
418static inline __attribute__((always_inline))
void dt_Lch_to_xyY(
const dt_aligned_pixel_t
Lch, dt_aligned_pixel_t
xyY)
420 dt_aligned_pixel_t
Luv;
427#pragma omp declare simd
433 { { 3.1338561f, -0.9787684f, 0.0719453f, 0.0f },
434 { -1.6168667f, 1.9161415f, -0.2289914f, 0.0f },
435 { -0.4906146f, 0.0334540f, 1.4052427f, 0.0f } };
444#pragma omp declare simd
446static inline __attribute__((always_inline))
void dt_XYZ_to_Rec709_D65(
const dt_aligned_pixel_t
XYZ, dt_aligned_pixel_t
sRGB)
451 { 3.2404542f, -0.9692660f, 0.0556434f, 0.0f },
452 { -1.5371385f, 1.8760108f, -0.2040259f, 0.0f },
453 { -0.4985314f, 0.0415560f, 1.0572252f, 0.0f },
462#pragma omp declare simd aligned(XYZ, sRGB)
467 dt_aligned_pixel_t
rgb;
470 for(
size_t c = 0;
c < 3;
c++)
471 sRGB[
c] =
rgb[
c] <= 0.0031308f ? 12.92f *
rgb[
c] : (1.0f + 0.055f) * powf(
rgb[
c], 1.0f / 2.4f) - 0.055f;
477#pragma omp declare simd aligned(XYZ, sRGB)
479static inline __attribute__((always_inline))
void dt_XYZ_to_sRGB_clipped(
const dt_aligned_pixel_t
XYZ, dt_aligned_pixel_t
sRGB)
481 dt_aligned_pixel_t result;
490#pragma omp declare simd aligned(sRGB, XYZ_D50: 16)
497 { 0.4360747f, 0.2225045f, 0.0139322f, 0.0f },
498 { 0.3850649f, 0.7168786f, 0.0971045f, 0.0f },
499 { 0.1430804f, 0.0606169f, 0.7141733f, 0.0f }
506#pragma omp declare simd aligned(sRGB, RGB)
511 for(
int c = 0;
c < 3;
c++)
512 RGB[
c] =
sRGB[
c] <= 0.04045f ?
sRGB[
c] / 12.92f : powf((
sRGB[
c] + 0.055f) / (1.0f + 0.055f), 2.4f);
516#pragma omp declare simd aligned(sRGB, XYZ)
518static inline __attribute__((always_inline))
void dt_sRGB_to_XYZ(
const dt_aligned_pixel_t
sRGB, dt_aligned_pixel_t
XYZ)
520 dt_aligned_pixel_t
rgb = { 0 };
527#pragma omp declare simd aligned(XYZ,rgb)
533 { 1.3459433f, -0.5445989f, 0.0000000f, 0.0f },
534 { -0.2556075f, 1.5081673f, 0.0000000f, 0.0f },
535 { -0.0511118f, 0.0205351f, 1.2118128f, 0.0f }
541#pragma omp declare simd aligned(rgb, XYZ)
548 { 0.7976749f, 0.2880402f, 0.0000000f, 0.0f },
549 { 0.1351917f, 0.7118741f, 0.0000000f, 0.0f },
550 { 0.0313534f, 0.0000857f, 0.8252100f, 0.0f }
558static inline __m128 dt_XYZ_to_RGB_sse2(__m128
XYZ)
561 const __m128 xyz_to_srgb_0 = _mm_setr_ps(3.1338561f, -0.9787684f, 0.0719453f, 0.0f);
562 const __m128 xyz_to_srgb_1 = _mm_setr_ps(-1.6168667f, 1.9161415f, -0.2289914f, 0.0f);
563 const __m128 xyz_to_srgb_2 = _mm_setr_ps(-0.4906146f, 0.0334540f, 1.4052427f, 0.0f);
566 = _mm_add_ps(_mm_mul_ps(xyz_to_srgb_0, _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(0, 0, 0, 0))),
567 _mm_add_ps(_mm_mul_ps(xyz_to_srgb_1, _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(1, 1, 1, 1))),
568 _mm_mul_ps(xyz_to_srgb_2, _mm_shuffle_ps(
XYZ,
XYZ, _MM_SHUFFLE(2, 2, 2, 2)))));
573static inline __m128 dt_RGB_to_XYZ_sse2(__m128
rgb)
576 const __m128 srgb_to_xyz_0 = _mm_setr_ps(0.4360747f, 0.2225045f, 0.0139322f, 0.0f);
577 const __m128 srgb_to_xyz_1 = _mm_setr_ps(0.3850649f, 0.7168786f, 0.0971045f, 0.0f);
578 const __m128 srgb_to_xyz_2 = _mm_setr_ps(0.1430804f, 0.0606169f, 0.7141733f, 0.0f);
581 = ((srgb_to_xyz_0 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(0, 0, 0, 0)))
582 + (srgb_to_xyz_1 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(1, 1, 1, 1)))
583 + (srgb_to_xyz_2 * _mm_shuffle_ps(
rgb,
rgb, _MM_SHUFFLE(2, 2, 2, 2))));
590 { { 0.4360747f, 0.3850649f, 0.1430804f },
591 { 0.2225045f, 0.7168786f, 0.0606169f },
592 { 0.0139322f, 0.0971045f, 0.7141733f } };
596 { { 0.4360747f, 0.2225045f, 0.0139322f },
597 { 0.3850649f, 0.7168786f, 0.0971045f },
598 { 0.1430804f, 0.0606169f, 0.7141733f } };
600static inline __attribute__((always_inline))
void dt_linearRGB_to_XYZ(
const dt_aligned_pixel_t
linearRGB, dt_aligned_pixel_t
XYZ)
607 { { 3.1338561f, -1.6168667f, -0.4906146f },
608 { -0.9787684f, 1.9161415f, 0.0334540f },
609 { 0.0719453f, -0.2289914f, 1.4052427f } };
613 { { 3.1338561f, -0.9787684f, 0.0719453f },
614 { -1.6168667f, 1.9161415f, -0.2289914f },
615 { -0.4906146f, 0.0334540f, 1.4052427f } };
624#pragma omp declare simd aligned(Lab, rgb)
626static inline __attribute__((always_inline))
void dt_Lab_to_prophotorgb(
const dt_aligned_pixel_t
Lab, dt_aligned_pixel_t
rgb)
628 dt_aligned_pixel_t
XYZ = { 0.0f };
634#pragma omp declare simd aligned(rgb, Lab)
636static inline __attribute__((always_inline))
void dt_prophotorgb_to_Lab(
const dt_aligned_pixel_t
rgb, dt_aligned_pixel_t
Lab)
638 dt_aligned_pixel_t
XYZ = { 0.0f };
645#pragma omp declare simd
658 if(hue < 0.0f) hue += 1.0f;
659 if(hue > 1.0f) hue -= 1.0f;
664#pragma omp declare simd aligned(RGB: 16)
668 const float h =
H * 6.0f;
669 const float i = floorf(
h);
670 const float f =
h -
i;
716#pragma omp declare simd aligned(RGB, HSL: 16)
718static inline __attribute__((always_inline))
void dt_RGB_2_HSL(
const dt_aligned_pixel_t
RGB, dt_aligned_pixel_t
HSL)
747#pragma omp declare simd aligned(HSL, RGB: 16)
749static inline __attribute__((always_inline))
void dt_HSL_2_RGB(
const dt_aligned_pixel_t
HSL, dt_aligned_pixel_t
RGB)
752 const float L =
HSL[2];
757 C = (1.0f -
L) *
HSL[1];
764#pragma omp declare simd aligned(RGB, HSV: 16)
766static inline __attribute__((always_inline))
void dt_RGB_2_HSV(
const dt_aligned_pixel_t
RGB, dt_aligned_pixel_t
HSV)
775 if(fabsf(
max) > 1e-6f && fabsf(
delta) > 1e-6f)
792#pragma omp declare simd aligned(HSV, RGB: 16)
794static inline __attribute__((always_inline))
void dt_HSV_2_RGB(
const dt_aligned_pixel_t
HSV, dt_aligned_pixel_t
RGB)
797 const float C =
HSV[1] *
HSV[2];
798 const float m =
HSV[2] -
C;
804#pragma omp declare simd aligned(RGB, HCV: 16)
806static inline __attribute__((always_inline))
void dt_RGB_2_HCV(
const dt_aligned_pixel_t
RGB, dt_aligned_pixel_t
HCV)
815 if(fabsf(
max) > 1e-6f && fabsf(
delta) > 1e-6f)
832#pragma omp declare simd
834static inline __attribute__((always_inline))
void dt_Lab_2_LCH(
const dt_aligned_pixel_t
Lab, dt_aligned_pixel_t
LCH)
850#pragma omp declare simd
852static inline __attribute__((always_inline))
void dt_LCH_2_Lab(
const dt_aligned_pixel_t
LCH, dt_aligned_pixel_t
Lab)
861 return (
rgb[0] * 0.2225045f +
rgb[1] * 0.7168786f +
rgb[2] * 0.0606169f);
866#pragma omp declare simd aligned(XYZ_D50, XYZ_D65: 16)
873 { 0.9555766f, -0.0230393f, 0.0631636f, 0.0f },
874 { -0.0282895f, 1.0099416f, 0.0210077f, 0.0f },
875 { 0.0122982f, -0.0204830f, 1.3299098f, 0.0f },
879 { 0.9555766f, -0.0282895f, 0.0122982f, 0.0f },
880 { -0.0230393f, 1.0099416f, -0.0204830f, 0.0f },
881 { 0.0631636f, 0.0210077f, 1.3299098f, 0.0f },
889#pragma omp declare simd aligned(XYZ_D50, XYZ_D65: 16)
891static inline __attribute__((always_inline))
void dt_XYZ_D65_2_XYZ_D50(
const dt_aligned_pixel_t
XYZ_D65, dt_aligned_pixel_t
XYZ_D50)
896 { 1.0478112f, 0.0228866f, -0.0501270f, 0.0f },
897 { 0.0295424f, 0.9904844f, -0.0170491f, 0.0f },
898 { -0.0092345f, 0.0150436f, 0.7521316f, 0.0f },
902 { 1.0478112f, 0.0295424f, -0.0092345f, 0.0f },
903 { 0.0228866f, 0.9904844f, 0.0150436f, 0.0f },
904 { -0.0501270f, -0.0170491f, 0.7521316f, 0.0f },
920#pragma omp declare simd aligned(XYZ_D65, JzAzBz: 16)
924 const float b = 1.15f;
925 const float g = 0.66f;
926 const float c1 = 0.8359375f;
927 const float c2 = 18.8515625f;
928 const float c3 = 18.6875f;
929 const float n = 0.159301758f;
930 const float p = 134.034375f;
931 const float d = -0.56f;
932 const float d0 = 1.6295499532821566e-11f;
934 { 0.41478972f, 0.579999f, 0.0146480f, 0.0f },
935 { -0.2015100f, 1.120649f, 0.0531008f, 0.0f },
936 { -0.0166008f, 0.264800f, 0.6684799f, 0.0f },
940 { 0.5f, 0.5f, 0.0f, 0.0f },
941 { 3.524000f, -4.066708f, 0.542708f, 0.0f },
942 { 0.199076f, 1.096799f, -1.295875f, 0.0f },
946 { 0.5f, 3.524000f, 0.199076f, 0.0f },
947 { 0.5f, -4.066708f, 1.096799f, 0.0f },
948 { 0.0f, 0.542708f, -1.295875f, 0.0f },
951 dt_aligned_pixel_t
XYZ = { 0.0f, 0.0f, 0.0f, 0.0f };
952 dt_aligned_pixel_t
LMS = { 0.0f, 0.0f, 0.0f, 0.0f };
961#pragma omp simd aligned(LMS, XYZ:16) aligned(M:64)
963 for(
int i = 0;
i < 3;
i++)
966 LMS[
i] = powf(fmaxf(
LMS[
i] / 10000.f, 0.0f),
n);
977static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
978dt_XYZ_2_JzAzBz_simd(
const dt_aligned_pixel_simd_t
XYZ_D65)
980 const float b = 1.15f;
981 const float g = 0.66f;
982 const float c1 = 0.8359375f;
983 const float c2 = 18.8515625f;
984 const float c3 = 18.6875f;
985 const float n = 0.159301758f;
986 const float p = 134.034375f;
987 const float d = -0.56f;
988 const float d0 = 1.6295499532821566e-11f;
990 { 0.41478972f, -0.2015100f, -0.0166008f, 0.0f },
991 { 0.5799990f, 1.1206490f, 0.2648000f, 0.0f },
992 { 0.0146480f, 0.0531008f, 0.6684799f, 0.0f },
995 { 0.5f, 3.524000f, 0.199076f, 0.0f },
996 { 0.5f, -4.066708f, 1.096799f, 0.0f },
997 { 0.0f, 0.542708f, -1.295875f, 0.0f },
1000 const dt_aligned_pixel_simd_t
XYZ = {
1007 dt_aligned_pixel_simd_t
LMS = dt_mat3x4_mul_vec4(
XYZ,
1008 dt_colormatrix_row_to_simd(M_transposed, 0),
1009 dt_colormatrix_row_to_simd(M_transposed, 1),
1010 dt_colormatrix_row_to_simd(M_transposed, 2));
1011 for(
int i = 0;
i < 3;
i++)
1013 LMS[
i] = powf(fmaxf(
LMS[
i] / 10000.f, 0.0f),
n);
1017 dt_aligned_pixel_simd_t
JzAzBz = dt_mat3x4_mul_vec4(
LMS,
1027#pragma omp declare simd aligned(JzAzBz, JzCzhz: 16)
1038#pragma omp declare simd aligned(JzCzhz, JzAzBz: 16)
1040static inline __attribute__((always_inline))
void dt_JzCzhz_2_JzAzBz(
const dt_aligned_pixel_t
JzCzhz, dt_aligned_pixel_t
JzAzBz)
1048#pragma omp declare simd aligned(JzAzBz, XYZ_D65: 16)
1050static inline __attribute__((always_inline))
void dt_JzAzBz_2_XYZ(
const dt_aligned_pixel_t
JzAzBz, dt_aligned_pixel_t
XYZ_D65)
1052 const float b = 1.15f;
1053 const float g = 0.66f;
1054 const float c1 = 0.8359375f;
1055 const float c2 = 18.8515625f;
1056 const float c3 = 18.6875f;
1057 const float n_inv = 1.0f / 0.159301758f;
1059 const float d = -0.56f;
1060 const float d0 = 1.6295499532821566e-11f;
1062 { 1.9242264357876067f, -1.0047923125953657f, 0.0376514040306180f, 0.0f },
1063 { 0.3503167620949991f, 0.7264811939316552f, -0.0653844229480850f, 0.0f },
1064 { -0.0909828109828475f, -0.3127282905230739f, 1.5227665613052603f, 0.0f },
1067 { 1.0f, 0.1386050432715393f, 0.0580473161561189f, 0.0f },
1068 { 1.0f, -0.1386050432715393f, -0.0580473161561189f, 0.0f },
1069 { 1.0f, -0.0960192420263190f, -0.8118918960560390f, 0.0f },
1072 dt_aligned_pixel_t
XYZ = { 0.0f, 0.0f, 0.0f, 0.0f };
1073 dt_aligned_pixel_t
LMS = { 0.0f, 0.0f, 0.0f, 0.0f };
1074 dt_aligned_pixel_t
IzAzBz = { 0.0f, 0.0f, 0.0f, 0.0f };
1083#pragma omp simd aligned(LMS, IzAzBz:16) aligned(AI:64)
1085 for(
int i = 0;
i < 3;
i++)
1094#pragma omp simd aligned(LMS, XYZ:16) aligned(MI:64)
1105 { 1.9242264357876067f, 0.3503167620949991f, -0.0909828109828475f, 0.0f },
1106 { -1.0047923125953657f, 0.7264811939316552f, -0.3127282905230739f, 0.0f },
1107 { 0.0376514040306180f, -0.0653844229480850f, 1.5227665613052603f, 0.0f },
1110 { 1.0f, 1.0f, 1.0f, 0.0f },
1111 { 0.1386050432715393f, -0.1386050432715393f, -0.0960192420263190f, 0.0f },
1112 { 0.0580473161561189f, -0.0580473161561189f, -0.8118918960560390f, 0.0f },
1115static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1116dt_JzAzBz_2_XYZ_simd(
const dt_aligned_pixel_simd_t
JzAzBz)
1118 const float b = 1.15f;
1119 const float g = 0.66f;
1120 const float c1 = 0.8359375f;
1121 const float c2 = 18.8515625f;
1122 const float c3 = 18.6875f;
1123 const float n_inv = 1.0f / 0.159301758f;
1124 const float p_inv = 1.0f / 134.034375f;
1125 const float d = -0.56f;
1126 const float d0 = 1.6295499532821566e-11f;
1133 dt_aligned_pixel_simd_t
LMS = dt_mat3x4_mul_vec4(
IzAzBz,
1137 for(
int i = 0;
i < 3;
i++)
1143 const dt_aligned_pixel_simd_t
XYZ = dt_mat3x4_mul_vec4(
LMS,
1148 return (dt_aligned_pixel_simd_t){
1149 (
XYZ[0] + (
b - 1.0f) *
XYZ[2]) /
b,
1150 (
XYZ[1] + (
g - 1.0f) * ((
XYZ[0] + (
b - 1.0f) *
XYZ[2]) /
b)) /
g,
1165 = { { 0.257085f, 0.859943f, -0.031061f, 0.f },
1166 { -0.394427f, 1.175800f, 0.106423f, 0.f },
1167 { 0.064856f, -0.076250f, 0.559067f, 0.f } };
1170 = { { 1.80794659f, -1.29971660f, 0.34785879f, 0.f },
1171 { 0.61783960f, 0.39595453f, -0.04104687f, 0.f },
1172 { -0.12546960f, 0.20478038f, 1.74274183f, 0.f } };
1176#pragma omp declare simd aligned(LMS, XYZ: 16)
1183static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1184XYZ_to_LMS_simd(
const dt_aligned_pixel_simd_t
XYZ)
1187 { 0.257085f, -0.394427f, 0.064856f, 0.f },
1188 { 0.859943f, 1.175800f, -0.076250f, 0.f },
1189 { -0.031061f, 0.106423f, 0.559067f, 0.f },
1191 return dt_mat3x4_mul_vec4(
XYZ,
1192 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 0),
1193 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 1),
1194 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 2));
1198#pragma omp declare simd aligned(XYZ, LMS: 16)
1205static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1206LMS_to_XYZ_simd(
const dt_aligned_pixel_simd_t
LMS)
1209 { 1.80794659f, 0.61783960f, -0.12546960f, 0.f },
1210 { -1.29971660f, 0.39595453f, 0.20478038f, 0.f },
1211 { 0.34785879f, -0.04104687f, 1.74274183f, 0.f },
1213 return dt_mat3x4_mul_vec4(
LMS,
1214 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 0),
1215 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 1),
1216 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 2));
1227 = { { 0.95f, 0.38f, 0.00f, 0.f },
1228 { 0.05f, 0.62f, 0.03f, 0.f },
1229 { 0.00f, 0.00f, 0.97f, 0.f } };
1232 = { { 1.0877193f, -0.66666667f, 0.02061856f, 0.f },
1233 { -0.0877193f, 1.66666667f, -0.05154639f, 0.f },
1234 { 0.f, 0.f, 1.03092784f, 0.f } };
1237#pragma omp declare simd aligned(LMS, RGB: 16)
1244static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1245gradingRGB_to_LMS_simd(
const dt_aligned_pixel_simd_t
RGB)
1248 = { { 0.95f, 0.05f, 0.00f, 0.f },
1249 { 0.38f, 0.62f, 0.00f, 0.f },
1250 { 0.00f, 0.03f, 0.97f, 0.f } };
1251 return dt_mat3x4_mul_vec4(
RGB,
1252 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 0),
1253 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 1),
1254 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 2));
1258#pragma omp declare simd aligned(LMS, RGB: 16)
1265static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1266LMS_to_gradingRGB_simd(
const dt_aligned_pixel_simd_t
LMS)
1269 = { { 1.0877193f, -0.0877193f, 0.f, 0.f },
1270 { -0.66666667f, 1.66666667f, 0.f, 0.f },
1271 { 0.02061856f, -0.05154639f, 1.03092784f, 0.f } };
1272 return dt_mat3x4_mul_vec4(
LMS,
1273 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 0),
1274 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 1),
1275 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 2));
1284#pragma omp declare simd aligned(LMS, Yrg: 16)
1289 const float Y = 0.68990272f *
LMS[0] + 0.34832189f *
LMS[1];
1293 dt_aligned_pixel_t
lms = { 0.f };
1297 dt_aligned_pixel_t
rgb = { 0.f };
1305static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1306LMS_to_Yrg_simd(
const dt_aligned_pixel_simd_t
LMS)
1308 const float Y = 0.68990272f *
LMS[0] + 0.34832189f *
LMS[1];
1310 const float inv_a = (
a == 0.f) ? 0.f : 1.f /
a;
1311 const dt_aligned_pixel_simd_t
lms = {
LMS[0] * inv_a,
LMS[1] * inv_a,
LMS[2] * inv_a, 0.f };
1312 const dt_aligned_pixel_simd_t
rgb = LMS_to_gradingRGB_simd(
lms);
1313 return (dt_aligned_pixel_simd_t){
Y,
rgb[0],
rgb[1], 0.f };
1317#pragma omp declare simd aligned(Yrg, LMS: 16)
1321 const float Y =
Yrg[0];
1325 const float g =
Yrg[2];
1327 const dt_aligned_pixel_t
rgb = {
r,
g,
b, 0.f };
1330 dt_aligned_pixel_t
lms = { 0.f };
1339static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1340Yrg_to_LMS_simd(
const dt_aligned_pixel_simd_t
Yrg)
1342 const dt_aligned_pixel_simd_t
rgb = {
Yrg[1],
Yrg[2], 1.f -
Yrg[1] -
Yrg[2], 0.f };
1343 const dt_aligned_pixel_simd_t
lms = gradingRGB_to_LMS_simd(
rgb);
1344 const float denom = 0.68990272f *
lms[0] + 0.34832189f *
lms[1];
1346 return (dt_aligned_pixel_simd_t){
lms[0] *
a,
lms[1] *
a,
lms[2] *
a, 0.f };
1354#pragma omp declare simd aligned(Ych, Yrg: 16)
1358 const float Y =
Yrg[0];
1363 const float r =
Yrg[1] - 0.21902143f;
1364 const float g =
Yrg[2] - 0.54371398f;
1372static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1373Yrg_to_Ych_simd(
const dt_aligned_pixel_simd_t
Yrg)
1375 const float r =
Yrg[1] - 0.21902143f;
1376 const float g =
Yrg[2] - 0.54371398f;
1377 return (dt_aligned_pixel_simd_t){
Yrg[0], hypotf(
g,
r), atan2f(
g,
r), 0.f };
1381#pragma omp declare simd aligned(Ych, Yrg: 16)
1385 const float Y =
Ych[0];
1386 const float c =
Ych[1];
1387 const float h =
Ych[2];
1388 const float r =
c * cosf(
h) + 0.21902143f;
1389 const float g =
c * sinf(
h) + 0.54371398f;
1395static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1396Ych_to_Yrg_simd(
const dt_aligned_pixel_simd_t
Ych)
1398 return (dt_aligned_pixel_simd_t){
1400 Ych[1] * cosf(
Ych[2]) + 0.21902143f,
1401 Ych[1] * sinf(
Ych[2]) + 0.54371398f,
1411#pragma omp declare simd aligned(Ych, RGB: 16)
1413static inline __attribute__((always_inline))
void Ych_to_gradingRGB(
const dt_aligned_pixel_t
Ych, dt_aligned_pixel_t
RGB)
1415 dt_aligned_pixel_t
Yrg = { 0.f };
1416 dt_aligned_pixel_t
LMS = { 0.f };
1422static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1423Ych_to_gradingRGB_simd(
const dt_aligned_pixel_simd_t
Ych)
1425 return LMS_to_gradingRGB_simd(Yrg_to_LMS_simd(Ych_to_Yrg_simd(
Ych)));
1430#pragma omp declare simd aligned(Ych, RGB: 16)
1432static inline __attribute__((always_inline))
void gradingRGB_to_Ych(
const dt_aligned_pixel_t
RGB, dt_aligned_pixel_t
Ych)
1434 dt_aligned_pixel_t
Yrg = { 0.f };
1435 dt_aligned_pixel_t
LMS = { 0.f };
1441static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1442gradingRGB_to_Ych_simd(
const dt_aligned_pixel_simd_t
RGB)
1444 return Yrg_to_Ych_simd(LMS_to_Yrg_simd(gradingRGB_to_LMS_simd(
RGB)));
1449#pragma omp declare simd aligned(Ych, XYZ: 16)
1451static inline __attribute__((always_inline))
void XYZ_to_Ych(
const dt_aligned_pixel_t
XYZ, dt_aligned_pixel_t
Ych)
1454 dt_aligned_pixel_t
Yrg = { 0.f };
1455 dt_aligned_pixel_t
LMS = { 0.f };
1461static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1462XYZ_to_Ych_simd(
const dt_aligned_pixel_simd_t
XYZ)
1464 return Yrg_to_Ych_simd(LMS_to_Yrg_simd(XYZ_to_LMS_simd(
XYZ)));
1469#pragma omp declare simd aligned(Ych, XYZ: 16)
1471static inline __attribute__((always_inline))
void Ych_to_XYZ(
const dt_aligned_pixel_t
Ych, dt_aligned_pixel_t
XYZ)
1474 dt_aligned_pixel_t
Yrg = { 0.f };
1475 dt_aligned_pixel_t
LMS = { 0.f };
1481static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1482Ych_to_XYZ_simd(
const dt_aligned_pixel_simd_t
Ych)
1484 return LMS_to_XYZ_simd(Yrg_to_LMS_simd(Ych_to_Yrg_simd(
Ych)));
1494 dt_aligned_pixel_t
Yrg = { 0.f };
1500 const float D65_r = 0.21902143f;
1501 const float D65_g = 0.54371398f;
1503 float max_c =
Ych[1];
1504 const float cos_h = cosf(
Ych[2]);
1505 const float sin_h = sinf(
Ych[2]);
1509 max_c = fminf(-D65_r / cos_h, max_c);
1513 max_c = fminf(-D65_g / sin_h, max_c);
1515 if(
Yrg[1] +
Yrg[2] > 1.f)
1517 max_c = fminf((1.f - D65_r - D65_g) / (cos_h + sin_h), max_c);
1524static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1525gamut_check_Yrg_simd(
const dt_aligned_pixel_simd_t
Ych)
1527 const dt_aligned_pixel_simd_t
Yrg = Ych_to_Yrg_simd(
Ych);
1528 const float cos_h = cosf(
Ych[2]);
1529 const float sin_h = sinf(
Ych[2]);
1530 float max_c =
Ych[1];
1532 if(
Yrg[1] < 0.f) max_c = fminf(-0.21902143f / cos_h, max_c);
1533 if(
Yrg[2] < 0.f) max_c = fminf(-0.54371398f / sin_h, max_c);
1534 if(
Yrg[1] +
Yrg[2] > 1.f) max_c = fminf((1.f - 0.21902143f - 0.54371398f) / (cos_h + sin_h), max_c);
1536 return (dt_aligned_pixel_simd_t){
Ych[0], max_c,
Ych[2], 0.f };
1550 const float Y_hat = powf(Y, 0.631651345306265f);
1551 return 2.098883786377f * Y_hat / (Y_hat + 1.12426773749357f);
1557 return powf((1.12426773749357f *
L_star / (2.098883786377f -
L_star)), 1.5831518565279648f);
1562#pragma omp declare simd aligned(xyY: 16)
1567 const dt_aligned_pixel_t x_factors = { -0.783941002840055f, 0.745273540913283f, 0.318707282433486f, 0.f };
1568 const dt_aligned_pixel_t
y_factors = { 0.277512987809202f, -0.205375866083878f, 2.16743692732158f, 0.f };
1569 const dt_aligned_pixel_t
offsets = { 0.153836578598858f, -0.165478376301988f, 0.291320554395942f, 0.f };
1571 dt_aligned_pixel_t
UVD = { 0.f };
1579 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1581 for(
int c = 0;
c < 2;
c++)
1592#pragma omp declare simd aligned(xyY, JCH: 16)
1613 JCH[1] = 15.932993652962535f * powf(
L_star, 0.6523997524738018f) * powf(
M2, 0.6007557017508491f) /
L_white;
1617static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1618xyY_to_dt_UCS_JCH_simd(
const dt_aligned_pixel_simd_t
xyY,
const float L_white)
1620 dt_aligned_pixel_t xyY_a = {
xyY[0],
xyY[1],
xyY[2], 0.f };
1621 dt_aligned_pixel_t
JCH = { 0.f };
1628#pragma omp declare simd aligned(xyY, JCH: 16)
1643 const float M = powf(
JCH[1] *
L_white / (15.932993652962535f * powf(
L_star, 0.6523997524738018f)), 0.8322850678616855f);
1653 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1654 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
1655 for(
int c = 0;
c < 2;
c++)
1658 const dt_aligned_pixel_t
U_factors = { 0.167171472114775f, -0.150959086409163f, 0.940254742367256f, 0.f };
1659 const dt_aligned_pixel_t
V_factors = { 0.141299802443708f, -0.155185060382272f, 1.000000000000000f, 0.f };
1660 const dt_aligned_pixel_t
offsets = { -0.00801531300850582f, -0.00843312433578007f, -0.0256325967652889f, 0.f };
1662 dt_aligned_pixel_t
xyD = { 0.f };
1671static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1672dt_UCS_JCH_to_xyY_simd(
const dt_aligned_pixel_simd_t
JCH,
const float L_white)
1674 dt_aligned_pixel_t JCH_a = {
JCH[0],
JCH[1],
JCH[2], 0.f };
1675 dt_aligned_pixel_t
xyY = { 0.f };
1683 HSB[2] =
JCH[0] * (powf(
JCH[1], 1.33654221029386f) + 1.f);
1688static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1689dt_UCS_JCH_to_HSB_simd(
const dt_aligned_pixel_simd_t
JCH)
1691 const float brightness =
JCH[0] * (powf(
JCH[1], 1.33654221029386f) + 1.f);
1692 return (dt_aligned_pixel_simd_t){
JCH[2], (brightness > 0.f) ?
JCH[1] / brightness : 0.f, brightness, 0.f };
1700 JCH[0] =
HSB[2] / (powf(
JCH[1], 1.33654221029386f) + 1.f);
1703static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1704dt_UCS_HSB_to_JCH_simd(
const dt_aligned_pixel_simd_t
HSB)
1706 const float chroma =
HSB[1] *
HSB[2];
1707 return (dt_aligned_pixel_simd_t){
1708 HSB[2] / (powf(chroma, 1.33654221029386f) + 1.f),
1718 HCB[2] =
JCH[0] * (powf(
JCH[1], 1.33654221029386f) + 1.f);
1723static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1724dt_UCS_JCH_to_HCB_simd(
const dt_aligned_pixel_simd_t
JCH)
1726 return (dt_aligned_pixel_simd_t){
1729 JCH[0] * (powf(
JCH[1], 1.33654221029386f) + 1.f),
1739 JCH[0] =
HCB[2] / (powf(
HCB[1], 1.33654221029386f) + 1.f);
1742static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1743dt_UCS_HCB_to_JCH_simd(
const dt_aligned_pixel_simd_t
HCB)
1745 return (dt_aligned_pixel_simd_t){
1746 HCB[2] / (powf(
HCB[1], 1.33654221029386f) + 1.f),
1754static inline __attribute__((always_inline))
void dt_UCS_HSB_to_HPW(
const dt_aligned_pixel_t
HSB, dt_aligned_pixel_t
HPW)
1762static inline __attribute__((always_inline))
void dt_UCS_HPW_to_HSB(
const dt_aligned_pixel_t
HPW, dt_aligned_pixel_t
HSB)
static float4 dt_UCS_JCH_to_HCB(const float4 JCH)
Definition colorspace.h:911
static float4 dt_xyY_to_XYZ(const float4 xyY)
Definition colorspace.h:645
static float4 dt_UCS_HSB_to_JCH(const float4 HSB)
Definition colorspace.h:901
static float4 gamut_check_Yrg(float4 Ych)
Definition colorspace.h:748
static float4 dt_UCS_JCH_to_HSB(const float4 JCH)
Definition colorspace.h:891
static float4 dt_XYZ_to_xyY(const float4 XYZ)
Definition colorspace.h:635
static float4 dt_UCS_HCB_to_JCH(const float4 HCB)
Definition colorspace.h:921
#define A(y, x)
Definition colorspaces.c:186
dt_aligned_pixel_t LMS
Definition colorspaces_inline_conversions.h:952
static dt_aligned_pixel_t HPW
Definition colorspaces_inline_conversions.h:1755
static dt_aligned_pixel_t Ych
Definition colorspaces_inline_conversions.h:1357
const float U_star_prime
Definition colorspaces_inline_conversions.h:1645
const float fz
Definition colorspaces_inline_conversions.h:255
dt_aligned_pixel_t UVD
Definition colorspaces_inline_conversions.h:1571
static float UV_star_prime[2]
Definition colorspaces_inline_conversions.h:1565
static const float L_white
Definition colorspaces_inline_conversions.h:1594
const float i
Definition colorspaces_inline_conversions.h:669
float UV_star[2]
Definition colorspaces_inline_conversions.h:1578
dt_UCS_JCH_to_xyY(JCH_a, L_white, xyY)
dt_aligned_pixel_t lms
Definition colorspaces_inline_conversions.h:1293
static dt_aligned_pixel_t HSV
Definition colorspaces_inline_conversions.h:767
dt_prophotorgb_to_XYZ(rgb, XYZ)
static dt_aligned_pixel_t xyY
Definition colorspaces_inline_conversions.h:266
const float L_star
Definition colorspaces_inline_conversions.h:1608
dt_sRGB_to_linear_sRGB(sRGB, rgb)
const float factors[2]
Definition colorspaces_inline_conversions.h:1579
dt_XYZ_to_Rec709_D50(XYZ, rgb)
gradingRGB_to_LMS(rgb, lms)
const float h
Definition colorspaces_inline_conversions.h:1366
static float cbrt_5f(float f)
Definition colorspaces_inline_conversions.h:194
const float c
Definition colorspaces_inline_conversions.h:1365
const float L
Definition colorspaces_inline_conversions.h:724
const dt_aligned_pixel_t V_factors
Definition colorspaces_inline_conversions.h:1659
_dt_Hue_2_RGB(RGB, HSL[0], 2.0f *C, m)
const float V
Definition colorspaces_inline_conversions.h:772
const float g
Definition colorspaces_inline_conversions.h:925
LMS_to_gradingRGB(lms, rgb)
float UV[2]
Definition colorspaces_inline_conversions.h:1652
const float fx
Definition colorspaces_inline_conversions.h:254
const float denom
Definition colorspaces_inline_conversions.h:1334
dt_apply_transposed_color_matrix(XYZ, xyz_to_srgb_matrix_transposed, sRGB)
const dt_aligned_pixel_t f
Definition colorspaces_inline_conversions.h:256
static dt_aligned_pixel_t LCH
Definition colorspaces_inline_conversions.h:835
static float cbrta_halleyf(const float a, const float R)
Definition colorspaces_inline_conversions.h:204
static dt_aligned_pixel_t HCV
Definition colorspaces_inline_conversions.h:807
dt_XYZ_to_sRGB(XYZ, result)
const dt_aligned_pixel_t offsets
Definition colorspaces_inline_conversions.h:1569
static dt_aligned_pixel_t uvY
Definition colorspaces_inline_conversions.h:303
static float dt_camera_rgb_luminance(const dt_aligned_pixel_t rgb)
Definition colorspaces_inline_conversions.h:859
static const dt_colormatrix_t sRGB_to_xyz_transposed
Definition colorspaces_inline_conversions.h:595
const float D50[2] DT_ALIGNED_PIXEL
Definition colorspaces_inline_conversions.h:343
static const dt_colormatrix_t A_transposed
Definition colorspaces_inline_conversions.h:945
static dt_aligned_pixel_t Yrg
Definition colorspaces_inline_conversions.h:1287
const float half_values[2]
Definition colorspaces_inline_conversions.h:1580
dt_XYZ_to_prophotorgb(XYZ, rgb)
static const dt_aligned_pixel_t d50
Definition colorspaces_inline_conversions.h:222
static dt_aligned_pixel_t HSL
Definition colorspaces_inline_conversions.h:719
static float cbf(const float x)
Definition colorspaces_inline_conversions.h:319
const float threshold
Definition colorspaces_inline_conversions.h:340
const float p
Definition colorspaces_inline_conversions.h:930
static const dt_colormatrix_t filmlightRGB_D65_to_LMS_D65
Definition colorspaces_inline_conversions.h:1227
static const float dt_aligned_pixel_t JCH
Definition colorspaces_inline_conversions.h:1595
const float d0
Definition colorspaces_inline_conversions.h:932
const float d
Definition colorspaces_inline_conversions.h:931
static dt_aligned_pixel_t HSB
Definition colorspaces_inline_conversions.h:1682
xyY_to_dt_UCS_UV(xyY, UV_star_prime)
static const float const float const float min
Definition colorspaces_inline_conversions.h:667
static const dt_colormatrix_t M
Definition colorspaces_inline_conversions.h:933
const float n_inv
Definition colorspaces_inline_conversions.h:1057
const dt_colormatrix_t MI
Definition colorspaces_inline_conversions.h:1061
static float lab_f(const float x)
Definition colorspaces_inline_conversions.h:214
static const dt_colormatrix_t AI_transposed
Definition colorspaces_inline_conversions.h:1109
static const dt_colormatrix_t LMS_D65_to_filmlightRGB_D65
Definition colorspaces_inline_conversions.h:1232
const float inc
Definition colorspaces_inline_conversions.h:673
const float m
Definition colorspaces_inline_conversions.h:758
static dt_aligned_pixel_t sRGB
Definition colorspaces_inline_conversions.h:430
static float lab_f_inv(const float x)
Definition colorspaces_inline_conversions.h:240
dt_aligned_pixel_t xyD
Definition colorspaces_inline_conversions.h:1662
const float r
Definition colorspaces_inline_conversions.h:1324
dt_aligned_pixel_t IzAzBz
Definition colorspaces_inline_conversions.h:1074
static float dt_UCS_L_star_to_Y(const float L_star)
Definition colorspaces_inline_conversions.h:1554
const float max
Definition colorspaces_inline_conversions.h:721
static dt_aligned_pixel_t XYZ_D65
Definition colorspaces_inline_conversions.h:869
const float b
Definition colorspaces_inline_conversions.h:1326
static dt_aligned_pixel_t Lab
Definition colorspaces_inline_conversions.h:228
static dt_aligned_pixel_t HCB
Definition colorspaces_inline_conversions.h:1717
const float a
Definition colorspaces_inline_conversions.h:1292
static dt_aligned_pixel_t XYZ_D50
Definition colorspaces_inline_conversions.h:493
const float p_inv
Definition colorspaces_inline_conversions.h:1058
const dt_colormatrix_t AI
Definition colorspaces_inline_conversions.h:1066
const dt_aligned_pixel_t y_factors
Definition colorspaces_inline_conversions.h:1568
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
const float c3
Definition colorspaces_inline_conversions.h:928
static const dt_colormatrix_t XYZ_D65_to_LMS_2006_D65
Definition colorspaces_inline_conversions.h:1165
const float n
Definition colorspaces_inline_conversions.h:929
const size_t i_idx
Definition colorspaces_inline_conversions.h:675
dt_Rec709_to_XYZ_D50(rgb, XYZ)
const float M2
Definition colorspaces_inline_conversions.h:1609
static const dt_colormatrix_t LMS_2006_D65_to_XYZ_D65
Definition colorspaces_inline_conversions.h:1170
static dt_aligned_pixel_t XYZ
Definition colorspaces_inline_conversions.h:252
static dt_aligned_pixel_t JzCzhz
Definition colorspaces_inline_conversions.h:1030
static float Y_to_dt_UCS_L_star(const float Y)
Definition colorspaces_inline_conversions.h:1547
dt_store_simd_aligned(out, dt_mat3x4_mul_vec4(vin, dt_colormatrix_row_to_simd(matrix, 0), dt_colormatrix_row_to_simd(matrix, 1), dt_colormatrix_row_to_simd(matrix, 2)))
const float c2
Definition colorspaces_inline_conversions.h:927
static const dt_colormatrix_t MI_transposed
Definition colorspaces_inline_conversions.h:1104
static const float const float C
Definition colorspaces_inline_conversions.h:666
static const dt_colormatrix_t xyz_to_srgb_transposed
Definition colorspaces_inline_conversions.h:612
const float top
Definition colorspaces_inline_conversions.h:672
static const int row
Definition colorspaces_inline_conversions.h:175
static dt_aligned_pixel_t JzAzBz
Definition colorspaces_inline_conversions.h:923
const float c1
Definition colorspaces_inline_conversions.h:926
static dt_aligned_pixel_t rgb
Definition colorspaces_inline_conversions.h:530
static dt_aligned_pixel_t Luv
Definition colorspaces_inline_conversions.h:329
xyY_to_dt_UCS_JCH(xyY_a, L_white, JCH)
const float V_star_prime
Definition colorspaces_inline_conversions.h:1646
static float _dt_RGB_2_Hue(const dt_aligned_pixel_t RGB, const float max, const float delta)
Definition colorspaces_inline_conversions.h:647
static dt_aligned_pixel_t RGB
Definition colorspaces_inline_conversions.h:509
static dt_aligned_pixel_t linearRGB
Definition colorspaces_inline_conversions.h:618
static const dt_colormatrix_t matrix
Definition colorspaces_inline_conversions.h:182
const float fc
Definition colorspaces_inline_conversions.h:671
static dt_aligned_pixel_t Lch
Definition colorspaces_inline_conversions.h:352
return dt_load_simd_aligned(JCH)
const float delta
Definition colorspaces_inline_conversions.h:722
float S
Definition colorspaces_inline_conversions.h:725
const dt_aligned_pixel_t U_factors
Definition colorspaces_inline_conversions.h:1658
const float dec
Definition colorspaces_inline_conversions.h:674
else var_H
Definition colorspaces_inline_conversions.h:841
static const float H
Definition colorspaces_inline_conversions.h:666
#define for_each_channel(_var,...)
Definition darktable.h:582
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Multi-tap smudge source sample with directional jitter.
Definition darktable.h:448
#define for_four_channels(_var,...)
Definition darktable.h:584
static const float x
Definition iop_profile.h:239
#define DT_M_PI_F
Definition math.h:52
#define CLIP(x)
Definition math.h:81
#define M_PI
Definition math.h:45
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:33
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:204
a3
Definition derive_filmic_v6_gamut_mapping.py:62
Y
Definition derive_filmic_v6_gamut_mapping.py:35
mask
Definition dtstyle_to_xmp.py:79
static __m128 _mm_pow_ps1(__m128 x, float y)
Definition sse.h:127