From e8d080917327462c6357c4217fbb872b20b2fe32 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Tue, 2 Nov 2021 11:03:13 -0500 Subject: [PATCH] fix(anim): add lv_anim_get_playtime (#2745) and migrate lv_anim_timeline_get_playtime to lv_anim_get_playtime Signed-off-by: Xiang Xiao --- src/misc/lv_anim.c | 21 +++++++++++++++++++++ src/misc/lv_anim.h | 16 +++++++++++++--- src/misc/lv_anim_timeline.c | 5 ++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/misc/lv_anim.c b/src/misc/lv_anim.c index 5ce55835c..e6b43b130 100644 --- a/src/misc/lv_anim.c +++ b/src/misc/lv_anim.c @@ -116,6 +116,27 @@ lv_anim_t * lv_anim_start(const lv_anim_t * a) return new_anim; } +uint32_t lv_anim_get_playtime(lv_anim_t * a) +{ + uint32_t playtime = LV_ANIM_PLAYTIME_INFINITE; + + if(a->repeat_cnt == LV_ANIM_REPEAT_INFINITE) + return playtime; + + playtime = a->time - a->act_time; + if(a->playback_now == 0) + playtime += a->playback_delay + a->playback_time; + + if(a->repeat_cnt <= 1) + return playtime; + + playtime += (a->repeat_delay + a->time + + a->playback_delay + a->playback_time) * + (a->repeat_cnt - 1); + + return playtime; +} + bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb) { lv_anim_t * a; diff --git a/src/misc/lv_anim.h b/src/misc/lv_anim.h index be538e00a..2b7307dbf 100644 --- a/src/misc/lv_anim.h +++ b/src/misc/lv_anim.h @@ -23,6 +23,12 @@ extern "C" { * DEFINES *********************/ +#define LV_ANIM_REPEAT_INFINITE 0xFFFF +#define LV_ANIM_PLAYTIME_INFINITE 0xFFFFFFFF + +LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); +LV_EXPORT_CONST_INT(LV_ANIM_PLAYTIME_INFINITE); + /********************** * TYPEDEFS **********************/ @@ -33,9 +39,6 @@ typedef enum { LV_ANIM_ON, } lv_anim_enable_t; -#define LV_ANIM_REPEAT_INFINITE 0xFFFF -LV_EXPORT_CONST_INT(LV_ANIM_REPEAT_INFINITE); - struct _lv_anim_t; /** Get the current value during an animation*/ @@ -300,6 +303,13 @@ static inline uint32_t lv_anim_get_delay(lv_anim_t * a) return -a->act_time; } +/** + * Get the time used to play the animation. + * @param a pointer to an animation. + * @return the play time in milliseconds. + */ +uint32_t lv_anim_get_playtime(lv_anim_t * a); + /** * Get the user_data field of the animation * @param a pointer to an initialized `lv_anim_t` variable diff --git a/src/misc/lv_anim_timeline.c b/src/misc/lv_anim_timeline.c index f55b0690a..cc7462006 100644 --- a/src/misc/lv_anim_timeline.c +++ b/src/misc/lv_anim_timeline.c @@ -169,7 +169,10 @@ uint32_t lv_anim_timeline_get_playtime(lv_anim_timeline_t * at) uint32_t playtime = 0; for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { - uint32_t end = at->anim_dsc[i].start_time + at->anim_dsc[i].anim.time; + uint32_t end = lv_anim_get_playtime(&at->anim_dsc[i].anim); + if (end == LV_ANIM_PLAYTIME_INFINITE) + return end; + end += at->anim_dsc[i].start_time; if(end > playtime) { playtime = end; }