From: Daniel Stone <dan...@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 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel