94 if(border <= 0)
return;
95 const int max_col =
width - border - 1;
99 float *
const rowptr = mask + (size_t)(
row *
width);
100 for(
int i = 0;
i < border;
i++)
102 rowptr[
i] = rowptr[border];
103 rowptr[
width -
i - 1] = rowptr[max_col];
106 const float *
const top_row = mask + (size_t)(border *
width);
107 const float *
const bot_row = mask + (size_t)(
height - border - 1) *
width;
109 for(
int col = 0; col <
width; col++)
111 const int c =
MIN(max_col,
MAX(col, border));
112 const float top = top_row[c];
113 const float bot = bot_row[c];
114 for(
int i = 0;
i < border;
i++)
125 const float temp = -2.0f * sqf(
sigma);
126 const float range = sqf(3.0f * 0.84f);
128 for(
int k = -2;
k <= 2;
k++)
130 for(
int j = -2; j <= 2; j++)
132 if((sqf(
k) + sqf(j)) <= range)
134 kernel[
k + 2][j + 2] = expf((sqf(
k) + sqf(j)) / temp);
141 for(
int i = 0;
i < 5;
i++)
142 for(
int j = 0; j < 5; j++)
152#define FAST_BLUR_5 ( \
153 blurmat[0] * ((src[i - w2 - 1] + src[i - w2 + 1]) + (src[i - w1 - 2] + src[i - w1 + 2]) + (src[i + w1 - 2] + src[i + w1 + 2]) + (src[i + w2 - 1] + src[i + w2 + 1])) + \
154 blurmat[1] * (src[i - w2] + src[i - 2] + src[i + 2] + src[i + w2]) + \
155 blurmat[2] * (src[i - w1 - 1] + src[i - w1 + 1] + src[i + w1 - 1] + src[i + w1 + 1]) + \
156 blurmat[3] * (src[i - w1] + src[i - 1] + src[i + 1] + src[i + w1]) + \
157 blurmat[4] * src[i] )
162 const float temp = -2.0f * sqf(
sigma);
163 const float range = sqf(3.0f * 1.5f);
165 for(
int k = -4;
k <= 4;
k++)
167 for(
int j = -4; j <= 4; j++)
169 if((sqf(
k) + sqf(j)) <= range)
171 kernel[
k + 4][j + 4] = expf((sqf(
k) + sqf(j)) / temp);
178 for(
int i = 0;
i < 9;
i++)
179 for(
int j = 0; j < 9; j++)
199#define FAST_BLUR_9 ( \
200 blurmat[12] * (src[i - w4 - 2] + src[i - w4 + 2] + src[i - w2 - 4] + src[i - w2 + 4] + src[i + w2 - 4] + src[i + w2 + 4] + src[i + w4 - 2] + src[i + w4 + 2]) + \
201 blurmat[11] * (src[i - w4 - 1] + src[i - w4 + 1] + src[i - w1 - 4] + src[i - w1 + 4] + src[i + w1 - 4] + src[i + w1 + 4] + src[i + w4 - 1] + src[i + w4 + 1]) + \
202 blurmat[10] * (src[i - w4] + src[i - 4] + src[i + 4] + src[i + w4]) + \
203 blurmat[9] * (src[i - w3 - 3] + src[i - w3 + 3] + src[i + w3 - 3] + src[i + w3 + 3]) + \
204 blurmat[8] * (src[i - w3 - 2] + src[i - w3 + 2] + src[i - w2 - 3] + src[i - w2 + 3] + src[i + w2 - 3] + src[i + w2 + 3] + src[i + w3 - 2] + src[i + w3 + 2]) + \
205 blurmat[7] * (src[i - w3 - 1] + src[i - w3 + 1] + src[i - w1 - 3] + src[i - w1 + 3] + src[i + w1 - 3] + src[i + w1 + 3] + src[i + w3 - 1] + src[i + w3 + 1]) + \
206 blurmat[6] * (src[i - w3] + src[i - 3] + src[i + 3] + src[i + w3]) + \
207 blurmat[5] * (src[i - w2 - 2] + src[i - w2 + 2] + src[i + w2 - 2] + src[i + w2 + 2]) + \
208 blurmat[4] * (src[i - w2 - 1] + src[i - w2 + 1] + src[i - w1 - 2] + src[i - w1 + 2] + src[i + w1 - 2] + src[i + w1 + 2] + src[i + w2 - 1] + src[i + w2 + 1]) + \
209 blurmat[3] * (src[i - w2] + src[i - 2] + src[i + 2] + src[i + w2]) + \
210 blurmat[2] * (src[i - w1 - 1] + src[i - w1 + 1] + src[i + w1 - 1] + src[i + w1 + 1]) + \
211 blurmat[1] * (src[i - w1] + src[i - 1] + src[i + 1] + src[i + w1]) + \
212 blurmat[0] * src[i] )
227 for(
int col = 4; col <
width - 4; col++)
229 const int i = row_off + col;
239 const float temp = -2.0f * sqf(
sigma);
240 const float range = sqf(3.0f * 2.0f);
242 for(
int k = -6;
k <= 6;
k++)
244 for(
int j = -6; j <= 6; j++)
246 if((sqf(
k) + sqf(j)) <= range)
248 kernel[
k + 6][j + 6] = expf((sqf(
k) + sqf(j)) / temp);
255 for(
int i = 0;
i < 13;
i++)
256 for(
int j = 0; j < 13; j++)
288 for(
int idx =0; idx < msize; idx++)
290 const float val = 0.333333333f * (fmaxf(src[4 * idx], 0.0f) / wb[0] + fmaxf(src[4 * idx + 1], 0.0f) / wb[1] + fmaxf(src[4 * idx + 2], 0.0f) / wb[2]);
291 tmp[idx] = sqrtf(val);
294 const float scale = 1.0f / 16.0f;
298 for(
int col = 1, idx =
row *
width + col; col <
width - 1; col++, idx++)
301 const float gx = 47.0f * (tmp[idx-
width-1] - tmp[idx-
width+1])
302 + 162.0f * (tmp[idx-1] - tmp[idx+1])
303 + 47.0f * (tmp[idx+
width-1] - tmp[idx+
width+1]);
304 const float gy = 47.0f * (tmp[idx-
width-1] - tmp[idx+
width-1])
306 + 47.0f * (tmp[idx-
width+1] - tmp[idx+
width+1]);
307 const float gradient_magnitude = sqrtf(sqf(gx / 256.0f) + sqf(gy / 256.0f));
308 mask[idx] = scale * gradient_magnitude;
322 return 1.0f / (1.0f + dt_fast_expf(16.0f - (16.0f /
threshold) * val));
329 for(
int idx = 0; idx < msize; idx++)
332 tmp[idx] = detail ? blend : 1.0f - blend;
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static float kernel(const float *x, const float *y)
Definition colorchecker.c:469
const float i
Definition colorspaces_inline_conversions.h:440
const float threshold
Definition colorspaces_inline_conversions.h:176
const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:42
const float top
Definition colorspaces_inline_conversions.h:443
static const int row
Definition colorspaces_inline_conversions.h:35
#define __DT_CLONE_TARGETS__
Definition darktable.h:367
#define __OMP_FOR_SIMD__(...)
Definition darktable.h:260
#define __OMP_PARALLEL_FOR_SIMD__(...)
Definition darktable.h:259
__DT_CLONE_TARGETS__ void dt_masks_calc_rawdetail_mask(float *const restrict src, float *const restrict mask, float *const restrict tmp, const int width, const int height, const dt_aligned_pixel_t wb)
Definition detail.c:283
void dt_masks_blur_9x9_coeff(float *c, const float sigma)
Definition detail.c:159
void dt_masks_blur_9x9(float *const restrict src, float *const restrict out, const int width, const int height, const float sigma)
Definition detail.c:214
void _masks_blur_13x13_coeff(float *c, const float sigma)
Definition detail.c:236
__DT_CLONE_TARGETS__ void dt_masks_extend_border(float *const restrict mask, const int width, const int height, const int border)
Definition detail.c:92
void dt_masks_calc_detail_mask(float *const restrict src, float *const restrict out, float *const restrict tmp, const int width, const int height, const float threshold, const gboolean detail)
Definition detail.c:325
static float calcBlendFactor(float val, float threshold)
Definition detail.c:317
void _masks_blur_5x5_coeff(float *c, const float sigma)
Definition detail.c:122
#define FAST_BLUR_9
Definition detail.c:199
#define w2
Definition lmmse.c:60
#define w1
Definition lmmse.c:59
#define w4
Definition lmmse.c:62
#define w3
Definition lmmse.c:61
float *const restrict const size_t k
Definition luminance_mask.h:78
float dt_aligned_pixel_t[4]
Definition noiseprofile.c:28
const float sigma
Definition src/develop/noise_generator.h:71
#define MIN(a, b)
Definition thinplate.c:32
#define MAX(a, b)
Definition thinplate.c:29