aboutsummaryrefslogtreecommitdiff
path: root/src/animate.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-07-08 15:22:41 +0200
committerFederico Angelilli <code@fedang.net>2024-07-08 15:22:41 +0200
commit5d170a634ead0119f6e5a9f63c23b2b064126f75 (patch)
tree0447d2dbb0da6358d184a4c62d5557d4d22f5e8d /src/animate.c
parent92feb3c130966202c7caa6d9bf3a3800c97ca7a1 (diff)
Remove old files
Diffstat (limited to 'src/animate.c')
-rw-r--r--src/animate.c222
1 files changed, 0 insertions, 222 deletions
diff --git a/src/animate.c b/src/animate.c
deleted file mode 100644
index 839e748..0000000
--- a/src/animate.c
+++ /dev/null
@@ -1,222 +0,0 @@
-#include <glib.h>
-#include <stdbool.h>
-#include <math.h>
-
-#include "animate.h"
-#include "state.h"
-#include "log.h"
-
-double clamp(double x, double min, double max)
-{
- const double t = x < min ? min : x;
- return t > max ? max : t;
-}
-
-double smoothstep(double x, double edge0, double edge1)
-{
- x = clamp((x - edge0) / (edge1 - edge0), 0, 1);
- return x * x * (3.0 - 2.0 * x);
-}
-
-double quadratic_bezier(double x, double a, double b, double c)
-{
- g_assert(x >= 0 && x <= 1);
- const double t = 1 - x;
- return a * t * t + 2 * b * t * x + c * x * x;
-}
-
-double cubic_bezier(double x, double a, double b, double c, double d)
-{
- g_assert(x >= 0 && x <= 1);
- const double t = 1 - x;
- return a * (t * t * t) + 3 * b * (t * t * x) + 3 * c * (t * x * x) + d * (x * x * x);
-}
-
-typedef struct {
- Animation anim;
- int width;
- cairo_pattern_t *gradient;
-} AnimationShine;
-
-static bool shine_func(AnimationShine *shine, Layout *layout, cairo_t *cr)
-{
- gint64 end = shine->anim.start + shine->anim.duration;
- gint64 now = g_get_monotonic_time();
- if (now > end) return false;
-
- double t = (double)(now - shine->anim.start) / (end - shine->anim.start);
- double pos = cubic_bezier(t, 0.19, 1.0, 0.22, 1.0);
-
- double angle = atan((double)layout->height / layout->width);
-
- // Make it double just to be sure
- int h = 2 * (double)layout->height / cos(angle);
- int x = layout->x + pos * layout->width - shine->width;
- int y = layout->y;
-
- cairo_matrix_t matrix;
- cairo_matrix_init_translate(&matrix, -x, -y);
- cairo_pattern_set_matrix(shine->gradient, &matrix);
-
- int dx = layout->x + layout->width / 2;
- int dy = layout->y + layout->height / 2;
-
- cairo_translate(cr, dx, dy);
- cairo_rotate(cr, -angle);
- cairo_translate(cr, -dx, -dy);
-
- cairo_set_operator(cr, CAIRO_OPERATOR_ATOP);
- cairo_set_source(cr, shine->gradient);
- cairo_rectangle(cr, x, y - (h - layout->height) / 2, shine->width, h);
- cairo_fill(cr);
-
- return true;
-}
-
-Animation *animation_shine_create(gint64 duration)
-{
- // Note the 0 initialization
- AnimationShine *shine = g_malloc0(sizeof(AnimationShine));
- shine->anim.type = ANIM_SHINE;
- shine->anim.after_func = (DrawFunc)shine_func;
- shine->anim.duration = duration;
-
- // TODO: Change it depending on container size
- shine->width = 25;
-
- shine->gradient = cairo_pattern_create_linear(0, 0, shine->width, 0);
- cairo_pattern_add_color_stop_rgba(shine->gradient, 0, 1, 1, 1, 0);
- cairo_pattern_add_color_stop_rgba(shine->gradient, 0.5, 1, 1, 1, 0.2);
- cairo_pattern_add_color_stop_rgba(shine->gradient, 1, 1, 1, 1, 0);
-
- return (gpointer)shine;
-}
-
-static bool pulse_func(Animation *pulse, Layout *layout, cairo_t *cr)
-{
- gint64 end = pulse->start + pulse->duration;
- gint64 now = g_get_monotonic_time();
- if (now > end) return false;
-
- // After half the duration we invert direction
- gint64 mid = pulse->start + pulse->duration / 2;
- double t = now <= mid
- ? (double)(now - pulse->start) / (mid - pulse->start)
- : 1.0 - (double)(now - mid) / (end - mid);
-
- double pos = cubic_bezier(t, 0.19, 1.0, 0.22, 1.0);
- int max = 0.15 * layout->height;
-
- layout->x_pad = layout->btn->x_pad + max * pos;
- layout->y_pad = layout->btn->y_pad + max * pos;
-
- return true;
-}
-
-Animation *animation_pulse_create(gint64 duration)
-{
- // Note the 0 initialization
- Animation *pulse = g_malloc0(sizeof(Animation));
- pulse->type = ANIM_PULSE;
- pulse->before_func = (DrawFunc)pulse_func;
- pulse->duration = duration;
- return pulse;
-}
-
-static bool shrink_func(Animation *shrink, Layout *layout)
-{
- g_assert_false(layout->btn->simple);
- ButtonGroup *group = (gpointer)layout->btn;
-
- gint64 end = shrink->start + shrink->duration;
- gint64 now = g_get_monotonic_time();
-
- if (now > end) {
- // NOTE: Actually remove the buttons from the group after the animation's end
- // This part is quite rough around the edges...
- if (group->children->next) {
- g_list_free(g_list_remove_link(group->children, group->children));
- g_list_free_full(g_list_remove_link(layout->children, layout->children), (GDestroyNotify)layout_destroy);
- layout->width = CAST(layout->children->data, Layout)->width;
- return true;
- }
-
- return false;
- }
-
- double t = (double)(now - shrink->start) / (end - shrink->start);
- double pos = smoothstep(t, 0, 1);
-
- int target_w = CAST(layout->children->data, Layout)->width;
- int width = layout->width - pos * (layout->width - target_w);
- layout->width = width;
-
- for (GList *it = layout->children, *next = it->next; it; it = next, next = it ? it->next : NULL) {
- Layout *child = it->data;
- if (child->x + child->width <= layout->x + width) continue;
-
- layout_destroy(it->data);
- layout->children = g_list_delete_link(layout->children, it);
- }
-
- return true;
-}
-
-Animation *animation_group_shrink_create(gint64 duration)
-{
- // Note the 0 initialization
- Animation *shrink = g_malloc0(sizeof(Animation));
- shrink->type = ANIM_GROUP_SHRINK;
- shrink->layout_func = (LayoutFunc)shrink_func;
- shrink->duration = duration;
- return shrink;
-}
-
-static bool grow_func(Animation *grow, Layout *layout)
-{
- g_assert_false(layout->btn->simple);
- ButtonGroup *group = (gpointer)layout->btn;
-
- gint64 end = grow->start + grow->duration;
- gint64 now = g_get_monotonic_time();
- if (now > end) return false;
-
- double t = (double)(now - grow->start) / (end - grow->start);
- double pos = smoothstep(t, 0, 1);
-
- int start_w = CAST(layout->children->data, Layout)->width;
- int width = start_w + pos * (layout->width - start_w);
- layout->width = width;
-
- for (GList *it = layout->children->next, *next = it->next; it; it = next, next = it ? it->next : NULL) {
- Layout *child = it->data;
- if (child->x + child->width <= layout->x + width) continue;
-
- layout_destroy(it->data);
- layout->children = g_list_delete_link(layout->children, it);
- }
-
- return true;
-}
-
-Animation *animation_group_grow_create(gint64 duration)
-{
- // Note the 0 initialization
- Animation *grow = g_malloc0(sizeof(Animation));
- grow->type = ANIM_GROUP_GROW;
- grow->layout_func = (LayoutFunc)grow_func;
- grow->duration = duration;
- return grow;
-}
-
-void animation_destroy(Animation *anim)
-{
- if (anim == NULL) return;
-
- if (anim->type == ANIM_SHINE)
- cairo_pattern_destroy(CAST(anim, AnimationShine)->gradient);
-
- g_free(anim);
-}
-
-// vim: ts=4 sw=4 et