40#define MIN_FLOAT exp2f(-16.0f)
74#pragma omp declare simd
76static float linear_contrast(
const float pixel,
const float fulcrum,
const float contrast)
79 return fmaxf((pixel - fulcrum) * contrast + fulcrum,
MIN_FLOAT);
84#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
87 float *
const restrict luminance,
88 const size_t k,
const size_t ch,
89 const float exposure_boost,
90 const float fulcrum,
const float contrast_boost)
97#pragma omp simd reduction(+:lum) aligned(image:64)
99 for(
int c = 0;
c < 3; ++
c)
102 luminance[k / ch] =
linear_contrast(exposure_boost * lum / 3.0f, fulcrum, contrast_boost);
107#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)
126 float *
const restrict luminance,
127 const size_t k,
const size_t ch,
128 const float exposure_boost,
129 const float fulcrum,
const float contrast_boost)
133 const float max_rgb = fmaxf(fmaxf(image[k], image[k + 1]), image[k + 2]);
134 const float min_rgb = fminf(fminf(image[k], image[k + 1]), image[k + 2]);
135 luminance[k / ch] =
linear_contrast(exposure_boost * (max_rgb + min_rgb) / 2.0f, fulcrum, contrast_boost);
139#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
142 float *
const restrict luminance,
143 const size_t k,
const size_t ch,
144 const float exposure_boost,
145 const float fulcrum,
const float contrast_boost)
152 #pragma omp simd reduction(+:lum) aligned(image:64)
154 for(
int c = 0;
c < 3; ++
c)
155 lum += fabsf(image[k +
c]);
157 luminance[k / ch] =
linear_contrast(exposure_boost * lum, fulcrum, contrast_boost);
162#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
165 float *
const restrict luminance,
166 const size_t k,
const size_t ch,
167 const float exposure_boost,
168 const float fulcrum,
const float contrast_boost)
175#pragma omp simd aligned(image:64) reduction(+: result)
177 for(
int c = 0;
c < 3; ++
c) result += image[k +
c] * image[k +
c];
179 luminance[k / ch] =
linear_contrast(exposure_boost * sqrtf(result), fulcrum, contrast_boost);
184#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
187 float *
const restrict luminance,
188 const size_t k,
const size_t ch,
189 const float exposure_boost,
190 const float fulcrum,
const float contrast_boost)
194 float numerator = 0.0f;
195 float denominator = 0.0f;
198#pragma omp simd aligned(image:64) reduction(+:numerator, denominator)
200 for(
int c = 0;
c < 3; ++
c)
202 const float value = fabsf(image[k +
c]);
204 const float RGB_cubic = RGB_square *
value;
205 numerator += RGB_cubic;
206 denominator += RGB_square;
209 luminance[k / ch] =
linear_contrast(exposure_boost * numerator / denominator, fulcrum, contrast_boost);
213#pragma omp declare simd aligned(image, luminance:64) uniform(image, luminance)
216 float *
const restrict luminance,
217 const size_t k,
const size_t ch,
218 const float exposure_boost,
219 const float fulcrum,
const float contrast_boost)
226#pragma omp simd aligned(image:64) reduction(*:lum)
228 for(
int c = 0;
c < 3; ++
c)
230 lum *= fabsf(image[k +
c]);
233 luminance[k / ch] =
linear_contrast(exposure_boost * powf(lum, 1.0f / 3.0f), fulcrum, contrast_boost);
243 _Pragma ("omp parallel for simd default(none) schedule(static) \
244 dt_omp_firstprivate(num_elem, ch, in, out, exposure_boost, fulcrum, contrast_boost)\
245 aligned(in, out:64)" ) \
246 for(size_t k = 0; k < num_elem; k += ch) \
248 fn(in, out, k, ch, exposure_boost, fulcrum, contrast_boost); \
255 for(size_t k = 0; k < num_elem; k += ch) \
257 fn(in, out, k, ch, exposure_boost, fulcrum, contrast_boost); \
266 const size_t width,
const size_t height,
const size_t ch,
268 const float exposure_boost,
269 const float fulcrum,
const float contrast_boost)
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
const float c
Definition colorspaces_inline_conversions.h:1365
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
#define __DT_CLONE_TARGETS__
Definition darktable.h:291
static const dt_aligned_pixel_simd_t value
Definition darktable.h:501
static 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:215
dt_iop_luminance_mask_method_t
Definition luminance_mask.h:44
@ DT_TONEEQ_NORM_2
Definition luminance_mask.h:49
@ DT_TONEEQ_MEAN
Definition luminance_mask.h:45
@ DT_TONEEQ_LIGHTNESS
Definition luminance_mask.h:46
@ DT_TONEEQ_LAST
Definition luminance_mask.h:52
@ DT_TONEEQ_VALUE
Definition luminance_mask.h:47
@ DT_TONEEQ_NORM_1
Definition luminance_mask.h:48
@ DT_TONEEQ_GEOMEAN
Definition luminance_mask.h:51
@ DT_TONEEQ_NORM_POWER
Definition luminance_mask.h:50
static 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:86
static 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:141
static 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:125
static float linear_contrast(const float pixel, const float fulcrum, const float contrast)
Definition luminance_mask.h:76
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:265
#define MIN_FLOAT
Definition luminance_mask.h:40
static 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
#define LOOP(fn)
Definition luminance_mask.h:253
static 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:164
static 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:186