diff --git a/src/lv_objx/lv_canvas.c b/src/lv_objx/lv_canvas.c index 51cc2a6c6..a43d1f2db 100644 --- a/src/lv_objx/lv_canvas.c +++ b/src/lv_objx/lv_canvas.c @@ -491,6 +491,7 @@ void lv_canvas_blur_ver(lv_obj_t * canvas, uint16_t r) if((r & 0x1) == 0) r_back--; + bool has_alpha = lv_img_cf_has_alpha(ext->dsc.header.cf); lv_coord_t col_w = lv_img_buf_get_img_size(1, ext->dsc.header.h, ext->dsc.header.cf); uint8_t * col_buf = lv_draw_buf_get(col_w); lv_img_dsc_t line_img; @@ -512,38 +513,41 @@ void lv_canvas_blur_ver(lv_obj_t * canvas, uint16_t r) uint32_t bsum = 0; lv_color_t c; - lv_opa_t opa = LV_OPA_TRANSP; + lv_opa_t opa = LV_OPA_COVER; for(y = -r_back; y <= r_front; y++) { y_safe = y < 0 ? 0 : y; c = lv_img_buf_get_px_color(&ext->dsc, x, y_safe, style->image.color, false); - opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe, false); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe, false); lv_img_buf_set_px_color(&line_img, 0, y_safe, c, false); - lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa, false); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa, false); rsum += c.ch.red; gsum += c.ch.green; bsum += c.ch.blue; - asum += opa; + if(has_alpha) asum += opa; } + /*Just to indicate that the px is visible*/ + if(has_alpha == false) asum = LV_OPA_COVER; + for(y = 0; y < ext->dsc.header.h; y++) { if(asum) { c.ch.red = rsum / r; c.ch.green = gsum / r; c.ch.blue = bsum / r; - opa = asum / r; + if(has_alpha) opa = asum / r; lv_img_buf_set_px_color(&ext->dsc, x, y, c, false); } - lv_img_buf_set_px_alpha(&ext->dsc, x, y, opa, false); + if(has_alpha) lv_img_buf_set_px_alpha(&ext->dsc, x, y, opa, false); y_safe = y - r_back; y_safe = y_safe < 0 ? 0 : y_safe; c = lv_img_buf_get_px_color(&line_img, 0, y_safe, style->image.color, false); - opa = lv_img_buf_get_px_alpha(&line_img, 0, y_safe, false); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, 0, y_safe, false); rsum -= c.ch.red; gsum -= c.ch.green; @@ -554,15 +558,15 @@ void lv_canvas_blur_ver(lv_obj_t * canvas, uint16_t r) y_safe = y_safe > ext->dsc.header.h - 1 ? ext->dsc.header.h - 1 : y_safe; c = lv_img_buf_get_px_color(&ext->dsc, x, y_safe, style->image.color, false); - opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe, false); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe, false); lv_img_buf_set_px_color(&line_img, 0, y_safe, c, false); - lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa, false); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa, false); rsum += c.ch.red; gsum += c.ch.green; bsum += c.ch.blue; - asum += opa; + if(has_alpha) asum += opa; } }