35#define NORM_MIN 1.52587890625e-05f
40#define M_LN10 2.30258509299404568402
45#define M_PI 3.14159265358979323846
48#define M_PI_F 3.14159265358979324f
52#define DT_M_PI_F (3.14159265358979324f)
53#define DT_M_PI (3.14159265358979324)
55#define DT_M_LN2f (0.6931471805599453f)
60 #define DT_FMA(x, y, z) fmaf(x, y, z)
62 #define DT_FMA(x, y, z) ((x) * (y) + (z))
67#define PHI 1.61803398874989479F
72#define INVPHI 0.61803398874989479F
76#define CLAMPS(A, L, H) ((A) > (L) ? ((A) < (H) ? (A) : (H)) : (L))
81#define CLIP(x) (((x) >= 0) ? ((x) <= 1 ? (x) : 1) : 0)
82#define MM_CLIP_PS(X) (_mm_min_ps(_mm_max_ps((X), _mm_setzero_ps()), _mm_set1_ps(1.0)))
85#define LCLIP(x) ((x < 0) ? 0.0 : (x > 100.0) ? 100.0 : x)
89#define CLAMPF(a, mn, mx) ((a) >= (mn) ? ((a) <= (mx) ? (a) : (mx)) : (mn))
92#if defined(__x86_64__) || defined(__i386__)
93#define MMCLAMPPS(a, mn, mx) (_mm_min_ps((mx), _mm_max_ps((a), (mn))))
96static inline float clamp_range_f(
const float x,
const float low,
const float high)
98 return x > high ? high : (
x < low ? low :
x);
103static inline
float Kahan_sum(const
float m,
float *const __restrict__ c, const
float add)
105 const float t1 = add - (*c);
106 const float t2 =
m + t1;
124 union {
float f; uint32_t
i; } vx = {
x };
125 union { uint32_t
i;
float f; } mx = { (vx.i & 0x007FFFFF) | 0x3f000000 };
129 y *= 1.1920928955078125e-7f;
131 return y - 124.22551499f
132 - 1.498030302f * mx.f
133 - 1.72587999f / (0.3520887068f + mx.f);
146static inline
void mat3mulv(
float *const __restrict__ dest, const
float *const mat, const
float *const __restrict__
v)
148 for(
int k = 0;
k < 3;
k++)
151 for(
int i = 0;
i < 3;
i++)
152 x += mat[3 *
k +
i] *
v[
i];
161static inline
void mat3mul(
float *const __restrict__ dest, const
float *const __restrict__ m1, const
float *const __restrict__ m2)
163 for(
int k = 0;
k < 3;
k++)
165 for(
int i = 0;
i < 3;
i++)
168 for(
int j = 0; j < 3; j++)
169 x += m1[3 *
k + j] * m2[3 * j +
i];
178 o[0] =
p[0] *
m[0] +
p[1] *
m[1];
179 o[1] =
p[0] *
m[2] +
p[1] *
m[3];
190 for(size_t c = 0; c < 3; c++) acc += v_1[c] *
v_2[c];
197static inline
float sqf(const
float x)
206 return fmaxf(sqrtf(sqf(vector[0]) + sqf(vector[1]) + sqf(vector[2])),
NORM_MIN);
228static inline
float dt_log2f(const
float f)
233 return logf(
f) / logf(2.0f);
244static inline
float dt_fast_hypotf(const
float x, const
float y)
246 return sqrtf(
x *
x + y * y);
252static inline
float dt_fast_expf(const
float x)
256 const int i1 = 0x3f800000u;
258 const int i2 = 0x402DF854u;
261 const int k0 = i1 +
x * (i2 - i1);
271 const int i1 = 0x3f800000u;
273 const int i2 = 0x402DF854u;
276 union float_int u[4];
278 for(
size_t c = 0; c < 4; c++)
280 const int k0 = i1 + (int)(
x[c] * (i2 - i1));
281 u[c].k =
k0 > 0 ?
k0 : 0;
290 const int i1 = 0x3f800000;
291 const int i2 = 0x3f000000;
292 const int k0 = i1 + (int)(
x * (i2 - i1));
297 k.i =
k0 >= 0x800000 ?
k0 : 0;
306 const float i1 = (float)0x3f800000u;
307 const float i2 = (float)0x3f000000u;
308 const float k0 = i1 +
x * (i2 - i1);
313 k.i =
k0 >= (float)0x800000u ?
k0 : 0;
326 return (
float)(int)
x;
330 return -((float)(
int)-
x) + 1.f;
334#if defined(__x86_64__) || defined(__i386__)
static inline __m128 _mm_abs_ps(__m128 t)
340 static const uint32_t signmask[4]
__attribute__((aligned(64)))
341 = { 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff };
342 return _mm_and_ps(*(__m128 *)signmask,
t);
361 static const float a = 4 / (
M_PI *
M_PI);
362 static const float p = 0.225f;
366 return t * (
p * (fabsf(
t) - 1) + 1);
369#if defined(__x86_64__) || defined(__i386__)
382static inline __m128 sinf_fast_sse(__m128
t)
384 static const __m128 a
386 static const __m128
p = { 0.225f, 0.225f, 0.225f, 0.225f };
390 const __m128 m1 = _mm_abs_ps(
t);
391 const __m128 m2 = _mm_sub_ps(pi, m1);
392 const __m128 m3 = _mm_mul_ps(
t, m2);
393 const __m128 m4 = _mm_mul_ps(a, m3);
396 const __m128 n1 = _mm_abs_ps(m4);
397 const __m128 n2 = _mm_mul_ps(m4, n1);
398 const __m128 n3 = _mm_sub_ps(n2, m4);
399 const __m128 n4 = _mm_mul_ps(
p, n3);
401 return _mm_add_ps(n4, m4);
413static inline int ipow(
int base,
int exp)
454 abs_arg[c] = (arg[c] < 0.0f) ? -arg[c] : arg[c];
457 scaled[c] = a[c] * arg[c] * (pi[c] - abs_arg[c]);
460 abs_scaled[c] = (scaled[c] < 0.0f) ? -scaled[c] : scaled[c];
462 sine[c] = scaled[c] * (
p[c] * (abs_scaled[c] - one[c]) + one[c]);
471 if(
x <= 1e-16f)
return 0.0f;
479 conv.i = 0x5f3759dfu - (conv.i >> 1);
482 y = y * (1.5f - 0.5f *
x * y * y);
#define m
Definition basecurve.c:277
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
Definition chromatic_adaptation.h:309
static const float scaling
Definition chromatic_adaptation.h:293
const float i
Definition colorspaces_inline_conversions.h:440
const dt_aligned_pixel_t f
Definition colorspaces_inline_conversions.h:102
for(size_t c=0;c< 3;c++) sRGB[c]
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
#define __OMP_SIMD__(...)
Definition darktable.h:262
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
const int t
Definition iop_profile.h:225
const float v
Definition iop_profile.h:221
float *const restrict const size_t k
Definition luminance_mask.h:78
static float Kahan_sum(const float m, float *const __restrict__ c, const float add)
Definition math.h:103
static float ceil_fast(float x)
Definition math.h:322
static float clamp_range_f(const float x, const float low, const float high)
Definition math.h:96
#define DT_M_LN2f
Definition math.h:55
static int ipow(int base, int exp)
Fast integer power, computing base^exp.
Definition math.h:413
static void mul_mat_vec_2(const float *m, const float *p, float *o)
Definition math.h:176
#define NORM_MIN
Definition math.h:35
static float f_inv_sqrtf(const float x)
Definition math.h:469
static float fast_mexp2f(const float x)
Definition math.h:304
static float sinf_fast(float t)
Definition math.h:358
c< 3;c++) acc+=v_1[c] *v_2[c];return acc;}static inline float sqf(const float x){ return x *x;}static inline float euclidean_norm(const dt_aligned_pixel_t vector){ return fmaxf(sqrtf(sqf(vector[0])+sqf(vector[1])+sqf(vector[2])), 1.52587890625e-05f);}static inline void downscale_vector(dt_aligned_pixel_t vector, const float scaling){ const int valid=(scaling > 1.52587890625e-05f) &&!isnan(scaling);for(size_t c=0;c< 3;c++) vector[c]=(valid) ? vector[c]/(scaling+1.52587890625e-05f) :vector[c]/1.52587890625e-05f ;}static inline void upscale_vector(dt_aligned_pixel_t vector, const float scaling){ const int valid=(scaling > 1.52587890625e-05f) &&!isnan(scaling);for(size_t c=0;c< 3;c++) vector[c]=(valid) ? vector[c] *(scaling+1.52587890625e-05f) :vector[c] *1.52587890625e-05f ;}static inline float dt_log2f(const float f){ return logf(f)/logf(2.0f);}union float_int { float f;int k;};static inline float dt_fast_hypotf(const float x, const float y){ return sqrtf(x *x+y *y);}static inline float dt_fast_expf(const float x){ const int i1=0x3f800000u;const int i2=0x402DF854u;const int k0=i1+x *(i2 - i1);union float_int u;u.k=k0 > k0
Definition math.h:263
return u f
Definition math.h:264
static float dt_fast_mexp2f(const float x)
Definition math.h:288
static void mat3mul(float *const __restrict__ dest, const float *const __restrict__ m1, const float *const __restrict__ m2)
Definition math.h:161
const dt_aligned_pixel_t v_2
Definition math.h:184
static void dt_vector_sin(const dt_aligned_pixel_t arg, dt_aligned_pixel_t sine)
Definition math.h:440
#define M_PI_F
Definition math.h:48
static float fastlog2(float x)
Definition math.h:122
static float fastlog(float x)
Definition math.h:138
static float Log2(float x)
Definition math.h:111
static float Log2Thres(float x, float Thres)
Definition math.h:116
static void dt_fast_expf_4wide(const float x[4], float result[4])
Definition math.h:267
#define M_PI
Definition math.h:45
static void mat3mulv(float *const __restrict__ dest, const float *const mat, const float *const __restrict__ v)
Definition math.h:146
c
Definition derive_filmic_v6_gamut_mapping.py:35
float dt_aligned_pixel_t[4]
Definition noiseprofile.c:28