1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-14 06:42:58 +08:00

fix(vg_lite): unify recolor behavior (#5085)

Signed-off-by: pengyiqiang <pengyiqiang@xiaomi.com>
Co-authored-by: pengyiqiang <pengyiqiang@xiaomi.com>
This commit is contained in:
_VIFEXTech 2023-12-22 22:18:32 +08:00 committed by GitHub
parent 4b995448bc
commit 2fa9847201
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -75,15 +75,18 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
return;
}
/* image opa */
lv_opa_t opa = dsc->opa;
vg_lite_color_t color = 0;
if(opa < LV_OPA_MAX) {
lv_memset(&color, opa, sizeof(color));
if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(decoder_dsc.header.cf) || dsc->recolor_opa > LV_OPA_MIN) {
/* alpha image and image recolor */
src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
color = lv_vg_lite_color(dsc->recolor, LV_OPA_MIX2(dsc->opa, dsc->recolor_opa), true);
}
else if(dsc->opa < LV_OPA_MAX) {
/* normal image opa */
src_buf.image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
lv_memset(&color, dsc->opa, sizeof(color));
}
bool has_recolor = dsc->recolor_opa >= LV_OPA_MIN;
bool has_trasform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE);
vg_lite_filter_t filter = has_trasform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT;
@ -96,7 +99,7 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
/* If clipping is not required, blit directly */
if(_lv_area_is_in(&image_tf_area, draw_unit->clip_area, false) && !has_recolor) {
if(_lv_area_is_in(&image_tf_area, draw_unit->clip_area, false)) {
/* The image area is the coordinates relative to the image itself */
lv_area_t src_area = *coords;
lv_area_move(&src_area, -coords->x1, -coords->y1);
@ -138,7 +141,7 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
&matrix,
lv_vg_lite_blend_mode(dsc->blend_mode),
VG_LITE_PATTERN_COLOR,
lv_vg_lite_color(dsc->recolor, dsc->recolor_opa, true),
0,
color,
filter));