From 6b756a6521f4ea1f4b24395f29edbfe9dc5fe8fa Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Tue, 14 Apr 2020 14:44:05 +0200 Subject: [PATCH] draw: fixes related to blend modes --- src/lv_draw/lv_draw_label.c | 27 +++++++++++++-------------- src/lv_draw/lv_draw_line.c | 2 +- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index 42eeb95ee..a7e7bf2ed 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -33,12 +33,11 @@ typedef uint8_t cmd_state_t; * STATIC PROTOTYPES **********************/ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area, const lv_font_t * font_p, - uint32_t letter, - lv_color_t color, lv_opa_t opa); + uint32_t letter, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode); static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, - const uint8_t * map_p, lv_color_t color, lv_opa_t opa); + const uint8_t * map_p, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode); static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, - const uint8_t * map_p, lv_color_t color, lv_opa_t opa); + const uint8_t * map_p, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode); static uint8_t hex_char_to_num(char hex); @@ -310,7 +309,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, lv_draw_lab } } - lv_draw_letter(&pos, mask, font, letter, color, opa); + lv_draw_letter(&pos, mask, font, letter, color, opa, dsc->blend_mode); if(letter_w > 0) { pos.x += letter_w + dsc->letter_space; @@ -386,7 +385,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, lv_draw_lab */ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area, const lv_font_t * font_p, uint32_t letter, - lv_color_t color, lv_opa_t opa) + lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode) { if(opa < LV_OPA_MIN) return; if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; @@ -429,16 +428,16 @@ static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area } if(font_p->subpx) { - draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa); + draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode); } else { - draw_letter_normal(pos_x, pos_y, &g, clip_area, map_p, color, opa); + draw_letter_normal(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode); } } static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, - const uint8_t * map_p, lv_color_t color, lv_opa_t opa) + const uint8_t * map_p, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode) { const uint8_t * bpp_opa_table_p; uint32_t bitmask_init; @@ -567,7 +566,7 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph else { lv_blend_fill(clip_area, &fill_area, color, mask_buf, LV_DRAW_MASK_RES_CHANGED, LV_OPA_COVER, - LV_BLEND_MODE_NORMAL); + blend_mode); fill_area.y1 = fill_area.y2 + 1; fill_area.y2 = fill_area.y1; @@ -584,7 +583,7 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph fill_area.y2--; lv_blend_fill(clip_area, &fill_area, color, mask_buf, LV_DRAW_MASK_RES_CHANGED, LV_OPA_COVER, - LV_BLEND_MODE_NORMAL); + blend_mode); mask_p = 0; } @@ -592,7 +591,7 @@ static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph } static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, - const uint8_t * map_p, lv_color_t color, lv_opa_t opa) + const uint8_t * map_p, lv_color_t color, lv_opa_t opa, lv_blend_mode_t blend_mode) { const uint8_t * bpp_opa_table; uint32_t bitmask_init; @@ -765,7 +764,7 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_ map_area.y2 ++; } else { - lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, LV_BLEND_MODE_NORMAL); + lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, blend_mode); map_area.y1 = map_area.y2 + 1; map_area.y2 = map_area.y1; @@ -784,7 +783,7 @@ static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_ /*Flush the last part*/ if(map_area.y1 != map_area.y2) { map_area.y2--; - lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, LV_BLEND_MODE_NORMAL); + lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, blend_mode); } lv_mem_buf_release(mask_buf); diff --git a/src/lv_draw/lv_draw_line.c b/src/lv_draw/lv_draw_line.c index 85ca52320..803bb3dd4 100644 --- a/src/lv_draw/lv_draw_line.c +++ b/src/lv_draw/lv_draw_line.c @@ -145,7 +145,7 @@ static void draw_line_hor(const lv_point_t * point1, const lv_point_t * point2, if(simple_mode) { lv_blend_fill(clip, &draw_area, dsc->color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, - LV_BLEND_MODE_NORMAL); + dsc->blend_mode); } /*If there other mask apply it*/ else {