diff options
Diffstat (limited to 'src/ico_window_animation.c')
-rw-r--r-- | src/ico_window_animation.c | 383 |
1 files changed, 345 insertions, 38 deletions
diff --git a/src/ico_window_animation.c b/src/ico_window_animation.c index 12ff474..8d008b4 100644 --- a/src/ico_window_animation.c +++ b/src/ico_window_animation.c @@ -46,10 +46,18 @@ /* Animation type */ #define ANIMA_ZOOM 1 /* ZoomIn/ZoomOut */ #define ANIMA_FADE 2 /* FadeIn/FadeOut */ -#define ANIMA_SLIDE_TORIGHT 3 /* SlideIn left to right/SlideOut right to left*/ -#define ANIMA_SLIDE_TOLEFT 4 /* SlideIn right to left/SlideOut left to right*/ -#define ANIMA_SLIDE_TOBOTTOM 5 /* SlideIn top to bottom/SlideOut bottom to top*/ -#define ANIMA_SLIDE_TOTOP 6 /* SlideIn bottom to top/SlideOut top to bottom*/ +#define ANIMA_SLIDE_TORIGHT 11 /* SlideIn left to right/SlideOut right to left */ +#define ANIMA_SLIDE_TOLEFT 12 /* SlideIn right to left/SlideOut left to right */ +#define ANIMA_SLIDE_TOBOTTOM 13 /* SlideIn top to bottom/SlideOut bottom to top */ +#define ANIMA_SLIDE_TOTOP 14 /* SlideIn bottom to top/SlideOut top to bottom */ +#define ANIMA_WIPE_TORIGHT 21 /* WipeIn left to right/WipeOut right to left */ +#define ANIMA_WIPE_TOLEFT 22 /* WipeIn right to left/WipeOut left to right */ +#define ANIMA_WIPE_TOBOTTOM 23 /* WipeIn top to bottom/WipeOut bottom to top */ +#define ANIMA_WIPE_TOTOP 24 /* WipeIn bottom to top/WipeOut top to bottom */ +#define ANIMA_SWING_TORIGHT 31 /* SwingIn left to right/SwingOut right to left */ +#define ANIMA_SWING_TOLEFT 32 /* SwingIn right to left/SwingOut left to right */ +#define ANIMA_SWING_TOBOTTOM 33 /* SwingIn top to bottom/SwingOut bottom to top */ +#define ANIMA_SWING_TOTOP 34 /* SwingIn bottom to top/SwingOut top to bottom */ /* Visible control at end of animation */ #define ANIMA_NOCONTROL_AT_END 0 /* no need surface show/hide at end of animation*/ @@ -73,10 +81,43 @@ static int animation_fps; /* animation frame rate(frame/sec) static int animation_time; /* default animation time(ms) */ static struct animation_data *free_data; /* free data list */ +/* support animation names */ +static const struct _supprt_animaetions { + char *name; + int animaid; +} supprt_animaetions[] = { + { "fade", ANIMA_FADE }, + { "zoom", ANIMA_ZOOM }, + { "slide", ANIMA_SLIDE_TOTOP }, + { "slide.toleft", ANIMA_SLIDE_TOLEFT }, + { "slide.toright", ANIMA_SLIDE_TORIGHT }, + { "slide.totop", ANIMA_SLIDE_TOTOP }, + { "slide.tobottom", ANIMA_SLIDE_TOBOTTOM }, + { "wipe", ANIMA_WIPE_TOTOP }, + { "wipe.toleft", ANIMA_WIPE_TOLEFT }, + { "wipe.toright", ANIMA_WIPE_TORIGHT }, + { "wipe.totop", ANIMA_WIPE_TOTOP }, + { "wipe.tobottom", ANIMA_WIPE_TOBOTTOM }, + { "swing", ANIMA_SWING_TOTOP }, + { "swing.toleft", ANIMA_SWING_TOLEFT }, + { "swing.toright", ANIMA_SWING_TORIGHT }, + { "swing.totop", ANIMA_SWING_TOTOP }, + { "swing.tobottom", ANIMA_SWING_TOBOTTOM }, + { "\0", -1 } +}; + /* static function */ /* slide animation */ static void animation_slide(struct weston_animation *animation, struct weston_output *output, uint32_t msecs); + /* wipe animation */ +static void animation_wipe(struct weston_animation *animation, + struct weston_output *output, uint32_t msecs); + /* swing animation */ +static void animation_swing(struct weston_animation *animation, + struct weston_output *output, uint32_t msecs); + /* swing animation end */ +static void animation_swing_end(struct weston_animation *animation); /* fade animation */ static void animation_fade(struct weston_animation *animation, struct weston_output *output, uint32_t msecs); @@ -110,36 +151,19 @@ ico_window_animation(const int op, void *data) { struct uifw_win_surface *usurf; struct weston_output *output; + int idx; int ret; uint32_t nowsec; int animaid; if (op == ICO_WINDOW_MGR_ANIMATION_NAME) { /* convert animation name to animation type value */ - if (strcasecmp((char *)data, "fade") == 0) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_FADE); - return ANIMA_FADE; - } - else if (strcasecmp((char *)data, "zoom") == 0) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_ZOOM); - return ANIMA_ZOOM; - } - else if (strcasecmp((char *)data, "slide.toleft") == 0) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_SLIDE_TOLEFT); - return ANIMA_SLIDE_TOLEFT; - } - else if (strcasecmp((char *)data, "slide.toright") == 0) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_SLIDE_TORIGHT); - return ANIMA_SLIDE_TORIGHT; - } - else if ((strcasecmp((char *)data, "slide.totop") == 0) || - (strcasecmp((char *)data, "slide") == 0)) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_SLIDE_TOTOP); - return ANIMA_SLIDE_TOTOP; - } - else if (strcasecmp((char *)data, "slide.tobottom") == 0) { - uifw_trace("ico_window_animation: Type %s(%d)", (char *)data, ANIMA_SLIDE_TOBOTTOM); - return ANIMA_SLIDE_TOBOTTOM; + for (idx = 0; supprt_animaetions[idx].animaid > 0; idx++) { + if (strcasecmp(supprt_animaetions[idx].name, (char *)data) == 0) { + uifw_trace("ico_window_animation: Type %s(%d)", + (char *)data, supprt_animaetions[idx].animaid); + return supprt_animaetions[idx].animaid; + } } uifw_warn("ico_window_animation: Unknown Type %s", (char *)data); return ICO_WINDOW_MGR_ANIMATION_RET_NOANIMA; @@ -150,7 +174,7 @@ ico_window_animation(const int op, void *data) if (op == ICO_WINDOW_MGR_ANIMATION_DESTROY) { if ((usurf->animation.state != ICO_WINDOW_MGR_ANIMATION_STATE_NONE) || (usurf->animation.animadata != NULL)) { - uifw_trace("ico_window_animation: Destroy %08x", (int)usurf); + uifw_trace("ico_window_animation: Destroy %08x", usurf->surfaceid); animation_end(usurf, 0); } return ICO_WINDOW_MGR_ANIMATION_RET_ANIMA; @@ -260,6 +284,18 @@ ico_window_animation(const int op, void *data) usurf->restrain_configure = 1; (*usurf->animation.animation.frame)(&usurf->animation.animation, NULL, 1); } + else if ((animaid == ANIMA_WIPE_TOLEFT) || (animaid == ANIMA_WIPE_TORIGHT) || + (animaid == ANIMA_WIPE_TOTOP) || (animaid == ANIMA_WIPE_TOBOTTOM)) { + usurf->animation.animation.frame = animation_wipe; + usurf->restrain_configure = 1; + (*usurf->animation.animation.frame)(&usurf->animation.animation, NULL, 1); + } + else if ((animaid == ANIMA_SWING_TOLEFT) || (animaid == ANIMA_SWING_TORIGHT) || + (animaid == ANIMA_SWING_TOTOP) || (animaid == ANIMA_SWING_TOBOTTOM)) { + usurf->animation.animation.frame = animation_swing; + usurf->restrain_configure = 1; + (*usurf->animation.animation.frame)(&usurf->animation.animation, NULL, 1); + } else if (animaid == ANIMA_FADE) { usurf->animation.animation.frame = animation_fade; usurf->restrain_configure = 1; @@ -476,8 +512,8 @@ animation_slide(struct weston_animation *animation, } par = usurf->animation.current; - uifw_trace("animation_slide: usurf=%08x count=%d %d%% anima=%d state=%d", - (int)usurf, animation->frame_counter, par, + uifw_trace("animation_slide: %08x count=%d %d%% anima=%d state=%d", + usurf->surfaceid, animation->frame_counter, par, usurf->animation.anima, usurf->animation.state); es = usurf->surface; @@ -557,6 +593,277 @@ animation_slide(struct weston_animation *animation, /*--------------------------------------------------------------------------*/ /** + * @brief animation_wipe: wipe animation + * + * @param[in] animation weston animation table + * @param[in] outout weston output table + * @param[in] mseces current time(unused) + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +animation_wipe(struct weston_animation *animation, + struct weston_output *output, uint32_t msecs) +{ + struct uifw_win_surface *usurf; + struct weston_surface *es; + int par; + int x; + int y; + int width; + int height; + + usurf = container_of(animation, struct uifw_win_surface, animation.animation); + + par = animation_cont(animation, output, msecs); + if (par > 0) { + /* continue animation */ + if( par <= 100) { + weston_compositor_schedule_repaint(weston_ec); + } + return; + } + par = usurf->animation.current; + + uifw_trace("animation_wipe: %08x count=%d %d%% anima=%d state=%d", + usurf->surfaceid, animation->frame_counter, par, + usurf->animation.anima, usurf->animation.state); + + es = usurf->surface; + x = usurf->x; + y = usurf->y; + width = usurf->width; + height = usurf->width; + + if (par < 100) { + switch (usurf->animation.anima) { + case ANIMA_WIPE_TORIGHT: /* wipe in left to right */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* wipe in left to right */ + width = ((float)width) * ((float)par + 5.0f) / 105.0f; + } + else { + /* wipe out right to left */ + width = width - (((float)width) * ((float)par + 5.0f) / 105.0f); + } + if (width <= 0) width = 1; + break; + case ANIMA_WIPE_TOLEFT: /* wipe in right to left */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* wipe in right to left */ + width = ((float)width) * ((float)par + 5.0f) / 105.0f; + } + else { + /* wipe out left to right */ + width = width - (((float)width) * ((float)par + 5.0f) / 105.0f); + } + if (width <= 0) width = 1; + x = x + (usurf->width - width); + break; + case ANIMA_WIPE_TOBOTTOM: /* wipe in top to bottom */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* wipe in top to bottom */ + height = ((float)height) * ((float)par + 5.0f) / 105.0f; + } + else { + /* wipe out bottom to top */ + height = height - (((float)height) * ((float)par + 5.0f) / 105.0f); + } + if (height <= 0) height = 1; + break; + default: /*ANIMA_WIPE_TOTOP*/ /* wipe in bottom to top */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* wipe in bottom to top */ + height = ((float)height) * ((float)par + 5.0f) / 105.0f; + } + else { + /* wipe out top to bottom */ + height = height - (((float)height) * ((float)par + 5.0f) / 105.0f); + } + if (height <= 0) height = 1; + y = y + (usurf->height - height); + break; + } + } + + es->geometry.x = usurf->node_tbl->disp_x + x; + es->geometry.y = usurf->node_tbl->disp_y + y; + es->geometry.width = width; + es->geometry.height = height; + if ((es->output) && (es->buffer_ref.buffer)) { + weston_surface_geometry_dirty(es); + weston_surface_damage(es); + } + if (par >= 100) { + /* end of animation */ + animation_end(usurf, 1); + uifw_trace("animation_wipe: End of animation"); + } + else { + /* continue animation */ + weston_compositor_schedule_repaint(weston_ec); + } +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief animation_swing: swing animation + * + * @param[in] animation weston animation table + * @param[in] outout weston output table + * @param[in] mseces current time(unused) + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +animation_swing(struct weston_animation *animation, + struct weston_output *output, uint32_t msecs) +{ + struct uifw_win_surface *usurf; + struct weston_surface *es; + struct animation_data *animadata; + int par; + int x; + int y; + float scalex; + float scaley; + + usurf = container_of(animation, struct uifw_win_surface, animation.animation); + + par = animation_cont(animation, output, msecs); + if (par > 0) { + /* continue animation */ + if( par <= 100) { + weston_compositor_schedule_repaint(weston_ec); + } + return; + } + + uifw_trace("animation_swing: %08x count=%d %d%% anima=%d state=%d", + usurf->surfaceid, animation->frame_counter, par, + usurf->animation.anima, usurf->animation.state); + + animadata = (struct animation_data *)usurf->animation.animadata; + es = usurf->surface; + par = usurf->animation.current; + if (animation->frame_counter == 1) { + if (animadata->transform_set == 0) { + animadata->transform_set = 1; + weston_matrix_init(&animadata->transform.matrix); + wl_list_init(&animadata->transform.link); + wl_list_insert(&es->geometry.transformation_list, + &animadata->transform.link); + } + animadata->end_function = animation_swing_end; + } + + x = usurf->x; + y = usurf->y; + scalex = 1.0; + scaley = 1.0; + + if (par < 100) { + switch (usurf->animation.anima) { + case ANIMA_SWING_TORIGHT: /* swing in left to right */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* swing in left to right */ + scalex = ((float)par + 5.0f) / 105.0f; + } + else { + /* swing out right to left */ + scalex = 1.0 - (((float)par + 5.0f) / 105.0f); + } + if (scalex <= 0.0) scalex = 0.01; + break; + case ANIMA_SWING_TOLEFT: /* seing in right to left */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* swing in right to left */ + scalex = ((float)par + 5.0f) / 105.0f; + } + else { + /* swing out left to right */ + scalex = 1.0 - (((float)par + 5.0f) / 105.0f); + } + if (scalex <= 0.0) scalex = 0.01; + x = x + (int)((float)usurf->width * (1.0f - scalex)); + break; + case ANIMA_SWING_TOBOTTOM: /* swing in top to bottom */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* swing in top to bottom */ + scaley = ((float)par + 5.0f) / 105.0f; + } + else { + /* swing out bottom to top */ + scalex = 1.0 - (((float)par + 5.0f) / 105.0f); + } + if (scaley <= 0.0) scaley = 0.01; + break; + default: /*ANIMA_SWING*/ /* swing in bottom to top */ + if (usurf->animation.state == ICO_WINDOW_MGR_ANIMATION_STATE_SHOW) { + /* wipe in bottom to top */ + scaley = ((float)par + 5.0f) / 105.0f; + } + else { + /* wipe out top to bottom */ + scalex = 1.0 - (((float)par + 5.0f) / 105.0f); + } + if (scaley <= 0.0) scaley = 0.01; + y = y + (int)((float)usurf->height * (1.0f - scaley)); + break; + } + } + + es->geometry.x = usurf->node_tbl->disp_x + x; + es->geometry.y = usurf->node_tbl->disp_y + y; + weston_matrix_init(&animadata->transform.matrix); + weston_matrix_translate(&animadata->transform.matrix, + -0.5f * usurf->width, -0.5f * usurf->height, 0); + weston_matrix_scale(&animadata->transform.matrix, scalex, scaley, 1.0f); + weston_matrix_translate(&animadata->transform.matrix, + 0.5f * usurf->width, 0.5f * usurf->height, 0); + + if ((es->output) && (es->buffer_ref.buffer)) { + weston_surface_geometry_dirty(es); + weston_surface_damage(es); + } + if (par >= 100) { + /* end of animation */ + animation_end(usurf, 1); + uifw_trace("animation_swing: End of animation"); + } + else { + /* continue animation */ + weston_compositor_schedule_repaint(weston_ec); + } +} + +/*--------------------------------------------------------------------------*/ +/** + * @brief animation_swing_end: swing animation end + * + * @param[in] animation weston animation table + * @return none + */ +/*--------------------------------------------------------------------------*/ +static void +animation_swing_end(struct weston_animation *animation) +{ + struct uifw_win_surface *usurf; + struct weston_surface *es; + + usurf = container_of(animation, struct uifw_win_surface, animation.animation); + if (usurf && usurf->surface) { + es = usurf->surface; + es->alpha = 1.0; + + if ((es->output) && (es->buffer_ref.buffer)) { + weston_surface_damage(es); + } + } +} + +/*--------------------------------------------------------------------------*/ +/** * @brief animation_fade: fade animation * * @param[in] animation weston animation table @@ -636,8 +943,8 @@ animation_fade(struct weston_animation *animation, if (es->alpha < 0.0) es->alpha = 0.0; else if (es->alpha > 1.0) es->alpha = 1.0; - uifw_trace("animation_fade: usurf=%08x count=%d %d%% alpha=%1.2f anima=%d state=%d", - (int)usurf, animation->frame_counter, par, es->alpha, + uifw_trace("animation_fade: %08x count=%d %d%% alpha=%1.2f anima=%d state=%d", + usurf->surfaceid, animation->frame_counter, par, es->alpha, usurf->animation.anima, usurf->animation.state); if ((es->output) && (es->buffer_ref.buffer) && @@ -764,8 +1071,8 @@ animation_zoom(struct weston_animation *animation, + (((float)usurf->width * scalex) - (float)usurf->width) / 2.0f; y = (((float)usurf->animation.pos_y) - ((float)usurf->y)) * fp + (float)usurf->y + (((float)usurf->height * scaley) - (float) usurf->height) / 2.0f; - uifw_trace("animation_zoom: usurf=%08x %d%% x=%d/%d y=%d/%d", - (int)usurf, par, x, usurf->x, y, usurf->y); + uifw_trace("animation_zoom: %08x %d%% x=%d/%d y=%d/%d", + usurf->surfaceid, par, x, usurf->x, y, usurf->y); uifw_trace("animation_zoom: sx=%4.2f sy=%4.2f x=%d->%d y=%d->%d cur=%d,%d", scalex, scaley, usurf->animation.pos_x, usurf->x, usurf->animation.pos_y, usurf->y, x, y); @@ -777,9 +1084,9 @@ animation_zoom(struct weston_animation *animation, weston_matrix_scale(&animadata->transform.matrix, scalex, scaley, 1.0f); weston_matrix_translate(&animadata->transform.matrix, 0.5f * usurf->width, 0.5f * usurf->height, 0); - - uifw_trace("animation_zoom: usurf=%08x count=%d %d%% w=%d/%d h=%d/%d anima=%d state=%d", - (int)usurf, animation->frame_counter, par, + + uifw_trace("animation_zoom: %08x count=%d %d%% w=%d/%d h=%d/%d anima=%d state=%d", + usurf->surfaceid, animation->frame_counter, par, (int)(usurf->width * scalex), usurf->width, (int)(usurf->height * scaley), usurf->height, usurf->animation.anima, usurf->animation.state); |