fix(draw): stride fix for canvas and image decoder (#4820)

Signed-off-by: Xu Xingliang <xuxingliang@xiaomi.com>
This commit is contained in:
Neo Xu
2023-11-18 15:41:14 +08:00
committed by GitHub
parent 9db2ea26c7
commit e15df6744e
2 changed files with 95 additions and 101 deletions

View File

@@ -88,8 +88,14 @@ void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_canvas_t * canvas = (lv_canvas_t *)obj;
if(LV_COLOR_FORMAT_IS_INDEXED(canvas->dsc.header.cf)) {
uint32_t stride = (canvas->dsc.header.w + 7) >> 3;
uint32_t stride = canvas->dsc.header.stride;
lv_color_format_t cf = canvas->dsc.header.cf;
uint32_t pixel_byte = (lv_color_format_get_bpp(cf) + 7) >> 3;
uint8_t * data = (uint8_t *)canvas->dsc.data;
data += stride * y + x * pixel_byte; /*draw buf goto x,y */
if(LV_COLOR_FORMAT_IS_INDEXED(cf)) {
/*Indexed image bpp could be less than 8, calculate again*/
uint8_t * buf = (uint8_t *)canvas->dsc.data;
buf += 8;
buf += y * stride;
@@ -100,36 +106,28 @@ void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv
*buf &= ~(1 << bit);
*buf |= c_int << bit;
}
else if(canvas->dsc.header.cf == LV_COLOR_FORMAT_A8) {
uint8_t * buf = (uint8_t *)canvas->dsc.data;
buf += canvas->dsc.header.stride * y + x;
*buf = opa;
else if(cf == LV_COLOR_FORMAT_A8) {
*data = opa;
}
else if(canvas->dsc.header.cf == LV_COLOR_FORMAT_RGB565) {
lv_color16_t * buf = (lv_color16_t *)canvas->dsc.data;
buf += canvas->dsc.header.stride / 2 * y + x;
else if(cf == LV_COLOR_FORMAT_RGB565) {
lv_color16_t * buf = (lv_color16_t *)data;
buf->red = color.red >> 3;
buf->green = color.green >> 2;
buf->blue = color.blue >> 3;
}
else if(canvas->dsc.header.cf == LV_COLOR_FORMAT_RGB888) {
uint8_t * buf = (uint8_t *)canvas->dsc.data;
buf += canvas->dsc.header.stride / 3 * y * 3 + x * 3;
buf[2] = color.red;
buf[1] = color.green;
buf[0] = color.blue;
else if(cf == LV_COLOR_FORMAT_RGB888) {
data[2] = color.red;
data[1] = color.green;
data[0] = color.blue;
}
else if(canvas->dsc.header.cf == LV_COLOR_FORMAT_XRGB8888) {
uint8_t * buf = (uint8_t *)canvas->dsc.data;
buf += canvas->dsc.header.stride / 4 * y * 4 + x * 4;
buf[2] = color.red;
buf[1] = color.green;
buf[0] = color.blue;
buf[3] = 0xFF;
else if(cf == LV_COLOR_FORMAT_XRGB8888) {
data[2] = color.red;
data[1] = color.green;
data[0] = color.blue;
data[3] = 0xFF;
}
else if(canvas->dsc.header.cf == LV_COLOR_FORMAT_ARGB8888) {
lv_color32_t * buf = (lv_color32_t *)canvas->dsc.data;
buf += canvas->dsc.header.stride / 4 * y + x;
else if(cf == LV_COLOR_FORMAT_ARGB8888) {
lv_color32_t * buf = (lv_color32_t *)data;
buf->red = color.red;
buf->green = color.green;
buf->blue = color.blue;