fix(draw): support RGB565_SWAPPED in software blur (#9512)

This commit is contained in:
Akash
2026-01-06 19:40:59 +05:30
committed by GitHub
parent 1f8de0abd4
commit 2e267c7d78
+25 -16
View File
@@ -33,8 +33,8 @@
* STATIC PROTOTYPES
**********************/
static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride);
static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity);
static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride, bool swapped);
static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity, bool swapped);
static void blur_3_bytes_init(uint32_t * sum, volatile uint8_t * buf, uint32_t sample_len, int32_t stride);
static inline void blur_3_bytes(uint32_t * sum, volatile uint8_t * buf, uint32_t intensity);
@@ -144,25 +144,26 @@ void lv_draw_sw_blur(lv_draw_task_t * t, const lv_draw_blur_dsc_t * dsc, const l
}
}
else if(px_size == 2) {
bool swapped = t->target_layer->draw_buf->header.cf == LV_COLOR_FORMAT_RGB565_SWAPPED;
uint16_t * buf16_column = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_start);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_column, sample_len_limited, stride_px * skip_cnt);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_column, sample_len_limited, stride_px * skip_cnt, swapped);
uint16_t buf16_prev = buf16_column[0] + 1; /*Make sure that it's not equal in the first round*/
for(y = y_start; y <= y_end; y += skip_cnt) {
if(buf16_prev != *buf16_column) {
*buf16_column = blur_2_bytes(sum, *buf16_column, intensity);
*buf16_column = blur_2_bytes(sum, *buf16_column, intensity, swapped);
buf16_prev = *buf16_column;
}
buf16_column += stride_px * skip_cnt;
}
buf16_column = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x, y_end);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_column, sample_len_limited, -stride_px * skip_cnt);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_column, sample_len_limited, -stride_px * skip_cnt, swapped);
buf16_prev = buf16_column[0] + 1; /*Make sure that it's not equal in the first round*/
for(y = y_start; y <= y_end; y += skip_cnt) {
if(buf16_prev != *buf16_column) {
*buf16_column = blur_2_bytes(sum, *buf16_column, intensity);
*buf16_column = blur_2_bytes(sum, *buf16_column, intensity, swapped);
buf16_prev = *buf16_column;
}
buf16_column -= stride_px * skip_cnt;
@@ -231,25 +232,26 @@ void lv_draw_sw_blur(lv_draw_task_t * t, const lv_draw_blur_dsc_t * dsc, const l
}
else if(px_size == 2) {
bool swapped = t->target_layer->draw_buf->header.cf == LV_COLOR_FORMAT_RGB565_SWAPPED;
uint16_t * buf16_line = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_start, y);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_line, sample_len_limited, skip_cnt);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_line, sample_len_limited, skip_cnt, swapped);
uint16_t buf16_prev = buf16_line[0] + 1; /*Make sure that it's not equal in the first round*/
for(x = x_start; x <= x_end; x += skip_cnt) {
if(buf16_prev != *buf16_line) {
*buf16_line = blur_2_bytes(sum, *buf16_line, intensity);
*buf16_line = blur_2_bytes(sum, *buf16_line, intensity, swapped);
buf16_prev = *buf16_line;
}
buf16_line += skip_cnt;
}
buf16_line = lv_draw_buf_goto_xy(t->target_layer->draw_buf, x_end, y);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_line, sample_len_limited, - skip_cnt);
blur_2_bytes_init(sum, (lv_color16_t *)buf16_line, sample_len_limited, - skip_cnt, swapped);
buf16_prev = buf16_line[0] + 1; /*Make sure that it's not equal in the first round*/
for(x = x_start; x <= x_end; x += skip_cnt) {
if(buf16_prev != *buf16_line) {
*buf16_line = blur_2_bytes(sum, *buf16_line, intensity);
*buf16_line = blur_2_bytes(sum, *buf16_line, intensity, swapped);
buf16_prev = *buf16_line;
}
@@ -304,7 +306,7 @@ static void blur_3_bytes_init(uint32_t * sum, volatile uint8_t * buf, uint32_t s
sum[2] = (sum[2] << BLUR_INTENSITY_BITS) / sample_len;
}
static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride)
static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sample_len, int32_t stride, bool swapped)
{
uint32_t s;
@@ -312,9 +314,12 @@ static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sampl
sum[1] = 0;
sum[2] = 0;
for(s = 0; s < sample_len; s++) {
sum[0] += buf->red;
sum[1] += buf->green;
sum[2] += buf->blue;
uint16_t v = *(uint16_t *)buf;
if(swapped) v = (v >> 8) | (v << 8);
lv_color16_t * c = (lv_color16_t *)&v;
sum[0] += c->red;
sum[1] += c->green;
sum[2] += c->blue;
buf += stride;
}
@@ -323,12 +328,14 @@ static void blur_2_bytes_init(uint32_t * sum, lv_color16_t * buf, uint32_t sampl
sum[2] = (sum[2] << BLUR_INTENSITY_BITS) / sample_len;
}
static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity)
static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intensity, bool swapped)
{
const uint32_t inv = BLUR_INTENSITY_MAX - intensity;
const uint32_t half = BLUR_INTENSITY_MAX >> 1;
const uint32_t shift = BLUR_INTENSITY_BITS;
if(swapped) px = (px >> 8) | (px << 8);
/* unpack */
uint32_t r = px >> 11;
uint32_t g = (px >> 5) & 0x3F;
@@ -352,7 +359,9 @@ static inline uint16_t blur_2_bytes(uint32_t * sum, uint16_t px, uint32_t intens
g = (s1 + half) >> shift;
b = (s2 + half) >> shift;
return (uint16_t)((r << 11) | (g << 5) | b);
uint16_t res = (uint16_t)((r << 11) | (g << 5) | b);
if(swapped) res = (res >> 8) | (res << 8);
return res;
}