diff --git a/src/draw/sw/blend/lv_draw_sw_blend.c b/src/draw/sw/blend/lv_draw_sw_blend.c index 52384c18c..3732a76c3 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.c +++ b/src/draw/sw/blend/lv_draw_sw_blend.c @@ -65,7 +65,7 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * blend_area.y1 - layer->buf_area.y1); if(fill_dsc.mask_buf) { - fill_dsc.mask_stride = lv_area_get_width(blend_dsc->mask_area); + fill_dsc.mask_stride = blend_dsc->mask_stride == 0 ? lv_area_get_width(blend_dsc->mask_area) : blend_dsc->mask_stride; fill_dsc.mask_buf += fill_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + (blend_area.x1 - blend_dsc->mask_area->x1); } diff --git a/src/draw/sw/blend/lv_draw_sw_blend.h b/src/draw/sw/blend/lv_draw_sw_blend.h index 9f8cd6c54..f6a4f7b05 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.h +++ b/src/draw/sw/blend/lv_draw_sw_blend.h @@ -40,6 +40,7 @@ typedef struct { const lv_opa_t * mask_buf; /**< NULL if ignored, or an alpha mask to apply on `blend_area`*/ lv_draw_sw_mask_res_t mask_res; /**< The result of the previous mask operation */ const lv_area_t * mask_area; /**< The area of `mask_buf` with absolute coordinates*/ + lv_coord_t mask_stride; lv_blend_mode_t blend_mode; /**< E.g. LV_BLEND_MODE_ADDITIVE*/ } lv_draw_sw_blend_dsc_t; diff --git a/src/draw/sw/lv_draw_sw_img.c b/src/draw/sw/lv_draw_sw_img.c index 01ae8954d..36aee15e0 100644 --- a/src/draw/sw/lv_draw_sw_img.c +++ b/src/draw/sw/lv_draw_sw_img.c @@ -244,6 +244,7 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t blend_dsc.mask_buf = (lv_opa_t *)src_buf; blend_dsc.mask_area = img_coords; + blend_dsc.mask_stride = img_stride; blend_dsc.src_buf = NULL; blend_dsc.color = draw_dsc->recolor; blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; @@ -258,6 +259,7 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t blend_dsc.src_buf = src_buf; blend_dsc.mask_buf = (lv_opa_t *)src_buf; blend_dsc.mask_buf += img_stride * src_w / header->w * src_h; + blend_dsc.mask_stride = src_w; blend_dsc.blend_area = img_coords; blend_dsc.mask_area = img_coords; blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; @@ -316,12 +318,14 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *Therefore the stride can be different. */ blend_dsc.src_stride = lv_draw_buf_width_to_stride(blend_w, LV_COLOR_FORMAT_RGB565); blend_dsc.mask_buf = tmp_buf_aligned + lv_draw_buf_width_to_stride(blend_w, LV_COLOR_FORMAT_RGB565) * buf_h; + blend_dsc.mask_stride = blend_w; blend_dsc.mask_area = &blend_area; blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; blend_dsc.src_color_format = LV_COLOR_FORMAT_RGB565; } else if(cf_final == LV_COLOR_FORMAT_A8) { blend_dsc.mask_buf = blend_dsc.src_buf; + blend_dsc.mask_stride = blend_w; blend_dsc.mask_area = &blend_area; blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED; blend_dsc.color = draw_dsc->recolor;