fix(style): use struct as color filter instead of pure callback for Micropython compatibility

This commit is contained in:
Gabor Kiss-Vamosi
2021-02-24 15:12:36 +01:00
parent d2d8f973b0
commit 8a7f9cb131
9 changed files with 58 additions and 39 deletions

View File

@@ -28,13 +28,13 @@ void lv_example_get_started_2(void)
/*Create a red style. Change only some colors.*/ /*Create a red style. Change only some colors.*/
lv_style_init(&style_btn_red); lv_style_init(&style_btn_red);
lv_style_set_bg_color(&style_btn_red, lv_color_red()); lv_style_set_bg_color(&style_btn_red, lv_color_light_blue());
lv_style_set_bg_grad_color(&style_btn_red, lv_color_red_darken_3()); lv_style_set_bg_grad_color(&style_btn_red, lv_color_light_blue_darken_3());
/*Create a style for the pressed state. Add color filter to make every color darker*/ /*Create a style for the pressed state. Add color filter to make every color darker*/
lv_style_init(&style_btn_pressed); lv_style_init(&style_btn_pressed);
lv_style_set_color_filter_cb(&style_btn_pressed, lv_color_darken); lv_style_set_bg_color(&style_btn_red, lv_color_blue());
lv_style_set_color_filter_opa(&style_btn_pressed, LV_OPA_30); lv_style_set_bg_grad_color(&style_btn_red, lv_color_blue_darken_3());
/*Create a button and use the new styles*/ /*Create a button and use the new styles*/
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/ lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/

View File

@@ -5,10 +5,10 @@ static void event_handler(lv_obj_t * obj, lv_event_t event)
{ {
LV_UNUSED(obj); LV_UNUSED(obj);
if(event == LV_EVENT_CLICKED) { if(event == LV_EVENT_CLICKED) {
LV_LOG_USER("Clicked\n"); LV_LOG_USER("Clicked");
} }
else if(event == LV_EVENT_VALUE_CHANGED) { else if(event == LV_EVENT_VALUE_CHANGED) {
LV_LOG_USER("Toggled\n"); LV_LOG_USER("Toggled");
} }
} }

View File

@@ -18,7 +18,7 @@ void lv_example_btn_2(void)
lv_style_set_bg_opa(&style, LV_OPA_70); lv_style_set_bg_opa(&style, LV_OPA_70);
lv_style_set_bg_color(&style, lv_color_blue()); lv_style_set_bg_color(&style, lv_color_blue());
lv_style_set_bg_grad_color(&style, lv_color_blue_darken_4()); lv_style_set_bg_grad_color(&style, lv_color_blue_darken_2());
lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_VER); lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_VER);
lv_style_set_border_opa(&style, LV_OPA_40); lv_style_set_border_opa(&style, LV_OPA_40);
@@ -27,16 +27,15 @@ void lv_example_btn_2(void)
lv_style_set_shadow_width(&style, 8); lv_style_set_shadow_width(&style, 8);
lv_style_set_shadow_color(&style, lv_color_grey()); lv_style_set_shadow_color(&style, lv_color_grey());
lv_style_set_shadow_ofs_x(&style, 8);
lv_style_set_shadow_ofs_y(&style, 8); lv_style_set_shadow_ofs_y(&style, 8);
lv_style_set_text_color(&style, lv_color_white()); lv_style_set_text_color(&style, lv_color_white());
/*Init the pressed style*/ /*Init the pressed style*/
lv_style_set_shadow_ofs_x(&style_pr, 4); lv_style_set_shadow_ofs_y(&style_pr, 3);
lv_style_set_shadow_ofs_y(&style_pr, 4); lv_style_set_bg_color(&style_pr, lv_color_blue_darken_2());
lv_style_set_color_filter_cb(&style_pr, lv_color_darken); /*Darken every color*/ lv_style_set_bg_grad_color(&style_pr, lv_color_blue_darken_4());
lv_style_set_color_filter_opa(&style_pr, LV_OPA_30);
lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL); lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_remove_style(btn1, LV_PART_ANY, LV_STATE_ANY, NULL); lv_obj_remove_style(btn1, LV_PART_ANY, LV_STATE_ANY, NULL);

View File

@@ -194,6 +194,12 @@ static bool inited;
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
static lv_color_t dark_color_filter_cb(const lv_color_filter_dsc_t * f, lv_color_t c, lv_opa_t opa)
{
LV_UNUSED(f);
return lv_color_darken(c, opa);
}
static void style_init(void) static void style_init(void)
{ {
static const lv_style_prop_t trans_props[] = { static const lv_style_prop_t trans_props[] = {
@@ -201,7 +207,7 @@ static void style_init(void)
LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT, LV_STYLE_TRANSFORM_WIDTH, LV_STYLE_TRANSFORM_HEIGHT,
LV_STYLE_TRANSFORM_ZOOM, LV_STYLE_TRANSFORM_ANGLE, LV_STYLE_TRANSFORM_ZOOM, LV_STYLE_TRANSFORM_ANGLE,
LV_STYLE_CONTENT_OFS_X, LV_STYLE_CONTENT_OFS_Y, LV_STYLE_CONTENT_OFS_X, LV_STYLE_CONTENT_OFS_Y,
LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_CB, LV_STYLE_COLOR_FILTER_OPA, LV_STYLE_COLOR_FILTER_DSC,
0 0
}; };
@@ -271,13 +277,17 @@ static void style_init(void)
lv_style_set_pad_column(&styles->btn, LV_DPX(5)); lv_style_set_pad_column(&styles->btn, LV_DPX(5));
lv_style_set_pad_row(&styles->btn, LV_DPX(5)); lv_style_set_pad_row(&styles->btn, LV_DPX(5));
static lv_color_filter_dsc_t dark_filter;
lv_color_filter_dsc_init(&dark_filter, dark_color_filter_cb);
style_init_reset(&styles->pressed); style_init_reset(&styles->pressed);
lv_style_set_color_filter_cb(&styles->pressed, lv_color_darken); lv_style_set_color_filter_dsc(&styles->pressed, &dark_filter);
lv_style_set_color_filter_opa(&styles->pressed, 35); lv_style_set_color_filter_opa(&styles->pressed, 35);
style_init_reset(&styles->disabled); style_init_reset(&styles->disabled);
lv_style_set_color_filter_cb(&styles->disabled, gray_filter); // lv_style_set_color_filter_dsc(&styles->disabled, gray_filter);
lv_style_set_color_filter_opa(&styles->disabled, LV_OPA_50); // lv_style_set_color_filter_opa(&styles->disabled, LV_OPA_50);
style_init_reset(&styles->clip_corner); style_init_reset(&styles->clip_corner);
lv_style_set_clip_corner(&styles->clip_corner, true); lv_style_set_clip_corner(&styles->clip_corner, true);

View File

@@ -548,10 +548,10 @@ static bool get_prop_core(const lv_obj_t * obj, uint8_t part, lv_style_prop_t pr
static lv_style_value_t apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v) static lv_style_value_t apply_color_filter(const lv_obj_t * obj, uint32_t part, lv_style_value_t v)
{ {
if(obj == NULL) return v; if(obj == NULL) return v;
lv_color_filter_cb_t f = lv_obj_get_style_color_filter_cb(obj, part); const lv_color_filter_dsc_t * f = lv_obj_get_style_color_filter_dsc(obj, part);
if(f) { if(f && f->filter_cb) {
lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part); lv_opa_t f_opa = lv_obj_get_style_color_filter_opa(obj, part);
if(f_opa != 0) v.color = f(v.color, f_opa); if(f_opa != 0) v.color = f->filter_cb(f, v.color, f_opa);
} }
return v; return v;
} }
@@ -640,11 +640,11 @@ static void update_cache(lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop)
if(v.ptr == NULL) list->cache_content_text_zero = 1; if(v.ptr == NULL) list->cache_content_text_zero = 1;
else list->cache_content_text_zero = 0; else list->cache_content_text_zero = 0;
} }
if(prop == LV_STYLE_PROP_ALL || prop == LV_STYLE_COLOR_FILTER_CB || prop == LV_STYLE_COLOR_FILTER_OPA) { if(prop == LV_STYLE_PROP_ALL || prop == LV_STYLE_COLOR_FILTER_DSC || prop == LV_STYLE_COLOR_FILTER_OPA) {
lv_style_value_t vf[2]; lv_style_value_t vf[2];
if(get_prop_core(obj, part, LV_STYLE_COLOR_FILTER_CB, &vf[0]) == false) vf[0].func = 0; if(get_prop_core(obj, part, LV_STYLE_COLOR_FILTER_DSC, &vf[0]) == false) vf[0].ptr = NULL;
if(get_prop_core(obj, part, LV_STYLE_COLOR_FILTER_OPA, &vf[1]) == false) vf[1].num = 0; if(get_prop_core(obj, part, LV_STYLE_COLOR_FILTER_OPA, &vf[1]) == false) vf[1].num = 0;
if(vf[0].func == NULL || vf[1].num == 0) list->cache_filter_zero = 1; if(vf[0].ptr == NULL || vf[1].num == 0) list->cache_filter_zero = 1;
else list->cache_filter_zero = 0; else list->cache_filter_zero = 0;
} }
@@ -737,7 +737,7 @@ static cache_t read_cache(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t
if(list->cache_content_text_zero ) return CACHE_ZERO; if(list->cache_content_text_zero ) return CACHE_ZERO;
else return CACHE_NEED_CHECK; else return CACHE_NEED_CHECK;
break; break;
case LV_STYLE_COLOR_FILTER_CB: case LV_STYLE_COLOR_FILTER_DSC:
case LV_STYLE_COLOR_FILTER_OPA: case LV_STYLE_COLOR_FILTER_OPA:
if(list->cache_filter_zero ) return CACHE_ZERO; if(list->cache_filter_zero ) return CACHE_ZERO;
else return CACHE_NEED_CHECK; else return CACHE_NEED_CHECK;
@@ -871,9 +871,9 @@ static void trans_anim_cb(void * _tr, int32_t v)
if(v < 255) value_final.ptr = tr->start_value.ptr; if(v < 255) value_final.ptr = tr->start_value.ptr;
else value_final.ptr = tr->end_value.ptr; else value_final.ptr = tr->end_value.ptr;
break; break;
case LV_STYLE_COLOR_FILTER_CB: case LV_STYLE_COLOR_FILTER_DSC:
if(tr->start_value.func == NULL) value_final.func = tr->end_value.func; if(tr->start_value.ptr == NULL) value_final.ptr = tr->end_value.ptr;
else if(tr->end_value.func == NULL) value_final.func = tr->start_value.func; else if(tr->end_value.ptr == NULL) value_final.ptr = tr->start_value.ptr;
else if(v < 128) value_final.ptr = tr->start_value.ptr; else if(v < 128) value_final.ptr = tr->start_value.ptr;
else value_final.ptr = tr->end_value.ptr; else value_final.ptr = tr->end_value.ptr;
break; break;
@@ -898,7 +898,7 @@ static void trans_anim_cb(void * _tr, int32_t v)
lv_style_value_t old_value; lv_style_value_t old_value;
bool refr = true; bool refr = true;
if(lv_style_get_prop(list->styles[i].style, tr->prop, &old_value)) { if(lv_style_get_prop(list->styles[i].style, tr->prop, &old_value)) {
if(value_final.ptr == old_value.ptr && value_final.func == old_value.func && value_final.color.full == old_value.color.full && value_final.num == old_value.num) { if(value_final.ptr == old_value.ptr && value_final.color.full == old_value.color.full && value_final.num == old_value.num) {
refr = false; refr = false;
} }
} }

View File

@@ -40,10 +40,10 @@ static inline lv_opa_t lv_obj_get_style_opa(const struct _lv_obj_t * obj, uint32
return (lv_opa_t)v.num; return (lv_opa_t)v.num;
} }
static inline lv_color_filter_cb_t lv_obj_get_style_color_filter_cb(const struct _lv_obj_t * obj, uint32_t part) static inline const lv_color_filter_dsc_t * lv_obj_get_style_color_filter_dsc(const struct _lv_obj_t * obj, uint32_t part)
{ {
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_CB); lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_COLOR_FILTER_DSC);
return (lv_color_filter_cb_t)v.func; return (const lv_color_filter_dsc_t *) v.ptr;
} }
static inline lv_opa_t lv_obj_get_style_color_filter_opa(const struct _lv_obj_t * obj, uint32_t part) static inline lv_opa_t lv_obj_get_style_color_filter_opa(const struct _lv_obj_t * obj, uint32_t part)
@@ -576,12 +576,12 @@ static inline void lv_obj_set_style_opa(struct _lv_obj_t * obj, uint32_t part, u
lv_obj_set_local_style_prop(obj, part, state, LV_STYLE_OPA, v); lv_obj_set_local_style_prop(obj, part, state, LV_STYLE_OPA, v);
} }
static inline void lv_obj_set_style_color_filter_cb(struct _lv_obj_t * obj, uint32_t part, uint32_t state, lv_color_filter_cb_t value) static inline void lv_obj_set_style_color_filter_dsc(struct _lv_obj_t * obj, uint32_t part, uint32_t state, const lv_color_filter_dsc_t * value)
{ {
lv_style_value_t v = { lv_style_value_t v = {
.func = (void (*)(void))value .ptr = (void *) value
}; };
lv_obj_set_local_style_prop(obj, part, state, LV_STYLE_COLOR_FILTER_CB, v); lv_obj_set_local_style_prop(obj, part, state, LV_STYLE_COLOR_FILTER_DSC, v);
} }
static inline void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, uint32_t part, uint32_t state, lv_opa_t value) static inline void lv_obj_set_style_color_filter_opa(struct _lv_obj_t * obj, uint32_t part, uint32_t state, lv_opa_t value)

View File

@@ -265,8 +265,14 @@ typedef struct {
typedef uint8_t lv_opa_t; typedef uint8_t lv_opa_t;
//! @endcond //! @endcond
struct _lv_color_filter_dsc_t;
typedef lv_color_t (*lv_color_filter_cb_t)(lv_color_t, lv_opa_t); typedef lv_color_t (*lv_color_filter_cb_t)(const struct _lv_color_filter_dsc_t *, lv_color_t, lv_opa_t);
typedef struct _lv_color_filter_dsc_t {
lv_color_filter_cb_t filter_cb;
void * user_data;
}lv_color_filter_dsc_t;
/********************** /**********************
* GLOBAL PROTOTYPES * GLOBAL PROTOTYPES
@@ -584,6 +590,11 @@ static inline lv_color_t lv_color_hex3(uint32_t c)
(uint8_t)((c & 0xF) | ((c & 0xF) << 4))); (uint8_t)((c & 0xF) | ((c & 0xF) << 4)));
} }
static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_color_filter_cb_t cb)
{
dsc->filter_cb = cb;
}
//! @cond Doxygen_Suppress //! @cond Doxygen_Suppress
//! //!
LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num); LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num);

View File

@@ -102,7 +102,6 @@ typedef union {
int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/ int32_t num; /**< Number integer number (opacity, enums, booleans or "normal" numbers)*/
const void * ptr; /**< Constant pointers (font, cone text, etc)*/ const void * ptr; /**< Constant pointers (font, cone text, etc)*/
lv_color_t color; /**< Colors */ lv_color_t color; /**< Colors */
void (* func)(void); /**< Function pointers */
}lv_style_value_t; }lv_style_value_t;
/** /**
@@ -120,7 +119,7 @@ typedef enum {
LV_STYLE_TRANSFORM_ANGLE = 6 | LV_STYLE_PROP_EXT_DRAW, LV_STYLE_TRANSFORM_ANGLE = 6 | LV_STYLE_PROP_EXT_DRAW,
LV_STYLE_OPA = 7 | LV_STYLE_PROP_INHERIT, LV_STYLE_OPA = 7 | LV_STYLE_PROP_INHERIT,
LV_STYLE_COLOR_FILTER_CB = 8, LV_STYLE_COLOR_FILTER_DSC = 8,
LV_STYLE_COLOR_FILTER_OPA = 9, LV_STYLE_COLOR_FILTER_OPA = 9,
LV_STYLE_ANIM_TIME = 10, LV_STYLE_ANIM_TIME = 10,
LV_STYLE_TRANSITION = 11, LV_STYLE_TRANSITION = 11,

View File

@@ -54,12 +54,12 @@ static inline void lv_style_set_opa(lv_style_t * style, lv_opa_t value)
lv_style_set_prop(style, LV_STYLE_OPA, v); lv_style_set_prop(style, LV_STYLE_OPA, v);
} }
static inline void lv_style_set_color_filter_cb(lv_style_t * style, lv_color_filter_cb_t value) static inline void lv_style_set_color_filter_dsc(lv_style_t * style, const lv_color_filter_dsc_t * value)
{ {
lv_style_value_t v = { lv_style_value_t v = {
.func = (void (*)(void))value .ptr = (void *)value
}; };
lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_CB, v); lv_style_set_prop(style, LV_STYLE_COLOR_FILTER_DSC, v);
} }
static inline void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value) static inline void lv_style_set_color_filter_opa(lv_style_t * style, lv_opa_t value)