aboutsummaryrefslogtreecommitdiff
path: root/src/effect.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-09-12 01:29:32 +0200
committerFederico Angelilli <code@fedang.net>2024-09-12 01:29:32 +0200
commitbd8dbe03ead6c73f28df517f8873675108277bf5 (patch)
tree3a63ef377a599d7b9cddc4e2e3184f8defe29756 /src/effect.c
parent2907d743760f74a01a77dca91c4f74ac849517b5 (diff)
Add effects
Diffstat (limited to 'src/effect.c')
-rw-r--r--src/effect.c52
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);
+}