diff options
| author | Federico Angelilli <code@fedang.net> | 2024-09-12 01:29:32 +0200 |
|---|---|---|
| committer | Federico Angelilli <code@fedang.net> | 2024-09-12 01:29:32 +0200 |
| commit | bd8dbe03ead6c73f28df517f8873675108277bf5 (patch) | |
| tree | 3a63ef377a599d7b9cddc4e2e3184f8defe29756 /src/effect.c | |
| parent | 2907d743760f74a01a77dca91c4f74ac849517b5 (diff) | |
Add effects
Diffstat (limited to 'src/effect.c')
| -rw-r--r-- | src/effect.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/effect.c b/src/effect.c new file mode 100644 index 0000000..ae44c68 --- /dev/null +++ b/src/effect.c @@ -0,0 +1,52 @@ +#include <math.h> + +#include "effect.h" +#include "any_log.h" + +double cubic_bezier(double x, double a, double b, double c, double d) +{ + const double t = 1 - x; + return a * (t * t * t) + 3 * b * (t * t * x) + 3 * c * (t * x * x) + d * (x * x * x); +} + +static void effect_pulse_pre(effect_t *effect, layout_t *layout, cairo_t *cr) +{ + struct timespec now; + timespec_get(&now, TIME_UTC); + + // After half the duration we invert direction + struct timespec midpoint = timespec_div(effect->duration, 2); + struct timespec diff = timespec_diff(now, effect->start); + + double t = timespec_greater(midpoint, diff) + ? (double)timespec_to_ms(diff) / timespec_to_ms(midpoint) + : 1.0 - (double)timespec_to_ms(timespec_diff(diff, midpoint)) / timespec_to_ms(midpoint); + + // Make it customizable + double s = cubic_bezier(t, 0.19, 1.0, 0.22, 1.0); + + // Make it a parameter + const double amplitude = 0.12; + + // FIXME: The intent was to scale the animation for long blocks, but it needs more love + // + int x_max = amplitude * (layout->height + (layout->width / (double)layout->height) - 1); + int y_max = amplitude * layout->height; + + layout->x_padding = layout->block->x_padding + x_max * s; + layout->y_padding = layout->block->y_padding + y_max * s; +} + +effect_t *effect_pulse(struct timespec duration) +{ + effect_t *effect = calloc(1, sizeof(effect_t)); + effect->type = EFFECT_PULSE; + effect->duration = duration; + effect->pre = effect_pulse_pre; + return effect; +} + +void effect_free(effect_t *effect) +{ + free(effect); +} |
