33static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
43 const dt_aligned_pixel_simd_t vin = dt_load_simd_aligned(in);
45 dt_colormatrix_row_to_simd(
matrix, 1),
46 dt_colormatrix_row_to_simd(
matrix, 2)));
52 uint32_t *
const p = (uint32_t *)&
f;
53 *
p = *
p / 3 + 709921077;
60 const float a3 = a * a * a;
61 const float b = a * (a3 +
R +
R) / (a3 + a3 +
R);
66static inline
float lab_f(const
float x)
68 const float epsilon = 216.0f / 24389.0f;
69 const float kappa = 24389.0f / 27.0f;
82 Lab[0] = 116.0f *
f[1] - 16.0f;
83 Lab[1] = 500.0f * (
f[0] -
f[1]);
84 Lab[2] = 200.0f * (
f[1] -
f[2]);
90 const float epsilon = 0.20689655172413796f;
91 const float kappa = 24389.0f / 27.0f;
92 return (
x > epsilon) ?
x *
x *
x : (116.0f *
x - 16.0f) / kappa;
99 const float fy = (
Lab[0] + 16.0f) / 116.0f;
100 const float fx =
Lab[1] / 500.0f + fy;
101 const float fz = fy -
Lab[2] / 200.0f;
111 const float sum =
XYZ[0] +
XYZ[1] +
XYZ[2];
118dt_XYZ_to_xyY_simd(
const dt_aligned_pixel_simd_t
XYZ)
120 const float sum =
XYZ[0] +
XYZ[1] +
XYZ[2];
121 return (dt_aligned_pixel_simd_t){
XYZ[0] / sum,
XYZ[1] / sum,
XYZ[1], 0.f };
133static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
134dt_xyY_to_XYZ_simd(
const dt_aligned_pixel_simd_t
xyY)
136 const float y_over_x =
xyY[2] /
xyY[1];
137 return (dt_aligned_pixel_simd_t){ y_over_x *
xyY[0],
xyY[2], y_over_x * (1.f -
xyY[0] -
xyY[1]), 0.f };
150 const float denominator = -2.f *
xyY[0] + 12.f *
xyY[1] + 3.f;
151 uvY[0] = 4.f *
xyY[0] / denominator;
152 uvY[1] = 9.f *
xyY[1] / denominator;
157static inline
float cbf(const
float x)
180 Luv[1] = 13.f *
Luv[0] * (
uvY[0] - D50[0]);
181 Luv[2] = 13.f *
Luv[0] * (
uvY[1] - D50[1]);
213 const float denominator = 6.0f *
uvY[0] - 16.f *
uvY[1] + 12.0f;
214 xyY[0] = 9.f *
uvY[0] / denominator;
215 xyY[1] = 4.f *
uvY[1] / denominator;
235 static const float D50[2]
DT_ALIGNED_PIXEL = { 0.20915914598542354f, 0.488075320769787f };
236 uvY[0] =
Luv[1] / (
Luv[0] * 13.f) + D50[0];
237 uvY[1] =
Luv[2] / (
Luv[0] * 13.f) + D50[1];
263 { { 3.1338561f, -0.9787684f, 0.0719453f, 0.0f },
264 { -1.6168667f, 1.9161415f, -0.2289914f, 0.0f },
265 { -0.4906146f, 0.0334540f, 1.4052427f, 0.0f } };
279 { 3.2404542f, -0.9692660f, 0.0556434f, 0.0f },
280 { -1.5371385f, 1.8760108f, -0.2040259f, 0.0f },
281 { -0.4985314f, 0.0415560f, 1.0572252f, 0.0f },
296 for(
size_t c = 0; c < 3; c++)
297 sRGB[c] =
rgb[c] <= 0.0031308f ? 12.92f *
rgb[c] : (1.0f + 0.055f) * powf(
rgb[c], 1.0f / 2.4f) - 0.055f;
319 { 0.4360747f, 0.2225045f, 0.0139322f, 0.0f },
320 { 0.3850649f, 0.7168786f, 0.0971045f, 0.0f },
321 { 0.1430804f, 0.0606169f, 0.7141733f, 0.0f }
329 for(
int c = 0; c < 3; c++)
330 RGB[c] =
sRGB[c] <= 0.04045f ?
sRGB[c] / 12.92f : powf((
sRGB[c] + 0.055f) / (1.0f + 0.055f), 2.4f);
347 { 1.3459433f, -0.5445989f, 0.0000000f, 0.0f },
348 { -0.2556075f, 1.5081673f, 0.0000000f, 0.0f },
349 { -0.0511118f, 0.0205351f, 1.2118128f, 0.0f }
360 { 0.7976749f, 0.2880402f, 0.0000000f, 0.0f },
361 { 0.1351917f, 0.7118741f, 0.0000000f, 0.0f },
362 { 0.0313534f, 0.0000857f, 0.8252100f, 0.0f }
369 { { 0.4360747f, 0.3850649f, 0.1430804f },
370 { 0.2225045f, 0.7168786f, 0.0606169f },
371 { 0.0139322f, 0.0971045f, 0.7141733f } };
375 { { 0.4360747f, 0.2225045f, 0.0139322f },
376 { 0.3850649f, 0.7168786f, 0.0971045f },
377 { 0.1430804f, 0.0606169f, 0.7141733f } };
386 { { 3.1338561f, -1.6168667f, -0.4906146f },
387 { -0.9787684f, 1.9161415f, 0.0334540f },
388 { 0.0719453f, -0.2289914f, 1.4052427f } };
392 { { 3.1338561f, -0.9787684f, 0.0719453f },
393 { -1.6168667f, 1.9161415f, -0.2289914f },
394 { -0.4906146f, 0.0334540f, 1.4052427f } };
431 if(hue < 0.0f) hue += 1.0f;
432 if(hue > 1.0f) hue -= 1.0f;
439 const float h =
H * 6.0f;
440 const float i = floorf(h);
441 const float f = h -
i;
519 const float L =
HSL[2];
524 C = (1.0f -
L) *
HSL[1];
540 if(fabsf(
max) > 1e-6f && fabsf(
delta) > 1e-6f)
560 const float C =
HSV[1] *
HSV[2];
561 const float m =
HSV[2] -
C;
576 if(fabsf(
max) > 1e-6f && fabsf(
delta) > 1e-6f)
619 return (
rgb[0] * 0.2225045f +
rgb[1] * 0.7168786f +
rgb[2] * 0.0606169f);
627 { 0.9555766f, -0.0230393f, 0.0631636f, 0.0f },
628 { -0.0282895f, 1.0099416f, 0.0210077f, 0.0f },
629 { 0.0122982f, -0.0204830f, 1.3299098f, 0.0f },
633 { 0.9555766f, -0.0282895f, 0.0122982f, 0.0f },
634 { -0.0230393f, 1.0099416f, -0.0204830f, 0.0f },
635 { 0.0631636f, 0.0210077f, 1.3299098f, 0.0f },
647 { 1.0478112f, 0.0228866f, -0.0501270f, 0.0f },
648 { 0.0295424f, 0.9904844f, -0.0170491f, 0.0f },
649 { -0.0092345f, 0.0150436f, 0.7521316f, 0.0f },
653 { 1.0478112f, 0.0295424f, -0.0092345f, 0.0f },
654 { 0.0228866f, 0.9904844f, 0.0150436f, 0.0f },
655 { -0.0501270f, -0.0170491f, 0.7521316f, 0.0f },
673 const float b = 1.15f;
674 const float g = 0.66f;
675 const float c1 = 0.8359375f;
676 const float c2 = 18.8515625f;
677 const float c3 = 18.6875f;
678 const float n = 0.159301758f;
679 const float p = 134.034375f;
680 const float d = -0.56f;
681 const float d0 = 1.6295499532821566e-11f;
683 { 0.41478972f, 0.579999f, 0.0146480f, 0.0f },
684 { -0.2015100f, 1.120649f, 0.0531008f, 0.0f },
685 { -0.0166008f, 0.264800f, 0.6684799f, 0.0f },
689 { 0.5f, 0.5f, 0.0f, 0.0f },
690 { 3.524000f, -4.066708f, 0.542708f, 0.0f },
691 { 0.199076f, 1.096799f, -1.295875f, 0.0f },
695 { 0.5f, 3.524000f, 0.199076f, 0.0f },
696 { 0.5f, -4.066708f, 1.096799f, 0.0f },
697 { 0.0f, 0.542708f, -1.295875f, 0.0f },
710 for(int
i = 0;
i < 3;
i++)
713 LMS[
i] = powf(fmaxf(
LMS[
i] / 10000.f, 0.0f),
n);
724static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
725dt_XYZ_2_JzAzBz_simd(
const dt_aligned_pixel_simd_t
XYZ_D65)
727 const float b = 1.15f;
728 const float g = 0.66f;
729 const float c1 = 0.8359375f;
730 const float c2 = 18.8515625f;
731 const float c3 = 18.6875f;
732 const float n = 0.159301758f;
733 const float p = 134.034375f;
734 const float d = -0.56f;
735 const float d0 = 1.6295499532821566e-11f;
737 { 0.41478972f, -0.2015100f, -0.0166008f, 0.0f },
738 { 0.5799990f, 1.1206490f, 0.2648000f, 0.0f },
739 { 0.0146480f, 0.0531008f, 0.6684799f, 0.0f },
742 { 0.5f, 3.524000f, 0.199076f, 0.0f },
743 { 0.5f, -4.066708f, 1.096799f, 0.0f },
744 { 0.0f, 0.542708f, -1.295875f, 0.0f },
747 const dt_aligned_pixel_simd_t
XYZ = {
754 dt_aligned_pixel_simd_t
LMS = dt_mat3x4_mul_vec4(
XYZ,
755 dt_colormatrix_row_to_simd(M_transposed, 0),
756 dt_colormatrix_row_to_simd(M_transposed, 1),
757 dt_colormatrix_row_to_simd(M_transposed, 2));
758 for(
int i = 0;
i < 3;
i++)
760 LMS[
i] = powf(fmaxf(
LMS[
i] / 10000.f, 0.0f),
n);
764 dt_aligned_pixel_simd_t
JzAzBz = dt_mat3x4_mul_vec4(
LMS,
793 const float b = 1.15f;
794 const float g = 0.66f;
795 const float c1 = 0.8359375f;
796 const float c2 = 18.8515625f;
797 const float c3 = 18.6875f;
798 const float n_inv = 1.0f / 0.159301758f;
799 const float p_inv = 1.0f / 134.034375f;
800 const float d = -0.56f;
801 const float d0 = 1.6295499532821566e-11f;
803 { 1.9242264357876067f, -1.0047923125953657f, 0.0376514040306180f, 0.0f },
804 { 0.3503167620949991f, 0.7264811939316552f, -0.0653844229480850f, 0.0f },
805 { -0.0909828109828475f, -0.3127282905230739f, 1.5227665613052603f, 0.0f },
808 { 1.0f, 0.1386050432715393f, 0.0580473161561189f, 0.0f },
809 { 1.0f, -0.1386050432715393f, -0.0580473161561189f, 0.0f },
810 { 1.0f, -0.0960192420263190f, -0.8118918960560390f, 0.0f },
824 for(int
i = 0;
i < 3;
i++)
842 { 1.9242264357876067f, 0.3503167620949991f, -0.0909828109828475f, 0.0f },
843 { -1.0047923125953657f, 0.7264811939316552f, -0.3127282905230739f, 0.0f },
844 { 0.0376514040306180f, -0.0653844229480850f, 1.5227665613052603f, 0.0f },
847 { 1.0f, 1.0f, 1.0f, 0.0f },
848 { 0.1386050432715393f, -0.1386050432715393f, -0.0960192420263190f, 0.0f },
849 { 0.0580473161561189f, -0.0580473161561189f, -0.8118918960560390f, 0.0f },
852static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
853dt_JzAzBz_2_XYZ_simd(
const dt_aligned_pixel_simd_t
JzAzBz)
855 const float b = 1.15f;
856 const float g = 0.66f;
857 const float c1 = 0.8359375f;
858 const float c2 = 18.8515625f;
859 const float c3 = 18.6875f;
860 const float n_inv = 1.0f / 0.159301758f;
861 const float p_inv = 1.0f / 134.034375f;
862 const float d = -0.56f;
863 const float d0 = 1.6295499532821566e-11f;
870 dt_aligned_pixel_simd_t
LMS = dt_mat3x4_mul_vec4(
IzAzBz,
871 dt_colormatrix_row_to_simd(AI_transposed, 0),
872 dt_colormatrix_row_to_simd(AI_transposed, 1),
873 dt_colormatrix_row_to_simd(AI_transposed, 2));
874 for(
int i = 0;
i < 3;
i++)
880 const dt_aligned_pixel_simd_t
XYZ = dt_mat3x4_mul_vec4(
LMS,
881 dt_colormatrix_row_to_simd(MI_transposed, 0),
882 dt_colormatrix_row_to_simd(MI_transposed, 1),
883 dt_colormatrix_row_to_simd(MI_transposed, 2));
885 return (dt_aligned_pixel_simd_t){
887 (
XYZ[1] + (
g - 1.0f) * ((
XYZ[0] + (b - 1.0f) *
XYZ[2]) / b)) /
g,
902 = { { 0.257085f, 0.859943f, -0.031061f, 0.f },
903 { -0.394427f, 1.175800f, 0.106423f, 0.f },
904 { 0.064856f, -0.076250f, 0.559067f, 0.f } };
907 = { { 1.80794659f, -1.29971660f, 0.34785879f, 0.f },
908 { 0.61783960f, 0.39595453f, -0.04104687f, 0.f },
909 { -0.12546960f, 0.20478038f, 1.74274183f, 0.f } };
915 dot_product(
XYZ, XYZ_D65_to_LMS_2006_D65,
LMS);
918static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
919XYZ_to_LMS_simd(
const dt_aligned_pixel_simd_t
XYZ)
922 { 0.257085f, -0.394427f, 0.064856f, 0.f },
923 { 0.859943f, 1.175800f, -0.076250f, 0.f },
924 { -0.031061f, 0.106423f, 0.559067f, 0.f },
926 return dt_mat3x4_mul_vec4(
XYZ,
927 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 0),
928 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 1),
929 dt_colormatrix_row_to_simd(XYZ_D65_to_LMS_2006_D65_transposed, 2));
935 dot_product(
LMS, LMS_2006_D65_to_XYZ_D65,
XYZ);
938static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
939LMS_to_XYZ_simd(
const dt_aligned_pixel_simd_t
LMS)
942 { 1.80794659f, 0.61783960f, -0.12546960f, 0.f },
943 { -1.29971660f, 0.39595453f, 0.20478038f, 0.f },
944 { 0.34785879f, -0.04104687f, 1.74274183f, 0.f },
946 return dt_mat3x4_mul_vec4(
LMS,
947 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 0),
948 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 1),
949 dt_colormatrix_row_to_simd(LMS_2006_D65_to_XYZ_D65_transposed, 2));
960 = { { 0.95f, 0.38f, 0.00f, 0.f },
961 { 0.05f, 0.62f, 0.03f, 0.f },
962 { 0.00f, 0.00f, 0.97f, 0.f } };
965 = { { 1.0877193f, -0.66666667f, 0.02061856f, 0.f },
966 { -0.0877193f, 1.66666667f, -0.05154639f, 0.f },
967 { 0.f, 0.f, 1.03092784f, 0.f } };
972 dot_product(
RGB, filmlightRGB_D65_to_LMS_D65,
LMS);
975static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
976gradingRGB_to_LMS_simd(
const dt_aligned_pixel_simd_t
RGB)
979 = { { 0.95f, 0.05f, 0.00f, 0.f },
980 { 0.38f, 0.62f, 0.00f, 0.f },
981 { 0.00f, 0.03f, 0.97f, 0.f } };
982 return dt_mat3x4_mul_vec4(
RGB,
983 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 0),
984 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 1),
985 dt_colormatrix_row_to_simd(filmlightRGB_D65_to_LMS_D65_transposed, 2));
991 dot_product(
LMS, LMS_D65_to_filmlightRGB_D65,
RGB);
994static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
995LMS_to_gradingRGB_simd(
const dt_aligned_pixel_simd_t
LMS)
998 = { { 1.0877193f, -0.0877193f, 0.f, 0.f },
999 { -0.66666667f, 1.66666667f, 0.f, 0.f },
1000 { 0.02061856f, -0.05154639f, 1.03092784f, 0.f } };
1001 return dt_mat3x4_mul_vec4(
LMS,
1002 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 0),
1003 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 1),
1004 dt_colormatrix_row_to_simd(LMS_D65_to_filmlightRGB_D65_transposed, 2));
1016 const float Y = 0.68990272f *
LMS[0] + 0.34832189f *
LMS[1];
1019 const float a =
LMS[0] +
LMS[1] +
LMS[2];
1032static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1033LMS_to_Yrg_simd(
const dt_aligned_pixel_simd_t
LMS)
1035 const float Y = 0.68990272f *
LMS[0] + 0.34832189f *
LMS[1];
1036 const float a =
LMS[0] +
LMS[1] +
LMS[2];
1037 const float inv_a = (a == 0.f) ? 0.f : 1.f / a;
1038 const dt_aligned_pixel_simd_t
lms = {
LMS[0] * inv_a,
LMS[1] * inv_a,
LMS[2] * inv_a, 0.f };
1039 const dt_aligned_pixel_simd_t
rgb = LMS_to_gradingRGB_simd(lms);
1040 return (dt_aligned_pixel_simd_t){
Y,
rgb[0],
rgb[1], 0.f };
1046 const float Y =
Yrg[0];
1049 const float r =
Yrg[1];
1050 const float g =
Yrg[2];
1051 const float b = 1.f -
r -
g;
1059 const float denom = (0.68990272f *
lms[0] + 0.34832189f *
lms[1]);
1060 const float a = (denom == 0.f) ? 0.f :
Y / denom;
1064static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1065Yrg_to_LMS_simd(
const dt_aligned_pixel_simd_t Yrg)
1067 const dt_aligned_pixel_simd_t
rgb = {
Yrg[1],
Yrg[2], 1.f -
Yrg[1] -
Yrg[2], 0.f };
1068 const dt_aligned_pixel_simd_t
lms = gradingRGB_to_LMS_simd(
rgb);
1069 const float denom = 0.68990272f *
lms[0] + 0.34832189f *
lms[1];
1070 const float a = (denom == 0.f) ? 0.f :
Yrg[0] / denom;
1071 return (dt_aligned_pixel_simd_t){
lms[0] * a,
lms[1] * a,
lms[2] * a, 0.f };
1081 const float Y =
Yrg[0];
1086 const float r =
Yrg[1] - 0.21902143f;
1087 const float g =
Yrg[2] - 0.54371398f;
1088 const float c = hypotf(
g,
r);
1089 const float h = atan2f(
g,
r);
1095static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1096Yrg_to_Ych_simd(
const dt_aligned_pixel_simd_t Yrg)
1098 const float r =
Yrg[1] - 0.21902143f;
1099 const float g =
Yrg[2] - 0.54371398f;
1100 return (dt_aligned_pixel_simd_t){
Yrg[0], hypotf(
g,
r), atan2f(
g,
r), 0.f };
1106 const float Y = Ych[0];
1107 const float c = Ych[1];
1108 const float h = Ych[2];
1109 const float r =
c * cosf(h) + 0.21902143f;
1110 const float g =
c * sinf(h) + 0.54371398f;
1116static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1117Ych_to_Yrg_simd(
const dt_aligned_pixel_simd_t Ych)
1119 return (dt_aligned_pixel_simd_t){
1121 Ych[1] * cosf(Ych[2]) + 0.21902143f,
1122 Ych[1] * sinf(Ych[2]) + 0.54371398f,
1141static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1142Ych_to_gradingRGB_simd(
const dt_aligned_pixel_simd_t Ych)
1144 return LMS_to_gradingRGB_simd(Yrg_to_LMS_simd(Ych_to_Yrg_simd(Ych)));
1158static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1159gradingRGB_to_Ych_simd(
const dt_aligned_pixel_simd_t
RGB)
1161 return Yrg_to_Ych_simd(LMS_to_Yrg_simd(gradingRGB_to_LMS_simd(
RGB)));
1176static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1177XYZ_to_Ych_simd(
const dt_aligned_pixel_simd_t
XYZ)
1179 return Yrg_to_Ych_simd(LMS_to_Yrg_simd(XYZ_to_LMS_simd(
XYZ)));
1194static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1195Ych_to_XYZ_simd(
const dt_aligned_pixel_simd_t Ych)
1197 return LMS_to_XYZ_simd(Yrg_to_LMS_simd(Ych_to_Yrg_simd(Ych)));
1213 const float D65_r = 0.21902143f;
1214 const float D65_g = 0.54371398f;
1216 float max_c = Ych[1];
1217 const float cos_h = cosf(Ych[2]);
1218 const float sin_h = sinf(Ych[2]);
1222 max_c = fminf(-D65_r / cos_h, max_c);
1226 max_c = fminf(-D65_g / sin_h, max_c);
1228 if(Yrg[1] + Yrg[2] > 1.f)
1230 max_c = fminf((1.f - D65_r - D65_g) / (cos_h + sin_h), max_c);
1237static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1238gamut_check_Yrg_simd(
const dt_aligned_pixel_simd_t Ych)
1240 const dt_aligned_pixel_simd_t
Yrg = Ych_to_Yrg_simd(Ych);
1241 const float cos_h = cosf(Ych[2]);
1242 const float sin_h = sinf(Ych[2]);
1243 float max_c = Ych[1];
1245 if(Yrg[1] < 0.f) max_c = fminf(-0.21902143f / cos_h, max_c);
1246 if(Yrg[2] < 0.f) max_c = fminf(-0.54371398f / sin_h, max_c);
1247 if(Yrg[1] + Yrg[2] > 1.f) max_c = fminf((1.f - 0.21902143f - 0.54371398f) / (cos_h + sin_h), max_c);
1249 return (dt_aligned_pixel_simd_t){ Ych[0], max_c, Ych[2], 0.f };
1263 const float Y_hat = powf(Y, 0.631651345306265f);
1264 return 2.098883786377f * Y_hat / (Y_hat + 1.12426773749357f);
1270 return powf((1.12426773749357f * L_star / (2.098883786377f - L_star)), 1.5831518565279648f);
1278 const dt_aligned_pixel_t x_factors = { -0.783941002840055f, 0.745273540913283f, 0.318707282433486f, 0.f };
1279 const dt_aligned_pixel_t y_factors = { 0.277512987809202f, -0.205375866083878f, 2.16743692732158f, 0.f };
1280 const dt_aligned_pixel_t offsets = { 0.153836578598858f, -0.165478376301988f, 0.291320554395942f, 0.f };
1284 UVD[
c] = x_factors[
c] *
xyY[0] + y_factors[
c] *
xyY[1] + offsets[
c];
1289 float UV_star[2] = { 0.f };
1290 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1291 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
1292 for(
int c = 0;
c < 2;
c++)
1293 UV_star[c] = factors[c] * UVD[c] / (fabsf(UVD[c]) + half_values[c]);
1296 UV_star_prime[0] = -1.124983854323892f * UV_star[0] - 0.980483721769325f * UV_star[1];
1297 UV_star_prime[1] = 1.86323315098672f * UV_star[0] + 1.971853092390862f * UV_star[1];
1302static inline
void dt_UCS_LUV_to_JCH(const float L_star, const float L_white, const float UV_star_prime[2],
dt_aligned_pixel_t JCH)
1304 const float M2 = UV_star_prime[0] * UV_star_prime[0] + UV_star_prime[1] * UV_star_prime[1];
1307 JCH[0] = L_star / L_white;
1308 JCH[1] = 15.932993652962535f * powf(L_star, 0.6523997524738018f) * powf(M2, 0.6007557017508491f) / L_white;
1309 JCH[2] = atan2f(UV_star_prime[1], UV_star_prime[0]);
1325 float UV_star_prime[2];
1330static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1331xyY_to_dt_UCS_JCH_simd(
const dt_aligned_pixel_simd_t
xyY,
const float L_white)
1336 return dt_load_simd_aligned(JCH);
1353 const float L_star = JCH[0] * L_white;
1354 const float M = powf(JCH[1] * L_white / (15.932993652962535f * powf(L_star, 0.6523997524738018f)), 0.8322850678616855f);
1356 const float U_star_prime =
M * cosf(JCH[2]);
1357 const float V_star_prime =
M * sinf(JCH[2]);
1360 const float UV_star[2] = { -5.037522385190711f * U_star_prime - 2.504856328185843f * V_star_prime,
1361 4.760029407436461f * U_star_prime + 2.874012963239247f * V_star_prime };
1363 float UV[2] = { 0.f };
1364 const float factors[2] = { 1.39656225667f, 1.4513954287f };
1365 const float half_values[2] = { 1.49217352929f, 1.52488637914f };
1366 for(
int c = 0;
c < 2;
c++)
1367 UV[c] = -half_values[c] * UV_star[c] / (fabsf(UV_star[c]) - factors[c]);
1369 const dt_aligned_pixel_t U_factors = { 0.167171472114775f, -0.150959086409163f, 0.940254742367256f, 0.f };
1370 const dt_aligned_pixel_t V_factors = { 0.141299802443708f, -0.155185060382272f, 1.000000000000000f, 0.f };
1371 const dt_aligned_pixel_t offsets = { -0.00801531300850582f, -0.00843312433578007f, -0.0256325967652889f, 0.f };
1375 xyD[
c] = U_factors[
c] * UV[0] + V_factors[
c] * UV[1] + offsets[
c];
1377 xyY[0] = xyD[0] / xyD[2];
1378 xyY[1] = xyD[1] / xyD[2];
1382static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1383dt_UCS_JCH_to_xyY_simd(
const dt_aligned_pixel_simd_t JCH,
const float L_white)
1388 return dt_load_simd_aligned(
xyY);
1394 HSB[2] = JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f);
1395 HSB[1] = (HSB[2] > 0.f) ? JCH[1] / HSB[2] : 0.f;
1399static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1400dt_UCS_JCH_to_HSB_simd(
const dt_aligned_pixel_simd_t JCH)
1402 const float brightness = JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f);
1403 return (dt_aligned_pixel_simd_t){ JCH[2], (brightness > 0.f) ? JCH[1] / brightness : 0.f, brightness, 0.f };
1410 JCH[1] = HSB[1] * HSB[2];
1411 JCH[0] = HSB[2] / (powf(JCH[1], 1.33654221029386f) + 1.f);
1414static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1415dt_UCS_HSB_to_JCH_simd(
const dt_aligned_pixel_simd_t HSB)
1417 const float chroma = HSB[1] * HSB[2];
1418 return (dt_aligned_pixel_simd_t){
1419 HSB[2] / (powf(chroma, 1.33654221029386f) + 1.f),
1429 HCB[2] = JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f);
1434static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1435dt_UCS_JCH_to_HCB_simd(
const dt_aligned_pixel_simd_t JCH)
1437 return (dt_aligned_pixel_simd_t){
1440 JCH[0] * (powf(JCH[1], 1.33654221029386f) + 1.f),
1450 JCH[0] = HCB[2] / (powf(HCB[1], 1.33654221029386f) + 1.f);
1453static inline __attribute__((always_inline)) dt_aligned_pixel_simd_t
1454dt_UCS_HCB_to_JCH_simd(
const dt_aligned_pixel_simd_t HCB)
1456 return (dt_aligned_pixel_simd_t){
1457 HCB[2] / (powf(HCB[1], 1.33654221029386f) + 1.f),
1467 HPW[2] = sqrtf(HSB[1] * HSB[1] + HSB[2] * HSB[2]);
1468 HPW[1] = (HPW[2] > 0.f) ? HSB[1] / HPW[2] : 0.f;
1476 HSB[1] = HPW[1] * HPW[2];
1477 HSB[2] = fmaxf(sqrtf(HPW[2] * HPW[2] - HSB[1] * HSB[1]), 0.f);
static float dt_camera_rgb_luminance(const float4 rgb)
Definition color_conversion.h:166
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 gradingRGB_to_LMS(const float4 RGB)
Definition colorspace.h:509
static void xyY_to_dt_UCS_UV(const float4 xyY, float UV_star_prime[2])
Definition colorspace.h:802
static float4 gamut_check_Yrg(float4 Ych)
Definition colorspace.h:748
static float4 LMS_to_XYZ(const float4 LMS)
Definition colorspace.h:491
static float4 Yrg_to_Ych(const float4 Yrg)
Definition colorspace.h:574
static float4 Ych_to_Yrg(const float4 Ych)
Definition colorspace.h:589
static float4 LMS_to_gradingRGB(const float4 LMS)
Definition colorspace.h:519
static float4 dt_UCS_JCH_to_HSB(const float4 JCH)
Definition colorspace.h:891
static float dt_UCS_L_star_to_Y(const float L_star)
Definition colorspace.h:796
static float4 dt_UCS_JCH_to_xyY(const float4 JCH, const float L_white)
Definition colorspace.h:849
static float4 Yrg_to_LMS(const float4 Yrg)
Definition colorspace.h:550
static float4 LMS_to_Yrg(const float4 LMS)
Definition colorspace.h:534
static float Y_to_dt_UCS_L_star(const float Y)
Definition colorspace.h:789
static float4 xyY_to_dt_UCS_JCH(const float4 xyY, const float L_white)
Definition colorspace.h:823
static float4 dt_XYZ_to_xyY(const float4 XYZ)
Definition colorspace.h:635
static float4 XYZ_to_LMS(const float4 XYZ)
Definition colorspace.h:480
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:701
const float fz
Definition colorspaces_inline_conversions.h:101
const float i
Definition colorspaces_inline_conversions.h:440
static dt_aligned_pixel_t xyY
Definition colorspaces_inline_conversions.h:110
static dt_aligned_pixel_t HSV
Definition colorspaces_inline_conversions.h:532
dt_prophotorgb_to_XYZ(rgb, XYZ)
dt_sRGB_to_linear_sRGB(sRGB, rgb)
static dt_aligned_pixel_t rgb
Definition colorspaces_inline_conversions.h:344
dt_XYZ_to_Rec709_D50(XYZ, rgb)
static float cbrt_5f(float f)
Definition colorspaces_inline_conversions.h:50
const float L
Definition colorspaces_inline_conversions.h:493
_dt_Hue_2_RGB(RGB, HSL[0], 2.0f *C, m)
const float V
Definition colorspaces_inline_conversions.h:537
const float g
Definition colorspaces_inline_conversions.h:674
const float fx
Definition colorspaces_inline_conversions.h:100
dt_apply_transposed_color_matrix(XYZ, xyz_to_srgb_matrix_transposed, sRGB)
const dt_aligned_pixel_t f
Definition colorspaces_inline_conversions.h:102
static dt_aligned_pixel_t LCH
Definition colorspaces_inline_conversions.h:594
static float cbrta_halleyf(const float a, const float R)
Definition colorspaces_inline_conversions.h:58
static dt_aligned_pixel_t HCV
Definition colorspaces_inline_conversions.h:568
dt_XYZ_to_sRGB(XYZ, result)
static dt_aligned_pixel_t uvY
Definition colorspaces_inline_conversions.h:143
static const dt_colormatrix_t sRGB_to_xyz_transposed
Definition colorspaces_inline_conversions.h:374
const float D50[2] DT_ALIGNED_PIXEL
Definition colorspaces_inline_conversions.h:179
static const dt_colormatrix_t A_transposed
Definition colorspaces_inline_conversions.h:694
dt_XYZ_to_prophotorgb(XYZ, rgb)
static const dt_aligned_pixel_t d50
Definition colorspaces_inline_conversions.h:74
static dt_aligned_pixel_t HSL
Definition colorspaces_inline_conversions.h:488
static float cbf(const float x)
Definition colorspaces_inline_conversions.h:157
const float threshold
Definition colorspaces_inline_conversions.h:176
const float p
Definition colorspaces_inline_conversions.h:679
const float d0
Definition colorspaces_inline_conversions.h:681
const float d
Definition colorspaces_inline_conversions.h:680
static const float const float const float min
Definition colorspaces_inline_conversions.h:438
const float n_inv
Definition colorspaces_inline_conversions.h:798
const dt_colormatrix_t MI
Definition colorspaces_inline_conversions.h:802
static dt_aligned_pixel_t XYZ
Definition colorspaces_inline_conversions.h:98
static float lab_f(const float x)
Definition colorspaces_inline_conversions.h:66
const float inc
Definition colorspaces_inline_conversions.h:444
const float m
Definition colorspaces_inline_conversions.h:525
static dt_aligned_pixel_t sRGB
Definition colorspaces_inline_conversions.h:260
static float lab_f_inv(const float x)
Definition colorspaces_inline_conversions.h:88
dt_aligned_pixel_t IzAzBz
Definition colorspaces_inline_conversions.h:815
const float max
Definition colorspaces_inline_conversions.h:490
static dt_aligned_pixel_t XYZ_D65
Definition colorspaces_inline_conversions.h:623
static dt_aligned_pixel_t Lab
Definition colorspaces_inline_conversions.h:78
static dt_aligned_pixel_t XYZ_D50
Definition colorspaces_inline_conversions.h:315
const float p_inv
Definition colorspaces_inline_conversions.h:799
const dt_colormatrix_t AI
Definition colorspaces_inline_conversions.h:807
const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:42
const float c3
Definition colorspaces_inline_conversions.h:677
const float n
Definition colorspaces_inline_conversions.h:678
const size_t i_idx
Definition colorspaces_inline_conversions.h:446
dt_Rec709_to_XYZ_D50(rgb, XYZ)
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:676
static const float const float C
Definition colorspaces_inline_conversions.h:437
static const dt_colormatrix_t xyz_to_srgb_transposed
Definition colorspaces_inline_conversions.h:391
const float top
Definition colorspaces_inline_conversions.h:443
static const int row
Definition colorspaces_inline_conversions.h:35
for(size_t c=0;c< 3;c++) sRGB[c]
static dt_aligned_pixel_t JzAzBz
Definition colorspaces_inline_conversions.h:672
const float c1
Definition colorspaces_inline_conversions.h:675
static dt_aligned_pixel_t Luv
Definition colorspaces_inline_conversions.h:165
static float _dt_RGB_2_Hue(const dt_aligned_pixel_t RGB, const float max, const float delta)
Definition colorspaces_inline_conversions.h:420
static dt_aligned_pixel_t RGB
Definition colorspaces_inline_conversions.h:327
static dt_aligned_pixel_t linearRGB
Definition colorspaces_inline_conversions.h:397
const dt_colormatrix_t matrix
Definition colorspaces_inline_conversions.h:40
const float fc
Definition colorspaces_inline_conversions.h:442
static dt_aligned_pixel_t Lch
Definition colorspaces_inline_conversions.h:188
const float delta
Definition colorspaces_inline_conversions.h:491
float S
Definition colorspaces_inline_conversions.h:494
const float dec
Definition colorspaces_inline_conversions.h:445
static const dt_colormatrix_t M
Definition colorspaces_inline_conversions.h:682
else var_H
Definition colorspaces_inline_conversions.h:600
static const float H
Definition colorspaces_inline_conversions.h:437
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
#define __OMP_SIMD__(...)
Definition darktable.h:262
#define for_each_channel(_var,...)
Definition darktable.h:662
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Enable aggressive floating-point arithmetic optimizations, in denormals handling. Set through user pr...
Definition darktable.h:524
#define __OMP_DECLARE_SIMD__(...)
Definition darktable.h:263
#define for_four_channels(_var,...)
Definition darktable.h:664
static const float x
Definition iop_profile.h:235
#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
c
Definition derive_filmic_v6_gamut_mapping.py:35
lms
Definition derive_filmic_v6_gamut_mapping.py:51
Yrg
Definition derive_filmic_v6_gamut_mapping.py:38
Y
Definition derive_filmic_v6_gamut_mapping.py:35
float dt_aligned_pixel_t[4]
Definition noiseprofile.c:28
const float r
Definition src/develop/noise_generator.h:101