From 6d15cb9698508fc3ae171213b865c71c0f4b2ee2 Mon Sep 17 00:00:00 2001 From: _VIFEXTech Date: Fri, 15 Oct 2021 20:17:27 +0800 Subject: [PATCH] fix(anim_timeline) avoid calling lv_anim_del(NULL, NULL) (#2628) * add anim_timeline Signed-off-by: FASTSHIFT * add anim_timeline Signed-off-by: FASTSHIFT * add lv_anim_timeline.c to lv_misc.mk Signed-off-by: FASTSHIFT * LV_ANIM_TIMELINE_END uses global variables to replace macros, lv_anim_timeline_set_progress() adds user_data, act_time uses int32_t type * solve the problem of uninitialized variable and act_time comparison * add LV_ANIM_TIMELINE_CUSTOM_EXEC option Signed-off-by: FASTSHIFT * add LV_ANIM_TIMELINE_CUSTOM_EXEC in lv_conf_internal.h * redesign lv_anim_timeline Signed-off-by: FASTSHIFT * add missing LV_USE_USER_DATA * remove set_progress, update doc * update workflow files * Remove lv_example_anim_timeline_2.c and LV_ANIM_TIMELINE_CUSTOM_EXEC, update lv_anim_timeline_1.c example Signed-off-by: FASTSHIFT * fix warning * fix(anim_timeline) heap use after free Signed-off-by: FASTSHIFT * fix(docs) wrong spelling of words in pictures * perf(anim_timeline) add lv_anim_timeline_stop() Signed-off-by: FASTSHIFT * fix(anim_timeline) avoid calling lv_anim_del(NULL, NULL) Signed-off-by: _VIFEXTech <1290176185@qq.com> * lv_anim_del replaces lv_anim_custom_del * fix(anim_timeline) avoid calling when a->exec_cb is NULL * fix(anim_timeline) add default var and virtual exec_cb Co-authored-by: Gabor Kiss-Vamosi --- src/misc/lv_anim_timeline.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/misc/lv_anim_timeline.c b/src/misc/lv_anim_timeline.c index e28223c8f..f55b0690a 100644 --- a/src/misc/lv_anim_timeline.c +++ b/src/misc/lv_anim_timeline.c @@ -34,6 +34,7 @@ struct _lv_anim_timeline_t { /********************** * STATIC PROTOTYPES **********************/ +static void lv_anim_timeline_virtual_exec_cb(void * var, int32_t v); /********************** * STATIC VARIABLES @@ -79,6 +80,12 @@ void lv_anim_timeline_add(lv_anim_timeline_t * at, uint32_t start_time, lv_anim_ at->anim_dsc[at->anim_dsc_cnt - 1].anim = *a; at->anim_dsc[at->anim_dsc_cnt - 1].start_time = start_time; + + /*Add default var and virtual exec_cb, used to delete animation.*/ + if(a->var == NULL && a->exec_cb == NULL) { + at->anim_dsc[at->anim_dsc_cnt - 1].anim.var = at; + at->anim_dsc[at->anim_dsc_cnt - 1].anim.exec_cb = lv_anim_timeline_virtual_exec_cb; + } } uint32_t lv_anim_timeline_start(lv_anim_timeline_t * at) @@ -114,7 +121,7 @@ void lv_anim_timeline_stop(lv_anim_timeline_t * at) for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { lv_anim_t * a = &(at->anim_dsc[i].anim); - lv_anim_custom_del(a, (lv_anim_custom_exec_cb_t)a->exec_cb); + lv_anim_del(a->var, a->exec_cb); } } @@ -133,6 +140,11 @@ void lv_anim_timeline_set_progress(lv_anim_timeline_t * at, uint16_t progress) for(uint32_t i = 0; i < at->anim_dsc_cnt; i++) { lv_anim_t * a = &(at->anim_dsc[i].anim); + + if(a->exec_cb == NULL) { + continue; + } + uint32_t start_time = at->anim_dsc[i].start_time; int32_t value = 0; @@ -171,3 +183,13 @@ bool lv_anim_timeline_get_reverse(lv_anim_timeline_t * at) LV_ASSERT_NULL(at); return at->reverse; } + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void lv_anim_timeline_virtual_exec_cb(void * var, int32_t v) +{ + LV_UNUSED(var); + LV_UNUSED(v); +}