diff --git a/lv_conf_template.h b/lv_conf_template.h index 30a236a675..c37df27776 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -145,6 +145,12 @@ typedef void * lv_anim_user_data_t; /* 1: Enable shadow drawing*/ #define LV_USE_SHADOW 1 +/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`)*/ +#define LV_USE_BLEND_MODES 1 + +/* 1: Use the `opa_scale` style property to set the opacity of an object and its children at once*/ +#define LV_USE_OPA_SCALE 1 + /* 1: Enable object groups (for keyboard/encoder navigation) */ #define LV_USE_GROUP 1 #if LV_USE_GROUP diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 2f270fd82b..a70ac56ecd 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -1421,6 +1421,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + /*Get the transition time for the new state*/ lv_obj_state_dsc_t dsc_ori = obj->state_dsc; obj->state_dsc.act = new_state; obj->state_dsc.prev = new_state; @@ -1430,6 +1431,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) lv_style_int_t t = 0; #endif obj->state_dsc = dsc_ori; + if(t == 0) { #if LV_USE_ANIMATION lv_anim_del(obj, obj_state_anim_cb); @@ -2821,6 +2823,7 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t { draw_dsc->radius = lv_obj_get_style_radius(obj, part); +#if LV_USE_OPA_SCALE lv_opa_t opa_scale = lv_obj_get_style_opa_scale(obj, part); if(opa_scale <= LV_OPA_MIN) { draw_dsc->bg_opa = LV_OPA_TRANSP; @@ -2830,6 +2833,7 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->value_opa = LV_OPA_TRANSP; return; } +#endif if(draw_dsc->bg_opa != LV_OPA_TRANSP) { draw_dsc->bg_opa = lv_obj_get_style_bg_opa(obj, part); @@ -2841,7 +2845,10 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->bg_main_color_stop = lv_obj_get_style_bg_main_stop(obj, part); draw_dsc->bg_grad_color_stop = lv_obj_get_style_bg_grad_stop(obj, part); } + +#if LV_USE_BLEND_MODES draw_dsc->bg_blend_mode = lv_obj_get_style_bg_blend_mode(obj, part); +#endif } } @@ -2853,7 +2860,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); draw_dsc->border_color = lv_obj_get_style_border_color(obj, part); } +#if LV_USE_BLEND_MODES draw_dsc->border_blend_mode = lv_obj_get_style_border_blend_mode(obj, part); +#endif } } @@ -2866,7 +2875,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); draw_dsc->outline_color = lv_obj_get_style_outline_color(obj, part); } +#if LV_USE_BLEND_MODES draw_dsc->outline_blend_mode = lv_obj_get_style_outline_blend_mode(obj, part); +#endif } } @@ -2875,7 +2886,6 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t if(draw_dsc->pattern_image) { draw_dsc->pattern_opa = lv_obj_get_style_pattern_opa(obj, part); if(draw_dsc->pattern_opa > LV_OPA_MIN) { - draw_dsc->pattern_blend_mode = lv_obj_get_style_pattern_blend_mode(obj, part); draw_dsc->pattern_recolor_opa = lv_obj_get_style_pattern_recolor_opa(obj, part); draw_dsc->pattern_repeat = lv_obj_get_style_pattern_repeat(obj, part); if(lv_img_src_get_type(draw_dsc->pattern_image) == LV_IMG_SRC_SYMBOL) { @@ -2884,10 +2894,13 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t } else if(draw_dsc->pattern_recolor_opa > LV_OPA_MIN ) { draw_dsc->pattern_recolor = lv_obj_get_style_pattern_recolor(obj, part); } +#if LV_USE_BLEND_MODES + draw_dsc->pattern_blend_mode = lv_obj_get_style_pattern_blend_mode(obj, part); +#endif } } } - +#if LV_USE_SHADOW if(draw_dsc->shadow_opa > LV_OPA_MIN) { draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); if(draw_dsc->shadow_width) { @@ -2897,10 +2910,13 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->shadow_ofs_y = lv_obj_get_style_shadow_offset_y(obj, part); draw_dsc->shadow_spread = lv_obj_get_style_shadow_spread(obj, part); draw_dsc->shadow_color = lv_obj_get_style_shadow_color(obj, part); +#if LV_USE_BLEND_MODES draw_dsc->shadow_blend_mode = lv_obj_get_style_shadow_blend_mode(obj, part); +#endif } } } +#endif if(draw_dsc->value_opa > LV_OPA_MIN) { draw_dsc->value_str = lv_obj_get_style_value_str(obj, part); @@ -2914,11 +2930,14 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->value_letter_space = lv_obj_get_style_value_letter_space(obj, part); draw_dsc->value_line_space = lv_obj_get_style_value_line_space(obj, part); draw_dsc->value_align = lv_obj_get_style_value_align(obj, part); +#if LV_USE_BLEND_MODES draw_dsc->value_blend_mode = lv_obj_get_style_value_blend_mode(obj, part); +#endif } } } +#if LV_USE_OPA_SCALE if(opa_scale < LV_OPA_MAX) { draw_dsc->bg_opa = (uint16_t)((uint16_t)draw_dsc->bg_opa * opa_scale) >> 8; draw_dsc->border_opa = (uint16_t)((uint16_t)draw_dsc->border_opa * opa_scale) >> 8; @@ -2926,6 +2945,7 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t draw_dsc->pattern_opa = (uint16_t)((uint16_t)draw_dsc->pattern_opa * opa_scale) >> 8; draw_dsc->value_opa = (uint16_t)((uint16_t)draw_dsc->value_opa * opa_scale) >> 8; } +#endif } void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint8_t part, lv_draw_label_dsc_t * draw_dsc) @@ -2933,18 +2953,21 @@ void lv_obj_init_draw_label_dsc(lv_obj_t * obj, uint8_t part, lv_draw_label_dsc_ draw_dsc->opa = lv_obj_get_style_text_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; +#if LV_USE_OPA_SCALE lv_opa_t opa_scale = lv_obj_get_style_opa_scale(obj, part); if(opa_scale < LV_OPA_MAX) { draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa_scale) >> 8; } if(draw_dsc->opa <= LV_OPA_MIN) return; +#endif draw_dsc->color = lv_obj_get_style_text_color(obj, part); draw_dsc->letter_space = lv_obj_get_style_text_letter_space(obj, part); draw_dsc->line_space = lv_obj_get_style_text_line_space(obj, part); + draw_dsc->decor = lv_obj_get_style_text_decor(obj, part); +#if LV_USE_BLEND_MODES draw_dsc->blend_mode = lv_obj_get_style_text_blend_mode(obj, part); - draw_dsc->underline = lv_obj_get_style_text_underline(obj, part); - draw_dsc->strikethrough = lv_obj_get_style_text_strikethrough(obj, part); +#endif draw_dsc->font = lv_obj_get_style_text_font(obj, part); @@ -2958,11 +2981,14 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint8_t part, lv_draw_img_dsc_t * { draw_dsc->opa = lv_obj_get_style_image_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; + +#if LV_USE_OPA_SCALE lv_opa_t opa_scale = lv_obj_get_style_opa_scale(obj, part); if(opa_scale < LV_OPA_MAX) { draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa_scale) >> 8; } if(draw_dsc->opa <= LV_OPA_MIN) return; +#endif draw_dsc->angle = 0; draw_dsc->zoom = LV_IMG_ZOOM_NONE; @@ -2972,24 +2998,28 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint8_t part, lv_draw_img_dsc_t * draw_dsc->recolor_opa = lv_obj_get_style_image_recolor_opa(obj, part); draw_dsc->recolor = lv_obj_get_style_image_recolor(obj, part); +#if LV_USE_BLEND_MODES draw_dsc->blend_mode = lv_obj_get_style_image_blend_mode(obj, part); +#endif } void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t * draw_dsc) { draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; + +#if LV_USE_OPA_SCALE lv_opa_t opa_scale = lv_obj_get_style_opa_scale(obj, part); if(opa_scale < LV_OPA_MAX) { draw_dsc->opa = (uint16_t)((uint16_t)draw_dsc->opa * opa_scale) >> 8; } if(draw_dsc->opa <= LV_OPA_MIN) return; +#endif draw_dsc->width = lv_obj_get_style_line_width(obj, part); if(draw_dsc->width == 0) return; draw_dsc->color = lv_obj_get_style_line_color(obj, part); - draw_dsc->blend_mode = lv_obj_get_style_line_blend_mode(obj, part); draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); if(draw_dsc->dash_width) { @@ -2998,6 +3028,10 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t draw_dsc->round_start = lv_obj_get_style_line_rounded(obj, part); draw_dsc->round_end = draw_dsc->round_start; + +#if LV_USE_BLEND_MODES + draw_dsc->blend_mode = lv_obj_get_style_line_blend_mode(obj, part); +#endif } /** diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 9a3596482d..ab8a655134 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -1102,8 +1102,7 @@ _LV_OBJ_STYLE_SET_GET_DECLARE(VALUE_FONT, value_font, const lv_font_t * , _ptr); _LV_OBJ_STYLE_SET_GET_DECLARE(VALUE_STR, value_str, const char * , _ptr); _LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_LETTER_SPACE, text_letter_space, lv_style_int_t, _int); _LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_LINE_SPACE, text_line_space, lv_style_int_t, _int); -_LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_UNDERLINE, text_underline, bool, _int); -_LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_STRIKETHROUGH, text_strikethrough, bool, _int); +_LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_DECOR, text_decor, lv_text_decor_t, _int); _LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_BLEND_MODE, text_blend_mode, lv_blend_mode_t, _int); _LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_COLOR, text_color, lv_color_t, _color); _LV_OBJ_STYLE_SET_GET_DECLARE(TEXT_SEL_COLOR, text_sel_color, lv_color_t, _color); diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index 0d0f60e5cb..fdd907546e 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -30,6 +30,15 @@ LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); #define LV_DEBUG_STYLE_SENTINEL_VALUE 0x2288AAEE #define LV_DEBUG_STYLE_LIST_SENTINEL_VALUE 0x9977CCBB +#define LV_STYLE_PROP_INIT(name, group, id, attr) name = (((group << 4) + id) | ((attr) << 8)) + +#define LV_STYLE_ID_MASK 0x00FF + +#define LV_STYLE_ATTR_NONE 0 +#define LV_STYLE_ATTR_INHERIT (1 << 7) + +#define _LV_STYLE_CLOSEING_PROP 0xFF + /********************** * TYPEDEFS **********************/ @@ -43,6 +52,7 @@ enum { LV_BORDER_SIDE_RIGHT = 0x08, LV_BORDER_SIDE_FULL = 0x0F, LV_BORDER_SIDE_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ + _LV_BORDER_SIDE_LAST }; typedef uint8_t lv_border_side_t; @@ -50,18 +60,20 @@ enum { LV_GRAD_DIR_NONE, LV_GRAD_DIR_VER, LV_GRAD_DIR_HOR, + _LV_GRAD_DIR_LAST }; typedef uint8_t lv_grad_dir_t; -#define LV_STYLE_PROP_INIT(name, group, id, attr) name = (((group << 4) + id) | ((attr) << 8)) +/*Text decorations (Use 'OR'ed values)*/ +enum { + LV_TEXT_DECOR_NONE = 0x00, + LV_TEXT_DECOR_UNDERLINE = 0x01, + LV_TEXT_DECOR_STRIKETHROUGH = 0x02, + _LV_TEXT_DECOR_LAST +}; -#define LV_STYLE_ID_MASK 0x00FF - -#define LV_STYLE_ATTR_NONE 0 -#define LV_STYLE_ATTR_INHERIT (1 << 7) - -#define _LV_STYLE_CLOSEING_PROP 0xFF +typedef uint8_t lv_text_decor_t; typedef union { struct { @@ -139,9 +151,8 @@ enum { LV_STYLE_PROP_INIT(LV_STYLE_TEXT_LETTER_SPACE, 0x8, LV_STYLE_ID_VALUE + 0, LV_STYLE_ATTR_INHERIT), LV_STYLE_PROP_INIT(LV_STYLE_TEXT_LINE_SPACE, 0x8, LV_STYLE_ID_VALUE + 1, LV_STYLE_ATTR_INHERIT), - LV_STYLE_PROP_INIT(LV_STYLE_TEXT_UNDERLINE, 0x8, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_INHERIT), - LV_STYLE_PROP_INIT(LV_STYLE_TEXT_STRIKETHROUGH, 0x8, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_INHERIT), - LV_STYLE_PROP_INIT(LV_STYLE_TEXT_BLEND_MODE, 0x8, LV_STYLE_ID_VALUE + 4, LV_STYLE_ATTR_INHERIT), + LV_STYLE_PROP_INIT(LV_STYLE_TEXT_DECOR, 0x8, LV_STYLE_ID_VALUE + 2, LV_STYLE_ATTR_INHERIT), + LV_STYLE_PROP_INIT(LV_STYLE_TEXT_BLEND_MODE, 0x8, LV_STYLE_ID_VALUE + 3, LV_STYLE_ATTR_INHERIT), LV_STYLE_PROP_INIT(LV_STYLE_TEXT_COLOR, 0x8, LV_STYLE_ID_COLOR + 0, LV_STYLE_ATTR_INHERIT), LV_STYLE_PROP_INIT(LV_STYLE_TEXT_SEL_COLOR, 0x8, LV_STYLE_ID_COLOR + 1, LV_STYLE_ATTR_INHERIT), LV_STYLE_PROP_INIT(LV_STYLE_TEXT_OPA, 0x8, LV_STYLE_ID_OPA + 0, LV_STYLE_ATTR_INHERIT), diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index c52092cc0c..fb9e26381c 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -181,7 +181,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, lv_draw_lab } lv_draw_line_dsc_t line_dsc; - if(dsc->underline || dsc->strikethrough) { + if((dsc->decor & LV_TEXT_DECOR_UNDERLINE) || (dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH)) { lv_draw_line_dsc_init(&line_dsc); line_dsc.color = dsc->color; line_dsc.width = (dsc->font->line_height + 5) / 10; /*+5 for rounding*/ @@ -294,7 +294,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, lv_draw_lab } } - if(dsc->strikethrough) { + if(dsc->decor & LV_TEXT_DECOR_STRIKETHROUGH) { lv_point_t p1; lv_point_t p2; p1.x = pos_x_start; @@ -304,7 +304,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, lv_draw_lab lv_draw_line(&p1, &p2, mask, &line_dsc); } - if(dsc->underline) { + if(dsc->decor & LV_TEXT_DECOR_UNDERLINE) { lv_point_t p1; lv_point_t p2; p1.x = pos_x_start; diff --git a/src/lv_draw/lv_draw_label.h b/src/lv_draw/lv_draw_label.h index e9c5af3642..371f0df406 100644 --- a/src/lv_draw/lv_draw_label.h +++ b/src/lv_draw/lv_draw_label.h @@ -39,9 +39,10 @@ typedef struct { lv_coord_t ofs_y; lv_bidi_dir_t bidi_dir; lv_txt_flag_t flag; + lv_text_decor_t decor; +#if LV_USE_BLEND_MODES lv_blend_mode_t blend_mode; - uint8_t underline :1; - uint8_t strikethrough :1; +#endif }lv_draw_label_dsc_t; /** Store some info to speed up drawing of very large texts diff --git a/src/lv_draw/lv_draw_rect.h b/src/lv_draw/lv_draw_rect.h index 9bc7279385..11fead53b9 100644 --- a/src/lv_draw/lv_draw_rect.h +++ b/src/lv_draw/lv_draw_rect.h @@ -32,22 +32,28 @@ typedef struct { lv_grad_dir_t bg_grad_dir; lv_style_int_t bg_main_color_stop; lv_style_int_t bg_grad_color_stop; - lv_blend_mode_t bg_blend_mode; lv_opa_t bg_opa; +#if LV_USE_BLEND_MODES + lv_blend_mode_t bg_blend_mode; +#endif /*Border*/ lv_color_t border_color; lv_style_int_t border_width; - lv_blend_mode_t border_blend_mode; lv_style_int_t border_side; lv_opa_t border_opa; +#if LV_USE_BLEND_MODES + lv_blend_mode_t border_blend_mode; +#endif /*Outline*/ lv_color_t outline_color; lv_style_int_t outline_width; lv_style_int_t outline_pad; - lv_blend_mode_t outline_blend_mode; lv_opa_t outline_opa; +#if LV_USE_BLEND_MODES + lv_blend_mode_t outline_blend_mode; +#endif /*Shadow*/ lv_color_t shadow_color; @@ -55,17 +61,21 @@ typedef struct { lv_style_int_t shadow_ofs_x; lv_style_int_t shadow_ofs_y; lv_style_int_t shadow_spread; - lv_blend_mode_t shadow_blend_mode; lv_opa_t shadow_opa; +#if LV_USE_BLEND_MODES + lv_blend_mode_t shadow_blend_mode; +#endif /*Pattern*/ const void * pattern_image; const lv_font_t * pattern_font; - bool pattern_repeat; + lv_color_t pattern_recolor; lv_opa_t pattern_opa; lv_opa_t pattern_recolor_opa; - lv_color_t pattern_recolor; + uint8_t pattern_repeat :1; +#if LV_USE_BLEND_MODES lv_blend_mode_t pattern_blend_mode; +#endif /*Value*/ const char * value_str; @@ -77,7 +87,9 @@ typedef struct { lv_style_int_t value_letter_space; lv_style_int_t value_line_space; lv_align_t value_align; +#if LV_USE_BLEND_MODES lv_blend_mode_t value_blend_mode; +#endif }lv_draw_rect_dsc_t; /**********************