static inline float curve_scalar( const float x, const float g, const float sigma, const float shadows, const float highlights, const float clarity) { const float c = x-g; float val; // blend in via quadratic bezier if (c > 2*sigma) val = g + sigma + shadows * (c-sigma); else if(c < -2*sigma) val = g - sigma + highlights * (c+sigma); else if(c > 0.0f) { // shadow contrast const float t = CLAMPS(c / (2.0f*sigma), 0.0f, 1.0f); const float t2 = t * t; const float mt = 1.0f-t; val = g + sigma * 2.0f*mt*t + t2*(sigma + sigma*shadows); } else { // highlight contrast const float t = CLAMPS(-c / (2.0f*sigma), 0.0f, 1.0f); const float t2 = t * t; const float mt = 1.0f-t; val = g - sigma * 2.0f*mt*t + t2*(- sigma - sigma*highlights); } // midtone local contrast val += clarity * c * dt_fast_expf(-c*c/(2.0*sigma*sigma/3.0f)); return val; }
static float color_filter(const float ai, const float bi, const float a, const float b, const float size) { return dt_fast_expf(-CLAMPS(((ai-a)*(ai-a) + (bi-b)*(bi-b))/(2.0*size), 0.0f, 1.0f)); }