[PATCH 3/9] Add move/scale animation
Emilio Pozuelo Monfort
pochu27 at gmail.com
Fri Nov 15 08:53:32 PST 2013
From: Daniel Stone <daniel at fooishbar.org>
Add an animation which moves a surface to a new location, at the same
time as also rescaling it to a different size from the origin, rather
than the existing scale animation which resizes from the centre.
[pochu: rebased, ported to weston_view]
---
src/animation.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/compositor.h | 6 ++++++
2 files changed, 68 insertions(+)
diff --git a/src/animation.c b/src/animation.c
index 8739f19..f717b33 100644
--- a/src/animation.c
+++ b/src/animation.c
@@ -377,3 +377,65 @@ weston_slide_run(struct weston_view *view, float start, float stop,
return animation;
}
+
+struct weston_move_animation {
+ int dx;
+ int dy;
+ int reverse;
+ weston_view_animation_done_func_t done;
+};
+
+static void
+move_frame(struct weston_view_animation *animation)
+{
+ struct weston_move_animation *move = animation->private;
+ float scale;
+ float progress = animation->spring.current;
+
+ if (move->reverse)
+ progress = 1.0 - progress;
+
+ scale = animation->start +
+ (animation->stop - animation->start) *
+ progress;
+ weston_matrix_init(&animation->transform.matrix);
+ weston_matrix_scale(&animation->transform.matrix, scale, scale, 1.0f);
+ weston_matrix_translate(&animation->transform.matrix,
+ move->dx * progress, move->dy * progress,
+ 0);
+}
+
+static void
+move_done(struct weston_view_animation *animation, void *data)
+{
+ struct weston_move_animation *move = animation->private;
+
+ if (move->done)
+ move->done(animation, data);
+
+ free(move);
+}
+
+WL_EXPORT struct weston_view_animation *
+weston_move_scale_run(struct weston_view *view, int dx, int dy,
+ float start, float end, int reverse,
+ weston_view_animation_done_func_t done, void *data)
+{
+ struct weston_move_animation *move;
+ struct weston_view_animation *animation;
+
+ move = malloc(sizeof(*move));
+ if (!move)
+ return NULL;
+ move->dx = dx;
+ move->dy = dy;
+ move->reverse = reverse;
+ move->done = done;
+
+ animation = weston_view_animation_run(view, start, end, move_frame,
+ NULL, move_done, data, move);
+ animation->spring.k = 400;
+ animation->spring.friction = 1150;
+
+ return animation;
+}
diff --git a/src/compositor.h b/src/compositor.h
index b67b993..6087468 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1281,6 +1281,12 @@ struct weston_view_animation *
weston_fade_run(struct weston_view *view,
float start, float end, float k,
weston_view_animation_done_func_t done, void *data);
+
+struct weston_view_animation *
+weston_move_scale_run(struct weston_view *view, int dx, int dy,
+ float start, float end, int reverse,
+ weston_view_animation_done_func_t done, void *data);
+
void
weston_fade_update(struct weston_view_animation *fade, float target);
--
1.8.4.rc3
More information about the wayland-devel
mailing list