feat(img): add img.header.stride
see https://github.com/lvgl/lvgl/pull/4414#issuecomment-1698538169
This commit is contained in:
@@ -56,6 +56,7 @@ void lv_draw_sw_layer(lv_draw_unit_t * draw_unit, const lv_draw_img_dsc_t * draw
|
||||
img_dsc.header.w = layer_to_draw->draw_buf.width;
|
||||
img_dsc.header.h = layer_to_draw->draw_buf.height;
|
||||
img_dsc.header.cf = layer_to_draw->draw_buf.color_format;
|
||||
img_dsc.header.stride = lv_draw_buf_get_stride(&layer_to_draw->draw_buf);
|
||||
img_dsc.header.always_zero = 0;
|
||||
img_dsc.data = lv_draw_buf_get_buf(&layer_to_draw->draw_buf);
|
||||
|
||||
@@ -183,7 +184,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img(lv_draw_unit_t * draw_unit, const lv_d
|
||||
lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t));
|
||||
blend_dsc.opa = draw_dsc->opa;
|
||||
blend_dsc.blend_mode = draw_dsc->blend_mode;
|
||||
|
||||
blend_dsc.src_stride = decoder_dsc.header.stride;
|
||||
|
||||
if(!transformed && cf == LV_COLOR_FORMAT_A8) {
|
||||
lv_area_t clipped_coords;
|
||||
@@ -199,13 +200,11 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img(lv_draw_unit_t * draw_unit, const lv_d
|
||||
lv_draw_sw_blend(draw_unit, &blend_dsc);
|
||||
}
|
||||
else if(!transformed && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa == LV_OPA_TRANSP) {
|
||||
lv_coord_t src_w = lv_area_get_width(coords);
|
||||
lv_coord_t src_stride = lv_draw_buf_width_to_stride(src_w, cf) / lv_color_format_get_size(cf);
|
||||
lv_coord_t src_h = lv_area_get_height(coords);
|
||||
blend_dsc.src_area = coords;
|
||||
blend_dsc.src_buf = src_buf;
|
||||
blend_dsc.mask_buf = (lv_opa_t *)src_buf;
|
||||
blend_dsc.mask_buf += 2 * src_stride * src_h;
|
||||
blend_dsc.mask_buf += decoder_dsc.header.stride * src_h;
|
||||
blend_dsc.blend_area = coords;
|
||||
blend_dsc.mask_area = coords;
|
||||
blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
|
||||
@@ -226,7 +225,6 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img(lv_draw_unit_t * draw_unit, const lv_d
|
||||
blend_dsc.blend_area = &blend_area;
|
||||
|
||||
lv_coord_t src_w = lv_area_get_width(coords);
|
||||
lv_coord_t src_stride = lv_draw_buf_width_to_stride(src_w, cf) / lv_color_format_get_size(cf);
|
||||
lv_coord_t src_h = lv_area_get_height(coords);
|
||||
lv_coord_t blend_w = lv_area_get_width(&blend_area);
|
||||
lv_coord_t blend_h = lv_area_get_height(&blend_area);
|
||||
@@ -252,6 +250,13 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img(lv_draw_unit_t * draw_unit, const lv_d
|
||||
blend_area.y2 = blend_area.y1 + buf_h - 1;
|
||||
|
||||
blend_dsc.src_area = &blend_area;
|
||||
if(cf_final == LV_COLOR_FORMAT_RGB565A8) {
|
||||
blend_dsc.src_stride = lv_draw_buf_width_to_stride(blend_w, LV_COLOR_FORMAT_RGB565);
|
||||
}
|
||||
else {
|
||||
blend_dsc.src_stride = buf_stride;
|
||||
}
|
||||
|
||||
|
||||
if(cf_final == LV_COLOR_FORMAT_RGB565A8) {
|
||||
blend_dsc.mask_buf = tmp_buf + lv_draw_buf_width_to_stride(blend_w, LV_COLOR_FORMAT_RGB565) * buf_h;
|
||||
@@ -285,28 +290,29 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img(lv_draw_unit_t * draw_unit, const lv_d
|
||||
else if(draw_dsc->recolor_opa >= LV_OPA_MIN) {
|
||||
lv_coord_t h = lv_area_get_height(&relative_area);
|
||||
if(cf_final == LV_COLOR_FORMAT_RGB565A8) {
|
||||
const uint8_t * rgb_src_buf = src_buf + src_stride * relative_area.y1 * 2 + relative_area.x1 * 2;
|
||||
const uint8_t * a_src_buf = src_buf + src_stride * src_h * 2 + src_stride * relative_area.y1 + relative_area.x1;
|
||||
const uint8_t * rgb_src_buf = src_buf + blend_dsc.src_stride * relative_area.y1 + relative_area.x1 * 2;
|
||||
const uint8_t * a_src_buf = src_buf + blend_dsc.src_stride * src_h + blend_dsc.src_stride / 2 * relative_area.y1 +
|
||||
relative_area.x1;
|
||||
uint8_t * rgb_dest_buf = tmp_buf;
|
||||
uint8_t * a_dest_buf = (uint8_t *)blend_dsc.mask_buf;
|
||||
lv_coord_t i;
|
||||
for(i = 0; i < h; i++) {
|
||||
lv_memcpy(rgb_dest_buf, rgb_src_buf, blend_w * 2);
|
||||
lv_memcpy(a_dest_buf, a_src_buf, blend_w);
|
||||
rgb_src_buf += src_stride * 2;
|
||||
a_src_buf += src_stride;
|
||||
rgb_src_buf += blend_dsc.src_stride;
|
||||
a_src_buf += blend_dsc.src_stride / 2;
|
||||
rgb_dest_buf += blend_w * 2;
|
||||
a_dest_buf += blend_w;
|
||||
}
|
||||
}
|
||||
else if(cf_final != LV_COLOR_FORMAT_A8) {
|
||||
const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 * px_size + relative_area.x1 * px_size;
|
||||
const uint8_t * src_buf_tmp = src_buf + blend_dsc.src_stride * relative_area.y1 + relative_area.x1 * px_size;
|
||||
uint8_t * dest_buf_tmp = tmp_buf;
|
||||
lv_coord_t i;
|
||||
for(i = 0; i < h; i++) {
|
||||
lv_memcpy(dest_buf_tmp, src_buf_tmp, blend_w * px_size);
|
||||
dest_buf_tmp += blend_w * px_size;
|
||||
src_buf_tmp += src_stride * px_size;
|
||||
src_buf_tmp += blend_dsc.src_stride;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user