From 73bc138b703202b53388a1f4a2b965b34412ea70 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 6 Aug 2018 15:22:46 +0200 Subject: [PATCH] opacity related bug fixes in draw functions --- lv_core/lv_refr.c | 7 +++---- lv_draw/lv_draw_rect.c | 2 +- lv_draw/lv_draw_vbasic.c | 9 +++++++++ lv_objx/lv_btn.c | 8 ++++---- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lv_core/lv_refr.c b/lv_core/lv_refr.c index d6bf90299..d9897647c 100644 --- a/lv_core/lv_refr.c +++ b/lv_core/lv_refr.c @@ -292,7 +292,6 @@ static void lv_refr_area_with_vdb(const lv_area_t * area_p) /*Round down the lines of VDB if rounding is added*/ if(round_cb) { - /**/ lv_area_t tmp; tmp.x1 = 0; tmp.x2 = 0; @@ -303,14 +302,14 @@ static void lv_refr_area_with_vdb(const lv_area_t * area_p) do { tmp.y2 = y_tmp; round_cb(&tmp); - y_tmp --; /*Decrement the number of line until it is rounded to a smaller value the original. */ - } while(tmp.y2 > max_row && y_tmp != 0); + y_tmp --; /*Decrement the number of line until it is rounded to a smaller (or equal) value then the original. */ + } while(lv_area_get_height(&tmp) > max_row && y_tmp != 0); if(y_tmp == 0) { LV_LOG_WARN("Can't set VDB height using the round function. (Wrong round_cb or to small VDB)"); return; } else { - max_row = tmp.y2; + max_row = tmp.y2 + 1; } } diff --git a/lv_draw/lv_draw_rect.c b/lv_draw/lv_draw_rect.c index 269999dcc..241a148c7 100644 --- a/lv_draw/lv_draw_rect.c +++ b/lv_draw/lv_draw_rect.c @@ -471,7 +471,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area lv_coord_t width = lv_area_get_width(coords); lv_coord_t height = lv_area_get_height(coords); uint16_t bwidth = style->body.border.width; - lv_opa_t opa = (uint16_t)((uint16_t) style->body.border.opa * opa_scale) >> 8; + lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.border.opa : (uint16_t)((uint16_t) style->body.border.opa * opa_scale) >> 8; lv_border_part_t part = style->body.border.part; lv_color_t color = style->body.border.color; lv_area_t work_area; diff --git a/lv_draw/lv_draw_vbasic.c b/lv_draw/lv_draw_vbasic.c index 2ba1d90e3..fad8a21e5 100644 --- a/lv_draw/lv_draw_vbasic.c +++ b/lv_draw/lv_draw_vbasic.c @@ -62,6 +62,8 @@ static void sw_color_fill(lv_area_t * mem_area, lv_color_t * mem, const lv_area_ */ void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) { + if(opa == LV_OPA_TRANSP) return; + lv_vdb_t * vdb_p = lv_vdb_get(); /*Pixel out of the mask*/ @@ -100,6 +102,8 @@ void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t col void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) { + if(opa == LV_OPA_TRANSP) return; + lv_area_t res_a; bool union_ok; lv_vdb_t * vdb_p = lv_vdb_get(); @@ -220,6 +224,9 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, 204, 221, 238, 255 }; + + if(opa == LV_OPA_TRANSP) return; + if(font_p == NULL) { LV_LOG_WARN("Font: character's bitmap not found"); return; @@ -357,6 +364,8 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_t recolor, lv_opa_t recolor_opa) { + if(opa == LV_OPA_TRANSP) return; + lv_area_t masked_a; bool union_ok; lv_vdb_t * vdb_p = lv_vdb_get(); diff --git a/lv_objx/lv_btn.c b/lv_objx/lv_btn.c index 409d2c123..2e400937c 100644 --- a/lv_objx/lv_btn.c +++ b/lv_objx/lv_btn.c @@ -389,14 +389,12 @@ static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode } else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_design(btn, mask, mode); #if USE_LV_ANIMATION if(btn != ink_obj) { - lv_style_t * style = lv_obj_get_style(btn); - lv_draw_rect(&btn->coords, mask, style, LV_OPA_COVER); + ancestor_design(btn, mask, mode); } else { - lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); lv_opa_t opa_scale = lv_obj_get_opa_scale(btn); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); /*Draw the normal button*/ lv_draw_rect(&btn->coords, mask, ext->styles[ink_bg_state], opa_scale); @@ -436,6 +434,8 @@ static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode /*Draw the circle*/ lv_draw_rect(&cir_area, mask, &cir_style, opa_scale); } +#else + ancestor_design(btn, mask, mode); #endif } else if(mode == LV_DESIGN_DRAW_POST) {