19#ifndef DT_IOP_DRAWLAYER_BRUSH_PROFILE_H
20#define DT_IOP_DRAWLAYER_BRUSH_PROFILE_H
33 return fminf(fmaxf(
v, 0.0f), 1.0f);
45 const float smooth =
t *
t * (3.0f - 2.0f *
t);
56 const float inner,
const float w,
63 const float q_u = 0.5f * u * u - (2.0f / 3.0f) * u * u * u + 0.25f * u * u * u * u;
64 const float q_i = 0.5f * inner * inner - (2.0f / 3.0f) * inner * inner * inner
65 + 0.25f * inner * inner * inner * inner;
66 return base + (q_u - q_i) / (w * w);
71 const float s2 = s * s;
72 const float s3 = s2 * s;
73 const float s4 = s2 * s2;
74 const float s5 = s4 * s;
75 const float delta = w * (inner * (s - s3 + 0.5f * s4)
76 + w * (0.5f * s2 - 0.75f * s4 + 0.4f * s5));
82 const float l_u = 0.5f * u * u - (1.0f / 3.0f) * u * u * u;
83 const float l_i = 0.5f * inner * inner - (1.0f / 3.0f) * inner * inner * inner;
84 return base + (l_u - l_i) / w;
100 const float radius = sqrtf(norm2);
101 if(radius < 0.5f)
return 1.0f - 6.0f * norm2 + 6.0f * norm2 * radius;
102 const float inv_r = 1.0f - radius;
103 return 2.0f * inv_r * inv_r * inv_r;
107 if(hardness >= 1.0f - 1e-6f)
return 1.0f;
109 const float min_inner = 0.5f / fmaxf(dab->
radius, 0.5f);
111 const float radius = sqrtf(norm2);
112 if(radius <= inner)
return 1.0f;
126 if(u <= 0.0f)
return 0.0f;
130 if(u <= 0.5f)
return 0.5f * u * u - 1.5f * u * u * u * u + 1.2f * u * u * u * u * u;
131 const float u2 = u * u;
132 const float u3 =
u2 * u;
133 const float u4 =
u2 *
u2;
134 const float u5 = u4 * u;
135 return u2 - 2.0f * u3 + 1.5f * u4 - 0.4f * u5 - 0.0125f;
139 if(hardness >= 1.0f - 1e-6f)
return 0.5f * u * u;
140 const float min_inner = 0.5f / fmaxf(dab->
radius, 0.5f);
142 if(u <= inner)
return 0.5f * u * u;
143 const float w = fmaxf(1.0f - inner, 1e-6f);
144 const float base = 0.5f * inner * inner;
Dab-level brush rasterization API for drawlayer.
@ DT_DRAWLAYER_BRUSH_SHAPE_SIGMOIDAL
@ DT_DRAWLAYER_BRUSH_SHAPE_GAUSSIAN
@ DT_DRAWLAYER_BRUSH_SHAPE_LINEAR
@ DT_DRAWLAYER_BRUSH_SHAPE_QUADRATIC
static float dt_drawlayer_brush_profile_eval(const dt_drawlayer_brush_dab_t *dab, const float norm2)
Evaluate normalized brush profile at squared normalized radius.
static float dt_drawlayer_brush_mass_primitive_eval(const dt_drawlayer_brush_dab_t *dab, const float u_in)
Evaluate radial mass primitive from center to normalized radius u_in.
static float dt_drawlayer_brush_profile_clamp01(const float v)
Clamp scalar value to [0, 1].
static float dt_drawlayer_brush_transition_mass_primitive_eval(const int shape, const float u, const float inner, const float w, const float base)
Evaluate integrated mass primitive of transition zone by shape.
static float dt_drawlayer_brush_transition_profile_eval(const int shape, const float t, const float inv_t)
Evaluate normalized edge-falloff transition profile by shape.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
Fully resolved input dab descriptor.