From ad567a15a22101f0f8398faa537253fab5499ae1 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 5 Nov 2018 14:22:12 +0900 Subject: [PATCH] elementary transit: fix wrong pausing time calculation. Summary: the logic of computation of pausing time was incorrect. even it didn't take care of revert_mode at all. delayed time must be subtracted from elapsed time. @fix Reviewers: #committers Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7201 --- src/lib/elementary/elm_transit.c | 50 +++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/lib/elementary/elm_transit.c b/src/lib/elementary/elm_transit.c index f981dfe99c..a38d785139 100644 --- a/src/lib/elementary/elm_transit.c +++ b/src/lib/elementary/elm_transit.c @@ -50,6 +50,8 @@ struct _Elm_Transit double current; double revert_start; double revert_elapsed; + double revert_paused; + double revert_delayed; } time; struct { @@ -334,12 +336,14 @@ _transit_animate_cb(void *data) double elapsed_time, duration, revert_progress; transit->time.current = ecore_loop_time_get(); - elapsed_time = transit->time.current - transit->time.begin - 2 * transit->total_revert_time; - duration = transit->time.duration + transit->time.delayed; + elapsed_time = (transit->time.current - transit->time.begin - transit->time.delayed) + - (2 * transit->total_revert_time); + duration = transit->time.duration; if (elapsed_time > duration) elapsed_time = duration; transit->progress = elapsed_time / duration; + if (transit->revert_mode && transit->revert_begin_progress == 0) { transit->revert_begin_progress = transit->progress; @@ -348,7 +352,8 @@ _transit_animate_cb(void *data) if (transit->revert_mode) { - transit->time.revert_elapsed = transit->time.current - transit->time.revert_start; + transit->time.revert_elapsed = + (transit->time.current - transit->time.revert_start - transit->time.revert_delayed); revert_progress = transit->time.revert_elapsed / duration; transit->progress = transit->revert_begin_progress - revert_progress; } @@ -405,7 +410,7 @@ _transit_animate_cb(void *data) /* Reverse? */ if (transit->repeat.reverse) transit->progress = 1 - transit->progress; - if (transit->time.duration > 0) + if (duration > 0) { if (!_transit_animate_op(transit, transit->progress)) return ECORE_CALLBACK_CANCEL; @@ -415,6 +420,7 @@ _transit_animate_cb(void *data) { transit->revert_mode = EINA_FALSE; transit->time.begin = ecore_loop_time_get(); + transit->time.revert_delayed = 0; transit->total_revert_time = 0; if ((transit->repeat.count >= 0) && (transit->repeat.current == transit->repeat.count) && @@ -450,6 +456,7 @@ _transit_animate_cb(void *data) else transit->repeat.reverse = EINA_TRUE; transit->time.begin = ecore_loop_time_get(); + transit->time.delayed = 0; transit->total_revert_time = 0; return ECORE_CALLBACK_RENEW; @@ -561,7 +568,6 @@ elm_transit_add(void) transit->v[0] = 1.0; transit->v[1] = 0.0; - transit->revert_mode = EINA_FALSE; transit->smooth = EINA_TRUE; return transit; @@ -863,6 +869,8 @@ elm_transit_go(Elm_Transit *transit) transit->time.paused = 0; transit->time.delayed = 0; + transit->time.revert_paused = 0; + transit->time.revert_delayed = 0; transit->total_revert_time = 0; transit->revert_mode = EINA_FALSE; transit->time.begin = ecore_loop_time_get(); @@ -894,18 +902,34 @@ elm_transit_paused_set(Elm_Transit *transit, Eina_Bool paused) if (paused) { - if (transit->time.paused > 0) - return; + if (transit->revert_mode) + { + if (transit->time.revert_paused > 0)return; + transit->time.revert_paused = ecore_loop_time_get(); + } + else + { + if (transit->time.paused > 0)return; + transit->time.paused = ecore_loop_time_get(); + } ecore_animator_freeze(transit->animator); - transit->time.paused = ecore_loop_time_get(); } else { - if (transit->time.paused == 0) - return; - ecore_animator_thaw(transit->animator); - transit->time.delayed += (ecore_loop_time_get() - transit->time.paused); - transit->time.paused = 0; + if (transit->revert_mode) + { + if (transit->time.revert_paused == 0) return; + ecore_animator_thaw(transit->animator); + transit->time.revert_delayed += (ecore_loop_time_get() - transit->time.revert_paused); + transit->time.revert_paused = 0; + } + else + { + if (transit->time.paused == 0) return; + ecore_animator_thaw(transit->animator); + transit->time.delayed += (ecore_loop_time_get() - transit->time.paused); + transit->time.paused = 0; + } } }