41 { -0.7502f, 1.7135f, 0.0367f, 0.f },
42 { 0.0389f, -0.0685f, 1.0296f, 0.f } };
45 { 0.4323f, 0.5184f, 0.0493f, 0.f },
46 { -0.0085f, 0.0400f, 0.9685f, 0.f } };
49#pragma omp declare simd aligned(XYZ, LMS:16)
58#pragma omp declare simd aligned(XYZ, LMS:16)
71 { -0.250268f, 1.204414f, 0.045854f, 0.f },
72 { -0.002079f, 0.048952f, 0.953127f, 0.f } };
75 { 0.38752f , 0.621447f, -0.008974f, 0.f },
76 { -0.015841f, -0.034123f, 1.049964f, 0.f } };
79#pragma omp declare simd aligned(XYZ, LMS:16)
88#pragma omp declare simd aligned(XYZ, LMS:16)
98#pragma omp declare simd aligned(XYZ, LMS:16) uniform(kind)
134#pragma omp declare simd aligned(XYZ, LMS:16) uniform(kind)
169#pragma omp declare simd aligned(RGB, LMS:16) uniform(kind)
174 dt_aligned_pixel_t XYZ = { 0.f };
182 float max_RGB = fmaxf(fmaxf(RGB[0], RGB[1]), RGB[2]);
183 for(
int c = 0; c < 3; c++) RGB[c] = fmaxf(RGB[c] / max_RGB, 0.f);
191#pragma omp declare simd uniform(origin_illuminant) \
192 aligned(lms_in, lms_out, origin_illuminant:16)
195 const dt_aligned_pixel_t origin_illuminant,
196 const float p,
const int full,
197 dt_aligned_pixel_t lms_out)
205 const dt_aligned_pixel_t D65 = { 0.941238f, 1.040633f, 1.088932f, 0.f };
207 dt_aligned_pixel_t temp = { lms_in[0] / origin_illuminant[0],
208 lms_in[1] / origin_illuminant[1],
209 lms_in[2] / origin_illuminant[2],
213 if(full) temp[2] = (temp[2] > 0.f) ? powf(temp[2], p) : temp[2];
215 lms_out[0] = D65[0] * temp[0];
216 lms_out[1] = D65[1] * temp[1];
217 lms_out[2] = D65[2] * temp[2];
222#pragma omp declare simd uniform(origin_illuminant) \
223 aligned(lms_in, lms_out, origin_illuminant:16)
226 const dt_aligned_pixel_t origin_illuminant,
227 const float p,
const int full,
228 dt_aligned_pixel_t lms_out)
236 const dt_aligned_pixel_t D50 = { 0.996078f, 1.020646f, 0.818155f, 0.f };
238 dt_aligned_pixel_t temp = { lms_in[0] / origin_illuminant[0],
239 lms_in[1] / origin_illuminant[1],
240 lms_in[2] / origin_illuminant[2],
244 if(full) temp[2] = (temp[2] > 0.f) ? powf(temp[2], p) : temp[2];
246 lms_out[0] = D50[0] * temp[0];
247 lms_out[1] = D50[1] * temp[1];
248 lms_out[2] = D50[2] * temp[2];
255#pragma omp declare simd uniform(origin_illuminant) \
256 aligned(lms_in, lms_out, origin_illuminant:16)
259 const dt_aligned_pixel_t origin_illuminant,
260 const float D,
const int full, dt_aligned_pixel_t lms_out)
267 const dt_aligned_pixel_t D65 = { 0.97553267f, 1.01647859f, 1.0848344f, 0.f };
271 lms_out[0] = lms_in[0] * D65[0] / origin_illuminant[0];
272 lms_out[1] = lms_in[1] * D65[1] / origin_illuminant[1];
273 lms_out[2] = lms_in[2] * D65[2] / origin_illuminant[2];
277 lms_out[0] = lms_in[0] * (D * D65[0] / origin_illuminant[0] + 1.f - D);
278 lms_out[1] = lms_in[1] * (D * D65[1] / origin_illuminant[1] + 1.f - D);
279 lms_out[2] = lms_in[2] * (D * D65[2] / origin_illuminant[2] + 1.f - D);
285#pragma omp declare simd uniform(origin_illuminant) \
286 aligned(lms_in, lms_out, origin_illuminant:16)
289 const dt_aligned_pixel_t origin_illuminant,
290 const float D,
const int full,
291 dt_aligned_pixel_t lms_out)
298 const dt_aligned_pixel_t D50 = { 0.994535f, 1.000997f, 0.833036f, 0.f };
302 lms_out[0] = lms_in[0] * D50[0] / origin_illuminant[0];
303 lms_out[1] = lms_in[1] * D50[1] / origin_illuminant[1];
304 lms_out[2] = lms_in[2] * D50[2] / origin_illuminant[2];
308 lms_out[0] = lms_in[0] * (D * D50[0] / origin_illuminant[0] + 1.f - D);
309 lms_out[1] = lms_in[1] * (D * D50[1] / origin_illuminant[1] + 1.f - D);
310 lms_out[2] = lms_in[2] * (D * D50[2] / origin_illuminant[2] + 1.f - D);
317#pragma omp declare simd uniform(origin_illuminant) \
318 aligned(lms_in, lms_out, origin_illuminant:16)
321 const dt_aligned_pixel_t origin_illuminant,
322 dt_aligned_pixel_t lms_out)
328 const dt_aligned_pixel_t D65 = { 0.9504285453771807f, 1.0f, 1.0889003707981277f, 0.f };
330 lms_out[0] = lms_in[0] * D65[0] / origin_illuminant[0];
331 lms_out[1] = lms_in[1] * D65[1] / origin_illuminant[1];
332 lms_out[2] = lms_in[2] * D65[2] / origin_illuminant[2];
336#pragma omp declare simd uniform(origin_illuminant) \
337 aligned(lms_in, lms_out, origin_illuminant:16)
340 const dt_aligned_pixel_t origin_illuminant,
341 dt_aligned_pixel_t lms_out)
347 const dt_aligned_pixel_t D50 = { 0.9642119944211994f, 1.0f, 0.8251882845188288f, 0.f };
349 lms_out[0] = lms_in[0] * D50[0] / origin_illuminant[0];
350 lms_out[1] = lms_in[1] * D50[1] / origin_illuminant[1];
351 lms_out[2] = lms_in[2] * D50[2] / origin_illuminant[2];
357 = { { 9.89466254e-01f, -4.00304626e-02f, 4.40530317e-02f, 0.f },
358 { -5.40518733e-03f, 1.00666069e+00f, -1.75551955e-03f, 0.f },
359 { -4.03920992e-04f, 1.50768030e-02f, 1.30210211e+00f, 0.f } };
362 = { { 0.95547342f, -0.02309845f, 0.06325924f, 0.f },
363 { -0.02836971f, 1.00999540f, 0.02104144f, 0.f },
364 { 0.01231401f, -0.02050765f, 1.33036593f, 0.f } };
367 = { { 1.01085433e+00f, 4.07086103e-02f, -3.41445825e-02f, 0.f },
368 { 5.42814201e-03f, 9.93581926e-01f, 1.15592039e-03f, 0.f },
369 { 2.50722468e-04f, -1.14918759e-02f, 7.67964947e-01f, 0.f } };
372 = { { 1.04792979f, 0.02294687f, -0.05019227f, 0.f },
373 { 0.02962781f, 0.99043443f, -0.0170738f, 0.f },
374 { -0.00924304f, 0.01505519f, 0.75187428f, 0.f } };
377#pragma omp declare simd aligned(XYZ_in, XYZ_out:16)
379static inline void XYZ_D50_to_D65(
const dt_aligned_pixel_t XYZ_in, dt_aligned_pixel_t XYZ_out)
385#pragma omp declare simd aligned(XYZ_in, XYZ_out:16)
387static inline void XYZ_D65_to_D50(
const dt_aligned_pixel_t XYZ_in, dt_aligned_pixel_t XYZ_out)
395 const dt_aligned_pixel_t illuminant,
const dt_adaptation_t adaptation,
const float p)
399 dt_aligned_pixel_t temp_one;
400 dt_aligned_pixel_t temp_two;
403 const float Y = in[1];
478 D50[0] = 0.9642119944211994f;
480 D50[2] = 0.8251882845188288f;
#define TRUE
Definition ashift_lsd.c:151
#define FALSE
Definition ashift_lsd.c:147
static void XYZ_D50_to_D65(const dt_aligned_pixel_t XYZ_in, dt_aligned_pixel_t XYZ_out)
Definition chromatic_adaptation.h:379
static void CAT16_adapt_D50(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, const float D, const int full, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:288
static void CAT16_adapt_D65(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, const float D, const int full, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:258
const dt_colormatrix_t XYZ_D50_to_D65_Bradford
Definition chromatic_adaptation.h:362
const dt_colormatrix_t CAT16_LMS_to_XYZ
Definition chromatic_adaptation.h:74
static void XYZ_D65_to_D50(const dt_aligned_pixel_t XYZ_in, dt_aligned_pixel_t XYZ_out)
Definition chromatic_adaptation.h:387
const dt_colormatrix_t XYZ_D65_to_D50_CAT16
Definition chromatic_adaptation.h:367
const dt_colormatrix_t XYZ_D50_to_D65_CAT16
Definition chromatic_adaptation.h:357
const dt_colormatrix_t XYZ_to_CAT16_LMS
Definition chromatic_adaptation.h:70
static void convert_XYZ_to_CAT16_LMS(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t LMS)
Definition chromatic_adaptation.h:81
static void convert_D50_to_LMS(const dt_adaptation_t adaptation, dt_aligned_pixel_t D50)
Definition chromatic_adaptation.h:455
static void convert_any_LMS_to_XYZ(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t XYZ, const dt_adaptation_t kind)
Definition chromatic_adaptation.h:100
dt_adaptation_t
Definition chromatic_adaptation.h:25
@ DT_ADAPTATION_LAST
Definition chromatic_adaptation.h:31
@ DT_ADAPTATION_FULL_BRADFORD
Definition chromatic_adaptation.h:28
@ DT_ADAPTATION_XYZ
Definition chromatic_adaptation.h:29
@ DT_ADAPTATION_CAT16
Definition chromatic_adaptation.h:27
@ DT_ADAPTATION_RGB
Definition chromatic_adaptation.h:30
@ DT_ADAPTATION_LINEAR_BRADFORD
Definition chromatic_adaptation.h:26
static void bradford_adapt_D50(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, const float p, const int full, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:225
static void convert_any_XYZ_to_LMS(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t LMS, dt_adaptation_t kind)
Definition chromatic_adaptation.h:136
static void bradford_adapt_D65(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, const float p, const int full, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:194
static void convert_CAT16_LMS_to_XYZ(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t XYZ)
Definition chromatic_adaptation.h:90
static void chroma_adapt_pixel(const dt_aligned_pixel_t in, dt_aligned_pixel_t out, const dt_aligned_pixel_t illuminant, const dt_adaptation_t adaptation, const float p)
Definition chromatic_adaptation.h:394
static void convert_any_LMS_to_RGB(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t RGB, dt_adaptation_t kind)
Definition chromatic_adaptation.h:171
static void convert_bradford_LMS_to_XYZ(const dt_aligned_pixel_t LMS, dt_aligned_pixel_t XYZ)
Definition chromatic_adaptation.h:60
static void XYZ_adapt_D65(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:320
const dt_colormatrix_t XYZ_to_Bradford_LMS
Definition chromatic_adaptation.h:40
const dt_colormatrix_t Bradford_LMS_to_XYZ
Definition chromatic_adaptation.h:44
static void XYZ_adapt_D50(const dt_aligned_pixel_t lms_in, const dt_aligned_pixel_t origin_illuminant, dt_aligned_pixel_t lms_out)
Definition chromatic_adaptation.h:339
static void convert_XYZ_to_bradford_LMS(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t LMS)
Definition chromatic_adaptation.h:51
const dt_colormatrix_t XYZ_D65_to_D50_Bradford
Definition chromatic_adaptation.h:372
static void dt_XYZ_to_Rec709_D65(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t sRGB)
Definition colorspaces_inline_conversions.h:417
#define DT_PIXEL_SIMD_CHANNELS
Definition darktable.h:387
static void upscale_vector(dt_aligned_pixel_t vector, const float scaling)
Definition math.h:244
static void downscale_vector(dt_aligned_pixel_t vector, const float scaling)
Definition math.h:233
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