diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 0d3ec99dc..d95e18896 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -1626,13 +1626,13 @@ void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * cords_p) void lv_obj_get_inner_coords(const lv_obj_t * obj, lv_area_t * coords_p) { const lv_style_t * style = lv_obj_get_style(obj); - if(style->body.border.part & LV_BORDER_LEFT) coords_p->x1 += style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_LEFT) coords_p->x1 += style->body.border.width; - if(style->body.border.part & LV_BORDER_RIGHT) coords_p->x2 -= style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_RIGHT) coords_p->x2 -= style->body.border.width; - if(style->body.border.part & LV_BORDER_TOP) coords_p->y1 += style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_TOP) coords_p->y1 += style->body.border.width; - if(style->body.border.part & LV_BORDER_BOTTOM) coords_p->y2 -= style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_BOTTOM) coords_p->y2 -= style->body.border.width; } /** diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c index 07bda2fc9..45fd0bf05 100644 --- a/src/lv_core/lv_refr.c +++ b/src/lv_core/lv_refr.c @@ -217,7 +217,7 @@ void lv_disp_refr_task(lv_task_t * task) } } - lv_draw_free_buf(); + lv_draw_buf_free_all(); LV_LOG_TRACE("lv_refr_task: ready"); } diff --git a/src/lv_core/lv_style.c b/src/lv_core/lv_style.c index ebbf9a898..19a1b2a28 100644 --- a/src/lv_core/lv_style.c +++ b/src/lv_core/lv_style.c @@ -72,8 +72,11 @@ void lv_style_init(void) /*Screen style*/ lv_style_scr.glass = 0; lv_style_scr.body.opa = LV_OPA_COVER; - lv_style_scr.body.main_color = LV_COLOR_RED; + lv_style_scr.body.main_color = LV_COLOR_WHITE; lv_style_scr.body.grad_color = LV_COLOR_WHITE; + lv_style_scr.body.main_color_stop = 0; + lv_style_scr.body.grad_color_stop = 255; + lv_style_scr.body.grad_dir = LV_GRAD_DIR_VER; lv_style_scr.body.radius = 0; lv_style_scr.body.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.body.padding.left = 0; @@ -85,7 +88,7 @@ void lv_style_init(void) lv_style_scr.body.border.color = LV_COLOR_BLACK; lv_style_scr.body.border.opa = LV_OPA_COVER; lv_style_scr.body.border.width = 0; - lv_style_scr.body.border.part = LV_BORDER_FULL; + lv_style_scr.body.border.part = LV_BORDER_PART_FULL; lv_style_scr.body.border.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.body.shadow.color = LV_COLOR_GRAY; @@ -173,9 +176,12 @@ void lv_style_init(void) /*Button released style*/ lv_style_copy(&lv_style_btn_rel, &lv_style_plain); - lv_style_btn_rel.body.main_color = lv_color_make(0x76, 0xa2, 0xd0); - lv_style_btn_rel.body.grad_color = lv_color_make(0x19, 0x3a, 0x5d); - lv_style_btn_rel.body.radius = LV_DPI / 15; + lv_style_btn_rel.body.main_color = LV_COLOR_LIME;//lv_color_make(0x76, 0xa2, 0xd0); + lv_style_btn_rel.body.grad_color = LV_COLOR_BLUE;//lv_color_make(0x19, 0x3a, 0x5d); + lv_style_btn_rel.body.main_color_stop = 0x80;//0x10; + lv_style_btn_rel.body.grad_color_stop = 0xd0;//0x10; + lv_style_btn_rel.body.grad_dir = LV_GRAD_DIR_VER; + lv_style_btn_rel.body.radius = 15;//LV_DPI / 15; lv_style_btn_rel.body.opa = LV_OPA_COVER; // lv_style_btn_rel.body.blend_mode = LV_BLEND_MODE_ADDITIVE; lv_style_btn_rel.body.padding.left = LV_DPI / 4; @@ -184,15 +190,16 @@ void lv_style_init(void) lv_style_btn_rel.body.padding.bottom = LV_DPI / 6; lv_style_btn_rel.body.padding.inner = LV_DPI / 10; lv_style_btn_rel.body.border.color = lv_color_make(0x0b, 0x19, 0x28); - lv_style_btn_rel.body.border.width = LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1; + lv_style_btn_rel.body.border.width = 0;//LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1; lv_style_btn_rel.body.border.opa = LV_OPA_70; +// lv_style_btn_rel.body.border.part = LV_BORDER_PART_LEFT | LV_BORDER_PART_TOP; lv_style_btn_rel.body.shadow.color = LV_COLOR_BLACK; - lv_style_btn_rel.body.shadow.width = 0; - lv_style_btn_rel.body.shadow.spread = 0; + lv_style_btn_rel.body.shadow.width = 10; +// lv_style_btn_rel.body.shadow.spread = 5; // lv_style_btn_rel.body.shadow.blend_mode = LV_BLEND_MODE_SUBTRACTIVE; lv_style_btn_rel.body.shadow.opa = LV_OPA_COVER; - lv_style_btn_rel.body.shadow.offset.x = 0; - lv_style_btn_rel.body.shadow.offset.y = 0; + lv_style_btn_rel.body.shadow.offset.x = 10; + lv_style_btn_rel.body.shadow.offset.y = 20; lv_style_btn_rel.text.color = lv_color_make(0xff, 0xff, 0xff); lv_style_btn_rel.image.color = lv_color_make(0xff, 0xff, 0xff); diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index 94cca5d8b..551443e7d 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -31,16 +31,26 @@ extern "C" { /*Border types (Use 'OR'ed values)*/ enum { - LV_BORDER_NONE = 0x00, - LV_BORDER_BOTTOM = 0x01, - LV_BORDER_TOP = 0x02, - LV_BORDER_LEFT = 0x04, - LV_BORDER_RIGHT = 0x08, - LV_BORDER_FULL = 0x0F, - LV_BORDER_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ + LV_BORDER_PART_NONE = 0x00, + LV_BORDER_PART_BOTTOM = 0x01, + LV_BORDER_PART_TOP = 0x02, + LV_BORDER_PART_LEFT = 0x04, + LV_BORDER_PART_RIGHT = 0x08, + LV_BORDER_PART_FULL = 0x0F, + LV_BORDER_PART_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ }; typedef uint8_t lv_border_part_t; + + +enum { + LV_GRAD_DIR_NONE, + LV_GRAD_DIR_VER, + LV_GRAD_DIR_HOR, +}; + +typedef uint8_t lv_grad_dir_t; + /** * Styles can be assigned to objects - which holds information about * how the object should be drawn. @@ -59,7 +69,11 @@ typedef struct lv_color_t grad_color; /**< Second color. If not equal to `main_color` a gradient will be drawn for the background. */ lv_coord_t radius; /**< Object's corner radius. You can use #LV_RADIUS_CIRCLE if you want to draw a circle. */ lv_opa_t opa; /**< Object's opacity (0-255). */ + lv_opa_t main_color_stop; + lv_opa_t grad_color_stop; lv_blend_mode_t blend_mode :3; + lv_grad_dir_t grad_dir; + struct { diff --git a/src/lv_draw/lv_draw.c b/src/lv_draw/lv_draw.c index 0049d8c1f..1789a491e 100644 --- a/src/lv_draw/lv_draw.c +++ b/src/lv_draw/lv_draw.c @@ -35,7 +35,6 @@ /********************** * STATIC VARIABLES **********************/ -static uint32_t draw_buf_size = 0; /********************** * MACROS @@ -50,34 +49,63 @@ static uint32_t draw_buf_size = 0; * Be careful to not use the buffer while other processes are using it. * @param size the required size */ -void * lv_draw_get_buf(uint32_t size) +void * lv_draw_buf_get(uint32_t size) { - if(size <= draw_buf_size) return LV_GC_ROOT(_lv_draw_buf); - - LV_LOG_TRACE("lv_draw_get_buf: allocate"); - - draw_buf_size = size; - - if(LV_GC_ROOT(_lv_draw_buf) == NULL) { - LV_GC_ROOT(_lv_draw_buf) = lv_mem_alloc(size); - lv_mem_assert(LV_GC_ROOT(_lv_draw_buf)); - return LV_GC_ROOT(_lv_draw_buf); + /*Try to find a free buffer with suitable size */ + uint8_t i; + for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { + if(_lv_draw_buf[i].used == 0 && _lv_draw_buf[i].size >= size) { + _lv_draw_buf[i].used = 1; + return _lv_draw_buf[i].p; + } } - LV_GC_ROOT(_lv_draw_buf) = lv_mem_realloc(LV_GC_ROOT(_lv_draw_buf), size); - lv_mem_assert(LV_GC_ROOT(_lv_draw_buf)); - return LV_GC_ROOT(_lv_draw_buf); + /*Reallocate a free buffer*/ + for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { + if(_lv_draw_buf[i].used == 0) { + _lv_draw_buf[i].used = 1; + _lv_draw_buf[i].size = size; + _lv_draw_buf[i].p = lv_mem_realloc(_lv_draw_buf[i].p, size); + lv_mem_assert(_lv_draw_buf[i].p); + return _lv_draw_buf[i].p; + } + } + + LV_LOG_ERROR("lv_draw_buf_get: no free buffer. Increase LV_DRAW_BUF_MAX_NUM."); + + return NULL; } /** - * Free the draw buffer + * Release the draw buffer + * @param p buffer to release */ -void lv_draw_free_buf(void) +void lv_draw_buf_release(void * p) { - if(LV_GC_ROOT(_lv_draw_buf)) { - lv_mem_free(LV_GC_ROOT(_lv_draw_buf)); - LV_GC_ROOT(_lv_draw_buf) = NULL; - draw_buf_size = 0; + uint8_t i; + for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { + if(_lv_draw_buf[i].p == p) { + _lv_draw_buf[i].used = 0; + return; + } + } + + LV_LOG_ERROR("lv_draw_buf_release: p is not a known buffer") +} + +/** + * Free all draw buffers + */ +void lv_draw_buf_free_all(void) +{ + uint8_t i; + for(i = 0; i < LV_DRAW_BUF_MAX_NUM; i++) { + if(_lv_draw_buf[i].p) { + lv_mem_free(_lv_draw_buf[i].p); + _lv_draw_buf[i].p = NULL; + _lv_draw_buf[i].used = 0; + _lv_draw_buf[i].size = 0; + } } } diff --git a/src/lv_draw/lv_draw.h b/src/lv_draw/lv_draw.h index 1fe00b952..47583dabf 100644 --- a/src/lv_draw/lv_draw.h +++ b/src/lv_draw/lv_draw.h @@ -26,10 +26,16 @@ extern "C" { /********************* * DEFINES *********************/ +#define LV_DRAW_BUF_MAX_NUM 6 /********************** * TYPEDEFS **********************/ +typedef struct { + void * p; + uint16_t size; + uint8_t used :1; +}lv_draw_buf_t; /********************** * GLOBAL PROTOTYPES @@ -40,48 +46,19 @@ extern "C" { * Be careful to not use the buffer while other processes are using it. * @param size the required size */ -void * lv_draw_get_buf(uint32_t size); +void * lv_draw_buf_get(uint32_t size); /** - * Free the draw buffer + * Release the draw buffer + * @param p buffer to release */ -void lv_draw_free_buf(void); - -#if LV_ANTIALIAS +void lv_draw_buf_release(void * p); /** - * Get the opacity of a pixel based it's position in a line segment - * @param seg segment length - * @param px_id position of of a pixel which opacity should be get [0..seg-1] - * @param base_opa the base opacity - * @return the opacity of the given pixel + * Free all draw buffers */ -lv_opa_t lv_draw_aa_get_opa(lv_coord_t seg, lv_coord_t px_id, lv_opa_t base_opa); +void lv_draw_buf_free_all(void); -/** - * Add a vertical anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_ver_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa); - -/** - * Add a horizontal anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa); -#endif /********************** * GLOBAL VARIABLES diff --git a/src/lv_draw/lv_draw_img.c b/src/lv_draw/lv_draw_img.c index 057195fc4..3e58ccc59 100644 --- a/src/lv_draw/lv_draw_img.c +++ b/src/lv_draw/lv_draw_img.c @@ -510,7 +510,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas else { lv_coord_t width = lv_area_get_width(&mask_com); - uint8_t * buf = lv_draw_get_buf(lv_area_get_width(&mask_com) * ((LV_COLOR_DEPTH >> 3) + 1)); /*+1 because of the possible alpha byte*/ + uint8_t * buf = lv_draw_buf_get(lv_area_get_width(&mask_com) * ((LV_COLOR_DEPTH >> 3) + 1)); /*+1 because of the possible alpha byte*/ lv_area_t line; lv_area_copy(&line, &mask_com); @@ -524,6 +524,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas if(read_res != LV_RES_OK) { lv_img_decoder_close(&cdsc->dec_dsc); LV_LOG_WARN("Image draw can't read the line"); + lv_draw_buf_release(buf); return LV_RES_INV; } lv_draw_map(&line, mask, buf, opa, chroma_keyed, alpha_byte, style); @@ -531,6 +532,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas line.y2++; y++; } + lv_draw_buf_release(buf); } return LV_RES_OK; @@ -584,9 +586,12 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, /*The pixel size in byte is different if an alpha byte is added too*/ uint8_t px_size_byte = alpha_byte ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t); + + /*Build the image and a mask line-by-line*/ - lv_color_t map2[LV_HOR_RES_MAX]; - lv_opa_t mask_buf[LV_HOR_RES_MAX]; + uint32_t mask_buf_size = lv_area_get_size(&draw_area) > LV_HOR_RES_MAX ? lv_area_get_size(&draw_area) : LV_HOR_RES_MAX; + lv_color_t * map2 = lv_draw_buf_get(mask_buf_size * sizeof(lv_color_t)); + lv_opa_t * mask_buf = lv_draw_buf_get(mask_buf_size); /*Go to the first displayed pixel of the map*/ lv_coord_t map_w = lv_area_get_width(map_area); @@ -609,7 +614,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, /*Prepare the `mask_buf`if there are other masks*/ if(other_mask_cnt) { - memset(mask_buf, 0xFF, sizeof(mask_buf)); + memset(mask_buf, 0xFF, mask_buf_size); } lv_draw_mask_res_t mask_res; @@ -664,7 +669,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, } map_buf_tmp += map_w * px_size_byte; - if(px_i + lv_area_get_width(&draw_area) < sizeof(mask_buf)) { + if(px_i + lv_area_get_width(&draw_area) < mask_buf_size) { blend_area.y2 ++; } else { lv_blend_map(clip_area, &blend_area, map2, mask_buf, mask_res, opa, style->image.blend_mode); @@ -677,7 +682,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, /*Prepare the `mask_buf`if there are other masks*/ if(other_mask_cnt) { - memset(mask_buf, 0xFF, sizeof(mask_buf)); + memset(mask_buf, 0xFF, mask_buf_size); } } } @@ -687,6 +692,9 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, lv_blend_map(clip_area, &blend_area, map2, mask_buf, mask_res, opa, style->image.blend_mode); } + lv_draw_buf_release(mask_buf); + lv_draw_buf_release(map2); } + } diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index 635d76a96..12a8626c6 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -17,6 +17,7 @@ #define LABEL_RECOLOR_PAR_LENGTH 6 #define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ + /********************** * TYPEDEFS **********************/ @@ -290,7 +291,11 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area lv_font_glyph_dsc_t g; bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); if(g_ret == false) { - LV_LOG_WARN("lv_draw_letter: glyph dsc. not found"); + /* Add waring if the dsc is not found + * but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20) { + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found"); + } return; } @@ -335,9 +340,6 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area pos_y + g.box_h < clip_area->y1 || pos_y > clip_area->y2) return; - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - lv_coord_t col, row; uint8_t width_byte_scr = g.box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ @@ -359,7 +361,8 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area uint16_t col_bit; col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ - lv_opa_t mask_buf[LV_HOR_RES_MAX]; + uint32_t mask_buf_size = g.box_w * g.box_h > LV_HOR_RES_MAX ? g.box_w * g.box_h : LV_HOR_RES_MAX; + lv_opa_t * mask_buf = lv_draw_buf_get(mask_buf_size); lv_coord_t mask_p = 0; lv_coord_t mask_p_start; @@ -414,7 +417,7 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area } } - if(mask_p + (row_end - row_start) < sizeof(mask_buf)) { + if((uint32_t) mask_p + (row_end - row_start) < mask_buf_size) { fill_area.y2 ++; } else { lv_blend_fill(clip_area, &fill_area, @@ -440,6 +443,8 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area LV_BLEND_MODE_NORMAL); mask_p = 0; } + + lv_draw_buf_release(mask_buf); } diff --git a/src/lv_draw/lv_draw_mask.c b/src/lv_draw/lv_draw_mask.c index e1b111ba1..cfa702616 100644 --- a/src/lv_draw/lv_draw_mask.c +++ b/src/lv_draw/lv_draw_mask.c @@ -513,7 +513,7 @@ static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, if(p->inv) { k = xei - abs_x; - if(k > len) { + if(k >= len) { return LV_DRAW_MASK_RES_FULL_TRANSP; } if(k >= 0) memset(&mask_buf[0], 0x00, k); @@ -548,12 +548,11 @@ static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, if(p->inv) { k = xei - abs_x - 1; - if(k > len) k= len; - if(k == 0) return LV_DRAW_MASK_RES_FULL_TRANSP; - else if(k >= 0) memset(&mask_buf[0], 0x00, k); + if(k > len) k = len; + else if(k > 0) memset(&mask_buf[0], 0x00, k); } else { - if(k > len) return LV_DRAW_MASK_RES_FULL_TRANSP; + if(k > len) return LV_DRAW_MASK_RES_FULL_COVER; if(k >= 0) memset(&mask_buf[k] ,0x00, len - k); } diff --git a/src/lv_draw/lv_draw_rect.c b/src/lv_draw/lv_draw_rect.c index 025039bb8..4b860178b 100644 --- a/src/lv_draw/lv_draw_rect.c +++ b/src/lv_draw/lv_draw_rect.c @@ -28,6 +28,7 @@ **********************/ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); +static lv_color_t grad_get(const lv_style_t * style, lv_coord_t s, lv_coord_t i); static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t s, lv_coord_t r); static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_buf, uint16_t * sh_ups_buf); @@ -80,7 +81,6 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s if(is_common == false) return; const lv_area_t * disp_area = &vdb->area; - lv_color_t * disp_buf = vdb->buf_act; /* Now `draw_area` has absolute coordinates. * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ @@ -92,18 +92,25 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_coord_t draw_area_w = lv_area_get_width(&draw_area); /*Create a mask if there is a radius*/ - lv_opa_t mask_buf[LV_HOR_RES_MAX]; + lv_opa_t * mask_buf = lv_draw_buf_get(draw_area_w); + + bool simple_mode = true; + if(lv_draw_mask_get_cnt()!= 0) simple_mode = false; + else if(style->body.border.part != LV_BORDER_PART_FULL) simple_mode = false; + else if(style->body.grad_dir == LV_GRAD_DIR_HOR) simple_mode = false; - uint8_t other_mask_cnt = lv_draw_mask_get_cnt(); int16_t mask_rout_id = LV_MASK_ID_INV; + lv_coord_t coords_w = lv_area_get_width(coords); + lv_coord_t coords_h = lv_area_get_height(coords); + /*Get the real radius*/ lv_coord_t rout = style->body.radius; - lv_coord_t short_side = LV_MATH_MIN(lv_area_get_width(coords), lv_area_get_height(coords)); + lv_coord_t short_side = LV_MATH_MIN(coords_w, coords_h); if(rout > short_side >> 1) rout = short_side >> 1; /*Most simple case: just a plain rectangle*/ - if(other_mask_cnt == 0 && rout == 0 && style->body.main_color.full == style->body.grad_color.full) { + if(simple_mode && rout == 0 && style->body.main_color.full == style->body.grad_color.full) { lv_blend_fill(clip, coords, style->body.main_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, style->body.opa, style->body.blend_mode); @@ -117,12 +124,24 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); } - /*Draw the background line by line*/ - lv_coord_t h; - lv_draw_mask_res_t mask_res = LV_DRAW_MASK_RES_FULL_COVER; - lv_color_t grad_color = style->body.main_color; - if(opa >= LV_OPA_MIN) { + /*Draw the background line by line*/ + lv_coord_t h; + lv_draw_mask_res_t mask_res = LV_DRAW_MASK_RES_FULL_COVER; + lv_color_t grad_color = style->body.main_color; + + + lv_color_t * grad_map = NULL; + /*In case of horizontal gradient pre-compute a line with a gradient*/ + if(style->body.grad_dir == LV_GRAD_DIR_HOR && style->body.main_color.full != style->body.grad_color.full) { + grad_map = lv_draw_buf_get(coords_w * sizeof(lv_color_t)); + + lv_coord_t i; + for(i = 0; i < coords_w; i++) { + grad_map[i] = grad_get(style, coords_w, i); + } + } + lv_area_t fill_area; fill_area.x1 = coords->x1; fill_area.x2 = coords->x2; @@ -135,7 +154,7 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s if(y > coords->y1 + rout + 1 && y < coords->y2 - rout - 1) { mask_res = LV_DRAW_MASK_RES_FULL_COVER; - if(other_mask_cnt != 0) { + if(simple_mode == false) { memset(mask_buf, LV_OPA_COVER, draw_area_w); mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); } @@ -147,16 +166,15 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s } /*Get the current line color*/ - if(style->body.main_color.full != style->body.grad_color.full) { - lv_opa_t mix = (uint32_t)((uint32_t) (y - coords->y1) * 255) / lv_area_get_height(coords); - grad_color = lv_color_mix(style->body.grad_color, style->body.main_color, mix); + if(style->body.grad_dir == LV_GRAD_DIR_VER && style->body.main_color.full != style->body.grad_color.full) { + grad_color = grad_get(style, lv_area_get_height(coords), y - coords->y1); } /* If there is not other mask and drawing the corner area split the drawing to corner and middle areas * because it the middle mask shuldn't be taken into account (therefore its faster)*/ - if(other_mask_cnt == 0 && - (y < coords->y1 + rout + 1 || - y > coords->y2 - rout - 1)) { + if(simple_mode && + (y < coords->y1 + rout + 1 || + y > coords->y2 - rout - 1)) { /*Left part*/ lv_area_t fill_area2; @@ -184,12 +202,19 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_blend_fill(clip, &fill_area2, grad_color, mask_buf + mask_ofs, mask_res, style->body.opa, style->body.blend_mode); } else { - lv_blend_fill(clip, &fill_area, - grad_color,mask_buf, mask_res, style->body.opa, style->body.blend_mode); + if(grad_map == NULL) { + lv_blend_fill(clip, &fill_area, + grad_color,mask_buf, mask_res, opa, style->body.blend_mode); + } else { + lv_blend_map(clip, &fill_area, grad_map, mask_buf, mask_res, opa, style->body.blend_mode); + } + } fill_area.y1++; fill_area.y2++; } + + if(grad_map) lv_draw_buf_release(grad_map); } } @@ -209,10 +234,10 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s /*Get the inner area*/ lv_area_t area_small; lv_area_copy(&area_small, coords); - area_small.x1 += border_width; - area_small.x2 -= border_width; - area_small.y1 += border_width; - area_small.y2 -= border_width; + area_small.x1 += ((style->body.border.part & LV_BORDER_PART_LEFT) ? border_width : 0); + area_small.x2 -= ((style->body.border.part & LV_BORDER_PART_RIGHT) ? border_width : 0); + area_small.y1 += ((style->body.border.part & LV_BORDER_PART_TOP) ? border_width : 0); + area_small.y2 -= ((style->body.border.part & LV_BORDER_PART_BOTTOM) ? border_width : 0); /*Create the mask*/ lv_draw_mask_radius_init(&mask_rsmall_param, &area_small, rout - border_width, true); @@ -225,9 +250,10 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_area_t fill_area; /*Apply some optimization if there is no other mask*/ - if(other_mask_cnt == 0) { + if(simple_mode) { /*Draw the upper corner area*/ lv_coord_t upper_corner_end = coords->y1 - disp_area->y1 + corner_size; + fill_area.x1 = coords->x1; fill_area.x2 = coords->x2; fill_area.y1 = disp_area->y1 + draw_area.y1; @@ -237,15 +263,15 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); lv_area_t fill_area2; - fill_area2.x1 = coords->x1; - fill_area2.x2 = coords->x1 + rout - 1; fill_area2.y1 = fill_area.y1; fill_area2.y2 = fill_area.y2; + fill_area2.x1 = coords->x1; + fill_area2.x2 = coords->x1 + rout - 1; + lv_blend_fill(clip, &fill_area2, style->body.border.color, mask_buf, mask_res, style->body.border.opa, style->body.border.blend_mode); - if(fill_area2.y2 < coords->y1 + style->body.border.width) { fill_area2.x1 = coords->x1 + rout; fill_area2.x2 = coords->x2 - rout; @@ -253,6 +279,7 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s lv_blend_fill(clip, &fill_area2, style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, style->body.border.opa, style->body.border.blend_mode); } + fill_area2.x1 = coords->x2 - rout + 1; fill_area2.x2 = coords->x2; @@ -266,50 +293,52 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s } /*Draw the lower corner area corner area*/ - lv_coord_t lower_corner_end = coords->y2 - disp_area->y1 - corner_size; - if(lower_corner_end <= upper_corner_end) lower_corner_end = upper_corner_end + 1; - fill_area.y1 = disp_area->y1 + lower_corner_end; - fill_area.y2 = fill_area.y1; - for(h = lower_corner_end; h <= draw_area.y2; h++) { - memset(mask_buf, LV_OPA_COVER, draw_area_w); - mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + if(style->body.border.part & LV_BORDER_PART_BOTTOM) { + lv_coord_t lower_corner_end = coords->y2 - disp_area->y1 - corner_size; + if(lower_corner_end <= upper_corner_end) lower_corner_end = upper_corner_end + 1; + fill_area.y1 = disp_area->y1 + lower_corner_end; + fill_area.y2 = fill_area.y1; + for(h = lower_corner_end; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); - lv_area_t fill_area2; - fill_area2.x1 = coords->x1; - fill_area2.x2 = coords->x1 + rout - 1; - fill_area2.y1 = fill_area.y1; - fill_area2.y2 = fill_area.y2; - - lv_blend_fill(clip, &fill_area2, - style->body.border.color, mask_buf, mask_res, style->body.border.opa, style->body.border.blend_mode); - - - if(fill_area2.y2 > coords->y2 - style->body.border.width) { - fill_area2.x1 = coords->x1 + rout; - fill_area2.x2 = coords->x2 - rout; + lv_area_t fill_area2; + fill_area2.x1 = coords->x1; + fill_area2.x2 = coords->x1 + rout - 1; + fill_area2.y1 = fill_area.y1; + fill_area2.y2 = fill_area.y2; lv_blend_fill(clip, &fill_area2, - style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, style->body.border.opa, style->body.border.blend_mode); + style->body.border.color, mask_buf, mask_res, style->body.border.opa, style->body.border.blend_mode); + + + if(fill_area2.y2 > coords->y2 - style->body.border.width ) { + fill_area2.x1 = coords->x1 + rout; + fill_area2.x2 = coords->x2 - rout; + + lv_blend_fill(clip, &fill_area2, + style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, style->body.border.opa, style->body.border.blend_mode); + } + fill_area2.x1 = coords->x2 - rout + 1; + fill_area2.x2 = coords->x2; + + lv_coord_t mask_ofs = (coords->x2 - rout + 1) - (vdb->area.x1 + draw_area.x1); + if(mask_ofs < 0) mask_ofs = 0; + lv_blend_fill(clip, &fill_area2, + style->body.border.color, mask_buf + mask_ofs, mask_res, style->body.border.opa, style->body.border.blend_mode); + + + fill_area.y1++; + fill_area.y2++; } - fill_area2.x1 = coords->x2 - rout + 1; - fill_area2.x2 = coords->x2; - - lv_coord_t mask_ofs = (coords->x2 - rout + 1) - (vdb->area.x1 + draw_area.x1); - if(mask_ofs < 0) mask_ofs = 0; - lv_blend_fill(clip, &fill_area2, - style->body.border.color, mask_buf + mask_ofs, mask_res, style->body.border.opa, style->body.border.blend_mode); - - - fill_area.y1++; - fill_area.y2++; } /*Draw the left vertical border part*/ - fill_area.x1 = coords->x1; - fill_area.x2 = coords->x1 + border_width - 1; fill_area.y1 = coords->y1 + corner_size + 1; fill_area.y2 = coords->y2 - corner_size - 1; + fill_area.x1 = coords->x1; + fill_area.x2 = coords->x1 + border_width - 1; lv_blend_fill(clip, &fill_area, style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, style->body.border.opa, style->body.border.blend_mode); @@ -342,9 +371,24 @@ static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_s } lv_draw_mask_remove_id(mask_rout_id); + lv_draw_buf_release(mask_buf); } +static lv_color_t grad_get(const lv_style_t * style, lv_coord_t s, lv_coord_t i) +{ + lv_coord_t min = (style->body.main_color_stop * s) >> 8; + if(i <= min) return style->body.main_color; + + lv_coord_t max = (style->body.grad_color_stop * s) >> 8; + if(i >= max) return style->body.grad_color; + + lv_coord_t d = style->body.grad_color_stop - style->body.main_color_stop; + d = (s * d) >> 8; + i -= min; + lv_opa_t mix = (i * 255) / d; + return lv_color_mix(style->body.grad_color, style->body.main_color, mix); +} static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) { @@ -387,7 +431,6 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const if(is_common == false) return; const lv_area_t * disp_area = &vdb->area; - lv_color_t * disp_buf = vdb->buf_act; /* Now `draw_area` has absolute coordinates. * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ @@ -396,14 +439,11 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const draw_area.x2 -= disp_area->x1; draw_area.y2 -= disp_area->y1; - lv_coord_t draw_area_w = lv_area_get_width(&draw_area); - /*Get the real radius*/ lv_coord_t r_bg = style->body.radius; lv_coord_t short_side = LV_MATH_MIN(lv_area_get_width(coords), lv_area_get_height(coords)); if(r_bg > short_side >> 1) r_bg = short_side >> 1; - lv_coord_t r_sh = style->body.radius; short_side = LV_MATH_MIN(lv_area_get_width(&sh_rect_area), lv_area_get_height(&sh_rect_area)); if(r_sh > short_side >> 1) r_sh = short_side >> 1; @@ -423,7 +463,7 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const /*Create a mask*/ lv_draw_mask_res_t mask_res; - lv_opa_t mask_buf[LV_HOR_RES_MAX]; + lv_opa_t * mask_buf = lv_draw_buf_get(lv_area_get_width(&sh_rect_area)); lv_draw_mask_param_t mask_rout_param; lv_draw_mask_radius_init(&mask_rout_param, coords, r_bg, true); @@ -720,12 +760,11 @@ static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const } lv_draw_mask_remove_id(mask_rout_id); - + lv_draw_buf_release(mask_buf); } static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t sw, lv_coord_t r) { - lv_coord_t sw_ori = sw; lv_coord_t size = sw_ori + r; @@ -739,7 +778,6 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_draw_mask_param_t mask_param; lv_draw_mask_radius_init(&mask_param, &sh_area, r, false); -// int16_t mask_id = lv_draw_mask_add(lv_mask_radius, &mask_param, NULL); #if SHADOW_ENHANCE /*Set half shadow width width because blur will be repeated*/ @@ -751,8 +789,8 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_draw_mask_res_t mask_res; lv_coord_t y; - lv_opa_t mask_line[size]; - uint16_t sh_ups_buf[size*size]; + lv_opa_t * mask_line = lv_draw_buf_get(size); + uint16_t * sh_ups_buf = lv_draw_buf_get(size * size * sizeof(uint16_t)); uint16_t * sh_ups_tmp_buf = sh_ups_buf; for(y = 0; y < size; y++) { memset(mask_line, 0xFF, size); @@ -770,7 +808,7 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, sh_ups_tmp_buf += size; } - + lv_draw_buf_release(mask_line); // uint32_t k; // for(k = 0; k < size * size; k++) { @@ -778,22 +816,23 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, // } // return; - if(sw == 1) { lv_coord_t i; for(i = 0; i < size * size; i++) { sh_buf[i] = (sh_ups_buf[i] >> SHADOW_UPSACALE_SHIFT); } + lv_draw_buf_release(sh_ups_buf); return; } shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); - - #if SHADOW_ENHANCE sw = sw_ori - sw; - if(sw <= 1) return; + if(sw <= 1) { + lv_draw_buf_release(sh_ups_buf); + return; + } uint32_t i; sh_ups_buf[0] = (sh_buf[0] << SHADOW_UPSACALE_SHIFT) / sw; @@ -805,17 +844,18 @@ static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); #endif + lv_draw_buf_release(sh_ups_buf); + } static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_buf, uint16_t * sh_ups_buf) { - lv_coord_t s_left = sw >> 1; lv_coord_t s_right = (sw >> 1); if((sw & 1) == 0) s_left--; /*Horizontal blur*/ - uint16_t sh_ups_hor_buf[size*size]; + uint16_t * sh_ups_hor_buf = lv_draw_buf_get(size * size * sizeof(uint16_t)); uint16_t * sh_ups_hor_buf_tmp; lv_coord_t x; @@ -826,7 +866,7 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu for(y = 0; y < size; y++) { int32_t v = sh_ups_tmp_buf[size-1] * sw; - for(x = size; x >=0; x--) { + for(x = size - 1; x >=0; x--) { sh_ups_hor_buf_tmp[x] = v; /*Forget the right pixel*/ @@ -848,16 +888,18 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu /*Vertical blur*/ uint32_t i; sh_ups_hor_buf[0] = sh_ups_hor_buf[0] / sw; - for(i = 1; i < size * size; i++) { + for(i = 1; i < (uint32_t)size * size; i++) { if(sh_ups_hor_buf[i] == sh_ups_hor_buf[i-1]) sh_ups_hor_buf[i] = sh_ups_hor_buf[i-1]; else sh_ups_hor_buf[i] = sh_ups_hor_buf[i] / sw; } + + for(x = 0; x < size; x++) { sh_ups_hor_buf_tmp = &sh_ups_hor_buf[x]; lv_opa_t * sh_buf_tmp = &res_buf[x]; int32_t v = sh_ups_hor_buf_tmp[0] * sw; - for(y = 0; y < size; y++, sh_ups_hor_buf_tmp += size, sh_buf_tmp += size) { + for(y = 0; y < size ; y++, sh_ups_hor_buf_tmp += size, sh_buf_tmp += size) { sh_buf_tmp[0] = v < 0 ? 0 : (v >> SHADOW_UPSACALE_SHIFT); /*Forget the top pixel*/ @@ -873,5 +915,7 @@ static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_bu v += bottom_val; } } + + lv_draw_buf_release(sh_ups_hor_buf); } diff --git a/src/lv_draw/lv_img_decoder.c b/src/lv_draw/lv_img_decoder.c index 730739c16..82c231c2c 100644 --- a/src/lv_draw/lv_img_decoder.c +++ b/src/lv_draw/lv_img_decoder.c @@ -594,7 +594,7 @@ static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, l #if LV_USE_FILESYSTEM lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - uint8_t fs_buf[LV_HOR_RES_MAX]; + uint8_t * fs_buf = lv_draw_buf_get(w); #endif const uint8_t * data_tmp = NULL; @@ -629,6 +629,7 @@ static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, l } } + lv_draw_buf_release(fs_buf); return LV_RES_OK; #else @@ -681,7 +682,7 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_img_decoder_built_in_data_t * user_data = dsc->user_data; #if LV_USE_FILESYSTEM - uint8_t fs_buf[LV_HOR_RES_MAX]; + uint8_t * fs_buf = lv_draw_buf_get(w); #endif const uint8_t * data_tmp = NULL; if(dsc->src_type == LV_IMG_SRC_VARIABLE) { @@ -713,7 +714,7 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, data_tmp++; } } - + lv_draw_buf_release(fs_buf); return LV_RES_OK; #else LV_LOG_WARN("Image built-in indexed line reader failed because LV_IMG_CF_INDEXED is 0 in lv_conf.h"); diff --git a/src/lv_misc/lv_gc.h b/src/lv_misc/lv_gc.h index 0db9f5cb9..87d33d391 100644 --- a/src/lv_misc/lv_gc.h +++ b/src/lv_misc/lv_gc.h @@ -25,6 +25,7 @@ extern "C" { #include "lv_mem.h" #include "lv_ll.h" #include "../lv_draw/lv_img_cache.h" +#include "../lv_draw/lv_draw.h" /********************* * DEFINES @@ -41,7 +42,7 @@ extern "C" { prefix lv_ll_t _lv_img_defoder_ll; \ prefix lv_img_cache_entry_t * _lv_img_cache_array; \ prefix void * _lv_task_act; \ - prefix void * _lv_draw_buf; + prefix lv_draw_buf_t _lv_draw_buf[LV_DRAW_BUF_MAX_NUM]; \ #define LV_NO_PREFIX #define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX) diff --git a/src/lv_objx/lv_btnm.c b/src/lv_objx/lv_btnm.c index a84b8c473..fa3903fbc 100644 --- a/src/lv_objx/lv_btnm.c +++ b/src/lv_objx/lv_btnm.c @@ -660,22 +660,22 @@ static lv_design_res_t lv_btnm_design(lv_obj_t * btnm, const lv_area_t * clip_ar lv_style_copy(&style_tmp, btn_style); /*Remove borders on the edges if `LV_BORDER_INTERNAL`*/ - if(style_tmp.body.border.part & LV_BORDER_INTERNAL) { + if(style_tmp.body.border.part & LV_BORDER_PART_INTERNAL) { if(area_tmp.y1 == btnm->coords.y1 + bg_style->body.padding.top) { - style_tmp.body.border.part &= ~LV_BORDER_TOP; + style_tmp.body.border.part &= ~LV_BORDER_PART_TOP; } if(area_tmp.y2 == btnm->coords.y2 - bg_style->body.padding.bottom) { - style_tmp.body.border.part &= ~LV_BORDER_BOTTOM; + style_tmp.body.border.part &= ~LV_BORDER_PART_BOTTOM; } if(txt_i == 0) { - style_tmp.body.border.part &= ~LV_BORDER_LEFT; + style_tmp.body.border.part &= ~LV_BORDER_PART_LEFT; } else if(strcmp(ext->map_p[txt_i - 1], "\n") == 0) { - style_tmp.body.border.part &= ~LV_BORDER_LEFT; + style_tmp.body.border.part &= ~LV_BORDER_PART_LEFT; } if(ext->map_p[txt_i + 1][0] == '\0' || strcmp(ext->map_p[txt_i + 1], "\n") == 0) { - style_tmp.body.border.part &= ~LV_BORDER_RIGHT; + style_tmp.body.border.part &= ~LV_BORDER_PART_RIGHT; } } lv_draw_rect(&area_tmp, clip_area, &style_tmp, opa_scale); diff --git a/src/lv_objx/lv_line.c b/src/lv_objx/lv_line.c index 769b7e865..f958e3d60 100644 --- a/src/lv_objx/lv_line.c +++ b/src/lv_objx/lv_line.c @@ -217,8 +217,8 @@ static lv_design_res_t lv_line_design(lv_obj_t * line, const lv_area_t * clip_ar lv_opa_t opa_scale = lv_obj_get_opa_scale(line); lv_area_t area; lv_obj_get_coords(line, &area); - lv_coord_t x_ofs = area.x1; - lv_coord_t y_ofs = area.y1; + lv_coord_t x_ofs = area.x1;// - (style->line.width & 0x1); + lv_coord_t y_ofs = area.y1;// - (style->line.width & 0x1 ? 0 : 1); lv_point_t p1; lv_point_t p2; lv_coord_t h = lv_obj_get_height(line); @@ -227,8 +227,8 @@ static lv_design_res_t lv_line_design(lv_obj_t * line, const lv_area_t * clip_ar lv_style_t circle_style_tmp; /*If rounded...*/ lv_style_copy(&circle_style_tmp, style); circle_style_tmp.body.radius = LV_RADIUS_CIRCLE; - circle_style_tmp.body.main_color = style->line.color; - circle_style_tmp.body.grad_color = style->line.color; + circle_style_tmp.body.main_color = style->line.color;//LV_COLOR_RED;//style->line.color; + circle_style_tmp.body.grad_color = style->line.color;//LV_COLOR_RED;//style->line.color; circle_style_tmp.body.opa = style->line.opa; lv_area_t circle_area; @@ -249,20 +249,22 @@ static lv_design_res_t lv_line_design(lv_obj_t * line, const lv_area_t * clip_ar /*Draw circle on the joints if enabled*/ if(style->line.rounded) { - circle_area.x1 = p1.x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.y1 = p1.y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.x2 = p1.x + ((style->line.width - 1) >> 1); - circle_area.y2 = p1.y + ((style->line.width - 1) >> 1); + lv_coord_t r = (style->line.width >> 1); + circle_area.x1 = p1.x - r; + circle_area.y1 = p1.y - r; + circle_area.x2 = p1.x + r - 1; + circle_area.y2 = p1.y + r - 1; lv_draw_rect(&circle_area, clip_area, &circle_style_tmp, opa_scale); } } /*Draw circle on the last point too if enabled*/ if(style->line.rounded) { - circle_area.x1 = p2.x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.y1 = p2.y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.x2 = p2.x + ((style->line.width - 1) >> 1); - circle_area.y2 = p2.y + ((style->line.width - 1) >> 1); + lv_coord_t r = (style->line.width >> 1) - 1; + circle_area.x1 = p2.x - r - 1; + circle_area.y1 = p2.y - r - 1; + circle_area.x2 = p2.x + r; + circle_area.y2 = p2.y + r; lv_draw_rect(&circle_area, clip_area, &circle_style_tmp, opa_scale); } } diff --git a/src/lv_objx/lv_objmask.c b/src/lv_objx/lv_objmask.c index 62db5a333..d9d6a791c 100644 --- a/src/lv_objx/lv_objmask.c +++ b/src/lv_objx/lv_objmask.c @@ -69,7 +69,7 @@ lv_obj_t * lv_objmask_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new object mask object mask*/ if(copy == NULL) { - lv_objmask_set_style(new_objmask, LV_OBJMASK_STYLE_BG, &lv_style_transp); + lv_objmask_set_style(new_objmask, LV_OBJMASK_STYLE_BG, &lv_style_plain); } /*Copy an existing object mask*/ diff --git a/src/lv_themes/lv_theme_alien.c b/src/lv_themes/lv_theme_alien.c index 8dc852826..b2d320264 100644 --- a/src/lv_themes/lv_theme_alien.c +++ b/src/lv_themes/lv_theme_alien.c @@ -823,7 +823,7 @@ static void win_init(void) header.body.border.opa = panel.body.border.opa; header.body.border.width = panel.body.border.width; header.body.border.color = lv_color_hsv_to_rgb(_hue, 20, 80); - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.text.color = lv_color_hsv_to_rgb(_hue, 5, 100); header.image.color = lv_color_hsv_to_rgb(_hue, 5, 100); diff --git a/src/lv_themes/lv_theme_material.c b/src/lv_themes/lv_theme_material.c index dc34cf8b4..5cb57f287 100644 --- a/src/lv_themes/lv_theme_material.c +++ b/src/lv_themes/lv_theme_material.c @@ -378,7 +378,7 @@ static void calendar_init(void) week_box.body.padding.right = theme.style.panel->body.padding.right; week_box.body.border.color = theme.style.panel->body.border.color; week_box.body.border.width = theme.style.panel->body.border.width; - week_box.body.border.part = LV_BORDER_LEFT | LV_BORDER_RIGHT; + week_box.body.border.part = LV_BORDER_PART_LEFT | LV_BORDER_PART_RIGHT; week_box.body.radius = 0; static lv_style_t today_box; @@ -445,7 +445,7 @@ static void btnm_init(void) bg.text.color = lv_color_hex3(0x555); lv_style_copy(&rel, theme.style.panel); - rel.body.border.part = LV_BORDER_FULL | LV_BORDER_INTERNAL; + rel.body.border.part = LV_BORDER_PART_FULL | LV_BORDER_PART_INTERNAL; rel.body.border.width = 1; rel.body.border.color = lv_color_hex3(0xbbb); rel.body.opa = LV_OPA_TRANSP; @@ -536,7 +536,7 @@ static void ta_init(void) lv_style_copy(&oneline, &def); oneline.body.opa = LV_OPA_TRANSP; oneline.body.radius = 0; - oneline.body.border.part = LV_BORDER_BOTTOM; + oneline.body.border.part = LV_BORDER_PART_BOTTOM; oneline.body.border.width = 3; oneline.body.border.color = lv_color_hex3(0x333); oneline.body.border.opa = LV_OPA_COVER; @@ -579,7 +579,7 @@ static void list_init(void) rel.body.radius = 10; rel.body.border.color = lv_color_hex3(0xbbb); rel.body.border.width = 1; - rel.body.border.part = LV_BORDER_BOTTOM; + rel.body.border.part = LV_BORDER_PART_BOTTOM; lv_style_copy(&pr, &rel); pr.glass = 0; @@ -679,7 +679,7 @@ static void tabview_init(void) btn_bg.body.radius = 0; btn_bg.body.border.width = 1; btn_bg.body.border.color = lv_color_hex3(0x888); - btn_bg.body.border.part = LV_BORDER_BOTTOM; + btn_bg.body.border.part = LV_BORDER_PART_BOTTOM; btn_bg.body.border.opa = LV_OPA_COVER; btn_bg.body.shadow.width = 5; btn_bg.body.shadow.color = DEF_SHADOW_COLOR; @@ -703,7 +703,7 @@ static void tabview_init(void) pr.body.radius = 0; pr.body.border.width = 1; pr.body.border.color = lv_color_hex3(0x888); - pr.body.border.part = LV_BORDER_BOTTOM; + pr.body.border.part = LV_BORDER_PART_BOTTOM; pr.body.border.opa = LV_OPA_COVER; pr.text.color = lv_color_hex3(0x111); @@ -767,7 +767,7 @@ static void win_init(void) header.body.radius = 0; header.body.border.width = 1; header.body.border.color = lv_color_hex3(0xbbb); - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.body.border.opa = LV_OPA_COVER; header.body.padding.inner = 0; header.body.padding.left = 0; diff --git a/src/lv_themes/lv_theme_mono.c b/src/lv_themes/lv_theme_mono.c index ad0164fca..6056097ec 100644 --- a/src/lv_themes/lv_theme_mono.c +++ b/src/lv_themes/lv_theme_mono.c @@ -61,7 +61,7 @@ static void basic_init(void) def.body.border.color = LV_COLOR_BLACK; def.body.border.width = 1; def.body.border.opa = LV_OPA_COVER; - def.body.border.part = LV_BORDER_FULL; + def.body.border.part = LV_BORDER_PART_FULL; def.text.font = _font; def.text.color = LV_COLOR_BLACK; diff --git a/src/lv_themes/lv_theme_night.c b/src/lv_themes/lv_theme_night.c index 9c14b3532..653742de5 100644 --- a/src/lv_themes/lv_theme_night.c +++ b/src/lv_themes/lv_theme_night.c @@ -456,7 +456,7 @@ static void btnm_init(void) btnm_bg.body.border.width = 1; lv_style_copy(&rel, theme.style.btn.rel); - rel.body.border.part = LV_BORDER_FULL | LV_BORDER_INTERNAL; + rel.body.border.part = LV_BORDER_PART_FULL | LV_BORDER_PART_INTERNAL; rel.body.border.width = 1; rel.body.radius = 2; @@ -571,7 +571,7 @@ static void list_init(void) lv_style_copy(&list_btn_rel, &bg); list_btn_rel.body.opa = LV_OPA_TRANSP; - list_btn_rel.body.border.part = LV_BORDER_BOTTOM; + list_btn_rel.body.border.part = LV_BORDER_PART_BOTTOM; list_btn_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 5); list_btn_rel.body.border.width = 1; list_btn_rel.body.radius = LV_DPI / 10; diff --git a/src/lv_themes/lv_theme_zen.c b/src/lv_themes/lv_theme_zen.c index 55569993d..879dfc7fb 100644 --- a/src/lv_themes/lv_theme_zen.c +++ b/src/lv_themes/lv_theme_zen.c @@ -681,7 +681,7 @@ static void tabview_init(void) lv_style_copy(&btn_bg, &def); btn_bg.body.opa = LV_OPA_TRANSP; btn_bg.body.border.width = 2; - btn_bg.body.border.part = LV_BORDER_BOTTOM; + btn_bg.body.border.part = LV_BORDER_PART_BOTTOM; btn_bg.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 90); lv_style_copy(&indic, &def); @@ -750,7 +750,7 @@ static void win_init(void) lv_style_copy(&header, &def); header.body.opa = LV_OPA_TRANSP; header.body.border.width = 2; - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 90); header.text.color = lv_color_hex3(0x666); header.image.color = lv_color_hex3(0x666);