37#define MIN_FLOAT exp2f(-16.0f)
71#pragma omp declare simd
74static float linear_contrast(
const float pixel,
const float fulcrum,
const float contrast)
77 return fmaxf((pixel - fulcrum) * contrast + fulcrum,
MIN_FLOAT);
82#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
86 float *
const restrict luminance,
87 const size_t k,
const size_t ch,
88 const float exposure_boost,
89 const float fulcrum,
const float contrast_boost)
96#pragma omp simd reduction(+:lum) aligned(image:64)
98 for(
int c = 0; c < 3; ++c)
101 luminance[k / ch] =
linear_contrast(exposure_boost * lum / 3.0f, fulcrum, contrast_boost);
106#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
110 float *
const restrict luminance,
111 const size_t k,
const size_t ch,
112 const float exposure_boost,
113 const float fulcrum,
const float contrast_boost)
117 const float lum = exposure_boost * fmaxf(fmaxf(image[k], image[k + 1]), image[k + 2]);
123#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
127 float *
const restrict luminance,
128 const size_t k,
const size_t ch,
129 const float exposure_boost,
130 const float fulcrum,
const float contrast_boost)
134 const float max_rgb = fmaxf(fmaxf(image[k], image[k + 1]), image[k + 2]);
135 const float min_rgb = fminf(fminf(image[k], image[k + 1]), image[k + 2]);
136 luminance[k / ch] =
linear_contrast(exposure_boost * (max_rgb + min_rgb) / 2.0f, fulcrum, contrast_boost);
140#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
144 float *
const restrict luminance,
145 const size_t k,
const size_t ch,
146 const float exposure_boost,
147 const float fulcrum,
const float contrast_boost)
154 #pragma omp simd reduction(+:lum) aligned(image:64)
156 for(
int c = 0; c < 3; ++c)
157 lum += fabsf(image[k + c]);
159 luminance[k / ch] =
linear_contrast(exposure_boost * lum, fulcrum, contrast_boost);
164#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
168 float *
const restrict luminance,
169 const size_t k,
const size_t ch,
170 const float exposure_boost,
171 const float fulcrum,
const float contrast_boost)
178#pragma omp simd aligned(image:64) reduction(+: result)
180 for(
int c = 0; c < 3; ++c) result += image[k + c] * image[k + c];
182 luminance[k / ch] =
linear_contrast(exposure_boost * sqrtf(result), fulcrum, contrast_boost);
187#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
191 float *
const restrict luminance,
192 const size_t k,
const size_t ch,
193 const float exposure_boost,
194 const float fulcrum,
const float contrast_boost)
198 float numerator = 0.0f;
199 float denominator = 0.0f;
202#pragma omp simd aligned(image:64) reduction(+:numerator, denominator)
204 for(
int c = 0; c < 3; ++c)
206 const float value = fabsf(image[k + c]);
207 const float RGB_square = value * value;
208 const float RGB_cubic = RGB_square * value;
209 numerator += RGB_cubic;
210 denominator += RGB_square;
213 luminance[k / ch] =
linear_contrast(exposure_boost * numerator / denominator, fulcrum, contrast_boost);
217#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
221 float *
const restrict luminance,
222 const size_t k,
const size_t ch,
223 const float exposure_boost,
224 const float fulcrum,
const float contrast_boost)
231#pragma omp simd aligned(image:64) reduction(*:lum)
233 for(
int c = 0; c < 3; ++c)
235 lum *= fabsf(image[k + c]);
238 luminance[k / ch] =
linear_contrast(exposure_boost * powf(lum, 1.0f / 3.0f), fulcrum, contrast_boost);
248 _Pragma ("omp parallel for simd default(none) schedule(static) \
249 dt_omp_firstprivate(num_elem, ch, in, out, exposure_boost, fulcrum, contrast_boost)\
250 aligned(in, out:64)" ) \
251 for(size_t k = 0; k < num_elem; k += ch) \
253 fn(in, out, k, ch, exposure_boost, fulcrum, contrast_boost); \
260 for(size_t k = 0; k < num_elem; k += ch) \
262 fn(in, out, k, ch, exposure_boost, fulcrum, contrast_boost); \
270static inline void luminance_mask(
const float *
const restrict in,
float *
const restrict out,
271 const size_t width,
const size_t height,
const size_t ch,
273 const float exposure_boost,
274 const float fulcrum,
const float contrast_boost)
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
#define __DT_CLONE_TARGETS__
Definition darktable.h:249
static __DT_CLONE_TARGETS__ float linear_contrast(const float pixel, const float fulcrum, const float contrast)
Definition luminance_mask.h:74
dt_iop_luminance_mask_method_t
Definition luminance_mask.h:41
@ DT_TONEEQ_NORM_2
Definition luminance_mask.h:46
@ DT_TONEEQ_MEAN
Definition luminance_mask.h:42
@ DT_TONEEQ_LIGHTNESS
Definition luminance_mask.h:43
@ DT_TONEEQ_LAST
Definition luminance_mask.h:49
@ DT_TONEEQ_VALUE
Definition luminance_mask.h:44
@ DT_TONEEQ_NORM_1
Definition luminance_mask.h:45
@ DT_TONEEQ_GEOMEAN
Definition luminance_mask.h:48
@ DT_TONEEQ_NORM_POWER
Definition luminance_mask.h:47
static __DT_CLONE_TARGETS__ void pixel_rgb_geomean(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:220
static __DT_CLONE_TARGETS__ void pixel_rgb_lightness(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:126
static __DT_CLONE_TARGETS__ void pixel_rgb_norm_2(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:167
static __DT_CLONE_TARGETS__ void pixel_rgb_norm_1(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:143
static __DT_CLONE_TARGETS__ void luminance_mask(const float *const restrict in, float *const restrict out, const size_t width, const size_t height, const size_t ch, const dt_iop_luminance_mask_method_t method, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:270
#define MIN_FLOAT
Definition luminance_mask.h:37
static __DT_CLONE_TARGETS__ void pixel_rgb_mean(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:85
#define LOOP(fn)
Definition luminance_mask.h:258
static __DT_CLONE_TARGETS__ void pixel_rgb_norm_power(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:190
static __DT_CLONE_TARGETS__ void pixel_rgb_value(const float *const restrict image, float *const restrict luminance, const size_t k, const size_t ch, const float exposure_boost, const float fulcrum, const float contrast_boost)
Definition luminance_mask.h:109