diff --git a/demos/render/assets/img_render_lvgl_logo_argb8888_premultiplied.c b/demos/render/assets/img_render_lvgl_logo_argb8888_premultiplied.c new file mode 100644 index 0000000000..acea10236d --- /dev/null +++ b/demos/render/assets/img_render_lvgl_logo_argb8888_premultiplied.c @@ -0,0 +1,72 @@ +#ifdef __has_include + #if __has_include("lvgl.h") + #ifndef LV_LVGL_H_INCLUDE_SIMPLE + #define LV_LVGL_H_INCLUDE_SIMPLE + #endif + #endif +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) + #include "lvgl.h" +#else + #include "lvgl/lvgl.h" +#endif + + +#ifndef LV_ATTRIBUTE_MEM_ALIGN + #define LV_ATTRIBUTE_MEM_ALIGN +#endif + + +#ifndef LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_ARGB8888_PREMULTIPLIED +#define LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_ARGB8888_PREMULTIPLIED +#endif + +static const +LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_ARGB8888_PREMULTIPLIED +uint8_t img_render_lvgl_logo_argb8888_premultiplied_map[] = { + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x40,0x62,0x48,0x47,0x45,0xb7,0x48,0x47,0x45,0xc3,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x48,0x48,0x45,0xc1,0x49,0x49,0x45,0xc2,0x48,0x47,0x45,0xc4,0x49,0x49,0x47,0x94,0x20,0x20,0x20,0x26,0x00,0x00,0x00,0x00, + 0x02,0x02,0x02,0x03,0x4b,0x4b,0x49,0x90,0x31,0x30,0x2b,0xfd,0x35,0x34,0x30,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x36,0x35,0x31,0xff,0x2f,0x2e,0x2a,0xff,0x2d,0x2c,0x28,0xff,0x31,0x30,0x2c,0xff,0x3f,0x3e,0x3b,0xde,0x2a,0x2a,0x2a,0x34, + 0x41,0x40,0x3f,0x61,0x32,0x31,0x2d,0xff,0x38,0x37,0x33,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x34,0x33,0x2f,0xff,0x62,0x61,0x5e,0xff,0x6d,0x6c,0x69,0xff,0x38,0x37,0x33,0xff,0x2d,0x2c,0x28,0xff,0x48,0x48,0x45,0xc6, + 0x49,0x49,0x46,0xb9,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x30,0x2f,0x2b,0xff,0x7c,0x7c,0x79,0xff,0xfc,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0x9e,0x9d,0x9b,0xff,0x2f,0x2e,0x2a,0xff,0x3b,0x3a,0x36,0xf3, + 0x48,0x48,0x45,0xc3,0x36,0x35,0x31,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x2c,0x2b,0x27,0xff,0xb1,0xb2,0xb0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd9,0xd9,0xd9,0xff,0x33,0x32,0x2e,0xff,0x3b,0x3a,0x36,0xf4, + 0x48,0x48,0x45,0xc1,0x36,0x35,0x31,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x32,0x31,0x2d,0xff,0x64,0x63,0x60,0xff,0xe9,0xe9,0xe9,0xff,0xf3,0xf3,0xf3,0xff,0x81,0x81,0x7e,0xff,0x30,0x2e,0x2a,0xff,0x3c,0x3b,0x37,0xf3, + 0x48,0x48,0x45,0xc1,0x36,0x35,0x31,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x35,0xff,0x33,0x32,0x2d,0xff,0x46,0x45,0x41,0xff,0x4d,0x4c,0x48,0xff,0x33,0x32,0x2e,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x47,0x47,0x44,0xc5,0x36,0x35,0x31,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x35,0x34,0x30,0xff,0x34,0x33,0x2f,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x4a,0x49,0x47,0xb3,0x2a,0x29,0x24,0xff,0x2d,0x2c,0x27,0xff,0x2d,0x2c,0x28,0xff,0x2d,0x2c,0x28,0xff,0x2d,0x2c,0x28,0xff,0x2d,0x2c,0x28,0xff,0x2d,0x2c,0x28,0xff,0x2d,0x2c,0x27,0xff,0x32,0x31,0x2d,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x19,0x19,0x18,0x1c,0x44,0x43,0x3f,0x68,0x49,0x47,0x42,0x73,0x48,0x47,0x42,0x72,0x48,0x47,0x42,0x72,0x48,0x47,0x42,0x72,0x48,0x47,0x42,0x72,0x48,0x46,0x41,0x70,0x49,0x48,0x43,0x76,0x49,0x48,0x45,0xc5,0x31,0x30,0x2c,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x06,0x06,0x07,0x07,0x30,0x34,0x3e,0x3e,0x35,0x3b,0x47,0x47,0x34,0x3a,0x46,0x46,0x34,0x3a,0x46,0x46,0x34,0x3a,0x46,0x46,0x34,0x3a,0x46,0x46,0x35,0x3b,0x48,0x48,0x2e,0x33,0x3c,0x3c,0x07,0x07,0x07,0x08,0x4c,0x4a,0x47,0xb2,0x31,0x30,0x2c,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x43,0x5e,0x9d,0xa2,0x13,0x56,0xf3,0xff,0x14,0x57,0xf3,0xff,0x15,0x57,0xf3,0xff,0x15,0x57,0xf3,0xff,0x15,0x57,0xf3,0xff,0x15,0x57,0xf3,0xff,0x14,0x57,0xf3,0xff,0x0b,0x50,0xf2,0xff,0x3c,0x45,0x59,0x59,0x34,0x32,0x30,0x43,0x2e,0x2d,0x29,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x39,0x61,0xc2,0xca,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x11,0x54,0xf2,0xff,0x45,0x56,0x7a,0x7a,0x32,0x31,0x2e,0x3f,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x3b,0x61,0xbd,0xc4,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x12,0x55,0xf2,0xff,0x44,0x54,0x76,0x76,0x33,0x32,0x2f,0x41,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x3b,0x61,0xbd,0xc4,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x12,0x55,0xf2,0xff,0x44,0x54,0x76,0x76,0x33,0x32,0x2f,0x41,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x3b,0x61,0xbd,0xc4,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x12,0x55,0xf2,0xff,0x44,0x54,0x76,0x76,0x33,0x32,0x2f,0x41,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x3b,0x61,0xbd,0xc4,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x12,0x55,0xf2,0xff,0x44,0x54,0x76,0x76,0x33,0x32,0x2f,0x41,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x3a,0x62,0xbe,0xc5,0x1d,0x5d,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x20,0x5f,0xf3,0xff,0x12,0x55,0xf2,0xff,0x45,0x54,0x77,0x77,0x34,0x33,0x30,0x42,0x2f,0x2e,0x2a,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x38,0x61,0xc1,0xc9,0x13,0x56,0xf3,0xff,0x18,0x59,0xf3,0xff,0x18,0x59,0xf3,0xff,0x18,0x59,0xf3,0xff,0x18,0x59,0xf3,0xff,0x18,0x59,0xf3,0xff,0x18,0x59,0xf3,0xff,0x08,0x4e,0xf2,0xff,0x44,0x54,0x78,0x78,0x33,0x32,0x2f,0x41,0x26,0x25,0x21,0xff,0x32,0x31,0x2c,0xff,0x32,0x31,0x2c,0xff,0x32,0x31,0x2c,0xff,0x32,0x31,0x2c,0xff,0x32,0x31,0x2c,0xff,0x32,0x30,0x2c,0xff,0x31,0x30,0x2c,0xff,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x38,0x3f,0x4f,0x50,0x3d,0x60,0xb9,0xbe,0x3b,0x61,0xc2,0xc7,0x3b,0x61,0xc1,0xc6,0x3b,0x61,0xc1,0xc6,0x3b,0x61,0xc1,0xc6,0x3b,0x61,0xc1,0xc6,0x3a,0x61,0xc2,0xc7,0x3a,0x5f,0xb9,0xbe,0x26,0x28,0x2e,0x2e,0x0f,0x0f,0x0f,0x11,0x49,0x4a,0x49,0xac,0x45,0x47,0x45,0xc3,0x47,0x49,0x47,0xc1,0x47,0x49,0x47,0xc1,0x47,0x49,0x47,0xc1,0x47,0x49,0x47,0xc1,0x47,0x49,0x47,0xc1,0x47,0x49,0x47,0xc0,0x41,0x41,0x3e,0xe0,0x31,0x30,0x2c,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x09,0x10,0x11,0x10,0x12,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x11,0x10,0x11,0x10,0x12,0x07,0x07,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x02,0x02,0x03,0x14,0x13,0x13,0x15,0x12,0x11,0x11,0x13,0x12,0x11,0x11,0x13,0x12,0x11,0x11,0x13,0x12,0x11,0x11,0x13,0x12,0x11,0x11,0x13,0x11,0x10,0x0f,0x11,0x0c,0x0c,0x0c,0x0d,0x4c,0x4c,0x4a,0xaa,0x31,0x30,0x2b,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x45,0x59,0x44,0x61,0x61,0xb6,0x5c,0xd9,0x65,0xbf,0x5f,0xe3,0x65,0xbe,0x5f,0xe2,0x65,0xbe,0x5f,0xe2,0x65,0xbe,0x5f,0xe2,0x65,0xbe,0x5f,0xe2,0x64,0xbf,0x5f,0xe3,0x5e,0xb5,0x59,0xd8,0x29,0x31,0x2a,0x33,0x1e,0x1b,0x1a,0x1e,0xce,0x62,0x43,0xd3,0xe3,0x64,0x40,0xe8,0xe1,0x65,0x42,0xe6,0xe1,0x65,0x42,0xe6,0xe1,0x65,0x42,0xe6,0xe1,0x65,0x42,0xe6,0xe2,0x65,0x42,0xe7,0xe0,0x5f,0x3b,0xe5,0x78,0x53,0x48,0x78,0x16,0x16,0x16,0x19,0x38,0x37,0x34,0xf4,0x37,0x36,0x32,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x60,0xa5,0x5d,0xc1,0x62,0xd1,0x5c,0xff,0x64,0xd2,0x5f,0xff,0x64,0xd2,0x5f,0xff,0x64,0xd2,0x5f,0xff,0x64,0xd2,0x5f,0xff,0x64,0xd2,0x5f,0xff,0x64,0xd2,0x5f,0xff,0x5a,0xcf,0x54,0xff,0x4a,0x67,0x4d,0x6e,0x42,0x34,0x32,0x42,0xf8,0x59,0x2c,0xff,0xf8,0x62,0x39,0xff,0xf8,0x62,0x38,0xff,0xf8,0x62,0x38,0xff,0xf8,0x62,0x38,0xff,0xf8,0x62,0x38,0xff,0xf8,0x62,0x38,0xff,0xf8,0x5c,0x31,0xff,0xc7,0x65,0x4a,0xc8,0x0e,0x0e,0x0e,0x10,0x3f,0x3f,0x3c,0xe6,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x62,0xa2,0x5f,0xbc,0x65,0xd2,0x60,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x5e,0xd0,0x58,0xff,0x49,0x63,0x4c,0x6a,0x3f,0x32,0x31,0x3f,0xf8,0x5d,0x32,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x5f,0x35,0xff,0xbf,0x64,0x4c,0xc0,0x11,0x11,0x11,0x13,0x3e,0x3e,0x3b,0xe7,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x61,0xa1,0x5e,0xbb,0x65,0xd2,0x60,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x5e,0xd0,0x58,0xff,0x49,0x63,0x4c,0x6a,0x3f,0x32,0x31,0x3f,0xf8,0x5d,0x32,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x5f,0x35,0xff,0xbf,0x64,0x4c,0xc0,0x11,0x11,0x11,0x13,0x3e,0x3e,0x3b,0xe7,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x62,0xa2,0x5f,0xbc,0x65,0xd2,0x60,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x5e,0xd0,0x58,0xff,0x49,0x63,0x4c,0x6a,0x3f,0x32,0x31,0x3f,0xf8,0x5d,0x32,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x5f,0x35,0xff,0xbf,0x64,0x4c,0xc0,0x11,0x11,0x11,0x13,0x3e,0x3e,0x3b,0xe7,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3c,0x3b,0x37,0xf3, + 0x60,0xa2,0x5d,0xbc,0x65,0xd2,0x60,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x5e,0xd0,0x58,0xff,0x49,0x63,0x4c,0x6a,0x3f,0x32,0x31,0x3f,0xf8,0x5d,0x32,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x5f,0x35,0xff,0xbf,0x64,0x4c,0xc0,0x11,0x11,0x11,0x13,0x3e,0x3e,0x3b,0xe7,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x38,0x37,0x33,0xff,0x3b,0x3a,0x36,0xf4, + 0x54,0x7a,0x53,0x8a,0x62,0xd1,0x5c,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x67,0xd3,0x62,0xff,0x5e,0xd0,0x58,0xff,0x49,0x63,0x4c,0x6a,0x3f,0x32,0x31,0x3f,0xf8,0x5d,0x32,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x65,0x3c,0xff,0xf8,0x5f,0x35,0xff,0xbf,0x64,0x4c,0xc0,0x11,0x11,0x11,0x13,0x3e,0x3e,0x3b,0xe7,0x35,0x34,0x30,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x39,0x38,0x34,0xff,0x36,0x35,0x31,0xff,0x3f,0x3d,0x3a,0xe7, + 0x1a,0x1d,0x1a,0x1e,0x60,0xb5,0x5c,0xd7,0x60,0xd1,0x5a,0xff,0x66,0xd3,0x61,0xff,0x66,0xd3,0x61,0xff,0x66,0xd3,0x61,0xff,0x66,0xd3,0x61,0xff,0x66,0xd3,0x61,0xff,0x5c,0xd0,0x56,0xff,0x49,0x66,0x4c,0x6d,0x42,0x34,0x32,0x42,0xf8,0x5b,0x2f,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x64,0x3b,0xff,0xf8,0x5e,0x34,0xff,0xc5,0x65,0x4b,0xc6,0x11,0x11,0x11,0x13,0x3c,0x3c,0x39,0xec,0x34,0x33,0x2f,0xff,0x38,0x37,0x33,0xff,0x38,0x37,0x33,0xff,0x38,0x37,0x33,0xff,0x38,0x37,0x33,0xff,0x36,0x35,0x31,0xff,0x29,0x28,0x24,0xff,0x49,0x49,0x48,0x81, + 0x00,0x00,0x00,0x00,0x24,0x28,0x23,0x2a,0x5e,0x9d,0x5b,0xb7,0x63,0xc4,0x5e,0xec,0x65,0xc9,0x60,0xf2,0x65,0xc8,0x61,0xf1,0x65,0xc8,0x61,0xf1,0x65,0xca,0x61,0xf3,0x5e,0xbf,0x5a,0xe8,0x2e,0x38,0x30,0x3b,0x21,0x1d,0x1c,0x21,0xda,0x60,0x3f,0xe0,0xed,0x63,0x3d,0xf4,0xeb,0x64,0x3e,0xf2,0xeb,0x64,0x3e,0xf2,0xeb,0x64,0x3e,0xf2,0xeb,0x64,0x3e,0xf2,0xec,0x64,0x3e,0xf3,0xeb,0x5d,0x37,0xf2,0x8a,0x59,0x4b,0x8c,0x04,0x04,0x04,0x05,0x4a,0x4a,0x47,0xb8,0x35,0x34,0x30,0xf4,0x3c,0x3b,0x37,0xf3,0x3c,0x3b,0x37,0xf3,0x3c,0x3b,0x37,0xf3,0x3a,0x39,0x35,0xf4,0x3d,0x3c,0x38,0xe3,0x4a,0x49,0x48,0x83,0x03,0x03,0x03,0x04, + +}; + +const lv_image_dsc_t img_render_lvgl_logo_argb8888_premultiplied = { + .header.magic = LV_IMAGE_HEADER_MAGIC, + .header.cf = LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED, + .header.flags = 0, + .header.w = 30, + .header.h = 30, + .header.stride = 120, + .data_size = sizeof(img_render_lvgl_logo_argb8888_premultiplied_map), + .data = img_render_lvgl_logo_argb8888_premultiplied_map, +}; + diff --git a/demos/render/lv_demo_render.c b/demos/render/lv_demo_render.c index 8a822be241..d954bc476c 100644 --- a/demos/render/lv_demo_render.c +++ b/demos/render/lv_demo_render.c @@ -335,11 +335,13 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565); LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565a8); LV_IMAGE_DECLARE(img_render_lvgl_logo_argb8888); + LV_IMAGE_DECLARE(img_render_lvgl_logo_argb8888_premultiplied); LV_IMAGE_DECLARE(img_render_lvgl_logo_l8); LV_IMAGE_DECLARE(img_render_lvgl_logo_i1); const void * srcs[] = { &img_render_lvgl_logo_argb8888, + &img_render_lvgl_logo_argb8888_premultiplied, &img_render_lvgl_logo_xrgb8888, &img_render_lvgl_logo_rgb888, &img_render_lvgl_logo_rgb565, @@ -350,6 +352,7 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) const void * names[] = { "ARGB\n8888", + "ARGB\n8888\nPM", "XRGB\n8888", "RGB\n888", "RGB\n565", @@ -800,12 +803,13 @@ static void blend_mode_cb(lv_obj_t * parent) LV_DRAW_BUF_DEFINE_STATIC(buf_rgb888, 36, 30, LV_COLOR_FORMAT_RGB888); LV_DRAW_BUF_DEFINE_STATIC(buf_xrgb8888, 36, 30, LV_COLOR_FORMAT_XRGB8888); LV_DRAW_BUF_DEFINE_STATIC(buf_argb8888, 36, 30, LV_COLOR_FORMAT_ARGB8888); + LV_DRAW_BUF_DEFINE_STATIC(buf_argb8888_premul, 36, 30, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); /*The canvas will stay in the top left corner to show the original image*/ lv_obj_t * canvas = lv_canvas_create(lv_screen_active()); - const char * cf_txt[] = {"RGB565", "RGB888.", "XRGB8888", "ARGB8888"}; - lv_draw_buf_t * cf_bufs[] = {&buf_rgb565, &buf_rgb888, &buf_xrgb8888, &buf_argb8888}; + const char * cf_txt[] = {"RGB565", "RGB888.", "XRGB8888", "ARGB8888", "ARGB8888_PREMUL"}; + lv_draw_buf_t * cf_bufs[] = {&buf_rgb565, &buf_rgb888, &buf_xrgb8888, &buf_argb8888, &buf_argb8888_premul}; static lv_draw_buf_t image_dscs[4]; const char * mode_txt[] = {"Add.", "Sub.", "Mul."}; diff --git a/lv_conf_template.h b/lv_conf_template.h index 41b617d4be..6f5b82ced5 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -169,6 +169,7 @@ #define LV_DRAW_SW_SUPPORT_RGB888 1 #define LV_DRAW_SW_SUPPORT_XRGB8888 1 #define LV_DRAW_SW_SUPPORT_ARGB8888 1 + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 1 #define LV_DRAW_SW_SUPPORT_L8 1 #define LV_DRAW_SW_SUPPORT_AL88 1 #define LV_DRAW_SW_SUPPORT_A8 1 diff --git a/scripts/LVGLImage.py b/scripts/LVGLImage.py index 7c3f415ab4..247637cf73 100755 --- a/scripts/LVGLImage.py +++ b/scripts/LVGLImage.py @@ -121,6 +121,7 @@ class ColorFormat(Enum): ARGB8565 = 0x13 RGB565A8 = 0x14 RGB888 = 0x0F + ARGB8888_PREMULTIPLIED = 0x1A @property def bpp(self) -> int: @@ -143,6 +144,7 @@ class ColorFormat(Enum): ColorFormat.RGB565A8: 16, # 16bpp + a8 map ColorFormat.ARGB8565: 24, ColorFormat.RGB888: 24, + ColorFormat.ARGB8888_PREMULTIPLIED: 32, } return cf_map[self] if self in cf_map else 0 @@ -179,13 +181,15 @@ class ColorFormat(Enum): ColorFormat.ARGB8888, ColorFormat.XRGB8888, # const alpha: 0xff ColorFormat.ARGB8565, - ColorFormat.RGB565A8) + ColorFormat.RGB565A8, + ColorFormat.ARGB8888_PREMULTIPLIED) @property def is_colormap(self) -> bool: return self in (ColorFormat.ARGB8888, ColorFormat.RGB888, ColorFormat.XRGB8888, ColorFormat.RGB565A8, - ColorFormat.ARGB8565, ColorFormat.RGB565) + ColorFormat.ARGB8565, ColorFormat.RGB565, + ColorFormat.ARGB8888_PREMULTIPLIED) @property def is_luma_only(self) -> bool: @@ -295,8 +299,15 @@ def unpack_colors(data: bytes, cf: ColorFormat, w) -> List: G = data[1::4] R = data[2::4] A = data[3::4] - for r, g, b, a in zip(R, G, B, A): - ret += [r, g, b, a] + if cf == ColorFormat.ARGB8888_PREMULTIPLIED: + for r, g, b, a in zip(R, G, B, A): + r = (r * a // 255) + g = (g * a // 255) + b = (b * a // 255) + ret += [r, g, b, a] + else: + for r, g, b, a in zip(R, G, B, A): + ret += [r, g, b, a] else: assert 0 @@ -988,6 +999,16 @@ class LVGLImage: def pack(r, g, b, a): return uint32_t((a << 24) | (r << 16) | (g << 8) | (b << 0)) + elif cf == ColorFormat.ARGB8888_PREMULTIPLIED: + + def pack(r, g, b, a): + # Premultiply RGB by Alpha + r = (r * a // 255) + g = (g * a // 255) + b = (b * a // 255) + + # Pack into ARGB8888 format + return uint32_t((a << 24) | (r << 16) | (g << 8) | (b << 0)) elif cf == ColorFormat.XRGB8888: def pack(r, g, b, a): @@ -1343,7 +1364,7 @@ def main(): choices=[ "L8", "I1", "I2", "I4", "I8", "A1", "A2", "A4", "A8", "ARGB8888", "XRGB8888", "RGB565", "RGB565A8", "ARGB8565", "RGB888", "AUTO", - "RAW", "RAW_ALPHA" + "RAW", "RAW_ALPHA", "ARGB8888_PREMULTIPLIED" ]) parser.add_argument('--rgb565dither', action='store_true', diff --git a/src/draw/sw/blend/lv_draw_sw_blend.c b/src/draw/sw/blend/lv_draw_sw_blend.c index d6d2897103..87881c291f 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.c +++ b/src/draw/sw/blend/lv_draw_sw_blend.c @@ -22,6 +22,9 @@ #if LV_DRAW_SW_SUPPORT_ARGB8888 #include "lv_draw_sw_blend_to_argb8888.h" #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #include "lv_draw_sw_blend_to_argb8888_premultiplied.h" +#endif #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 #include "lv_draw_sw_blend_to_rgb888.h" #endif @@ -189,6 +192,11 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color(lv_color_format_ lv_draw_sw_blend_color_to_rgb888(fill_dsc, 4); break; #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + lv_draw_sw_blend_color_to_argb8888_premultiplied(fill_dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_L8 case LV_COLOR_FORMAT_L8: lv_draw_sw_blend_color_to_l8(fill_dsc); @@ -234,6 +242,11 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image(lv_color_format_ lv_draw_sw_blend_image_to_rgb888(image_dsc, 4); break; #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + lv_draw_sw_blend_image_to_argb8888_premultiplied(image_dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_L8 case LV_COLOR_FORMAT_L8: lv_draw_sw_blend_image_to_l8(image_dsc); diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c index 11d61ff62e..98f691b92d 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c @@ -69,6 +69,10 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_imag const uint8_t src_px_size); #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix); @@ -186,6 +190,22 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + #ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888 #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID #endif @@ -332,6 +352,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_i case LV_COLOR_FORMAT_XRGB8888: rgb888_image_blend(dsc, 4); break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; #endif case LV_COLOR_FORMAT_ARGB8888: argb8888_image_blend(dsc); @@ -949,6 +974,149 @@ static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_ds } } +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + /* Process the normal blend mode (for premultiplied alpha) */ + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + } + + /* Blend with destination */ + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + /* Unpremultiply the source color by using the reciprocal of the alpha */ + color_argb = src_buf_c32[x]; + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + if(mask_buf == NULL) { + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + } + else { + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + } + + /* Blend with destination using non-normal blend mode */ + blend_non_normal_pixel(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_32_mix(const uint8_t src, lv_color32_t * dest, uint8_t mix) { diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c new file mode 100644 index 0000000000..b4716a9bdd --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.c @@ -0,0 +1,626 @@ +/** + * @file lv_draw_sw_blend_to_argb8888_premultiplied.c + * @brief Implementation of ARGB8888 Premultiplied blending for LVGL. + */ + +/********************* +* INCLUDES +*********************/ +#include "lv_draw_sw_blend_to_argb8888_premultiplied.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** +* TYPEDEFS +**********************/ + +typedef struct { + lv_color32_t fg_saved; + lv_color32_t bg_saved; + lv_color32_t res_saved; + lv_opa_t res_alpha_saved; + lv_opa_t ratio_saved; +} lv_color_mix_alpha_cache_t; + +/********************** + * STATIC PROTOTYPES + **********************/ + + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel_premultiplied( + lv_color32_t * dest, lv_color32_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache); + +static inline lv_color32_t lv_color_32_32_mix_premul(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache); + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache); + +/********************** +* STATIC VARIABLES +**********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ +/** + * @brief Blend a solid color into an ARGB8888 premultiplied buffer. + * + * This function applies a solid color to the destination buffer with optional + * opacity and masking. The input color is first converted to a premultiplied + * alpha format before blending. + * + * @param dsc Blending descriptor containing destination buffer, color, and opacity + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888_premultiplied(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + int32_t dest_stride = dsc->dest_stride; + + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + /* Convert source color to premultiplied */ + lv_color32_t color_argb = lv_color_to_32(dsc->color, opa); + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + + /* Simple fill */ + if(mask == NULL && opa >= LV_OPA_MAX) { + uint32_t color32 = lv_color_to_u32(dsc->color); + uint32_t * dest_buf = dsc->dest_buf; + + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = color32; + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + /* Opacity only */ + else if(mask == NULL && opa < LV_OPA_MAX) { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf[x] = lv_color_32_32_mix_premul(color_argb, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + /* Masked fill */ + else if(mask && opa >= LV_OPA_MAX) { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_premul = color_argb; + color_premul.alpha = mask[x]; + color_premul.red = (color_premul.red * color_premul.alpha) >> 8; + color_premul.green = (color_premul.green * color_premul.alpha) >> 8; + color_premul.blue = (color_premul.blue * color_premul.alpha) >> 8; + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + /* Masked with opacity */ + else { + lv_color32_t * dest_buf = dsc->dest_buf; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color32_t color_premul = color_argb; + color_premul.alpha = LV_OPA_MIX2(mask[x], opa); + color_premul.red = (color_premul.red * color_premul.alpha) >> 8; + color_premul.green = (color_premul.green * color_premul.alpha) >> 8; + color_premul.blue = (color_premul.blue * color_premul.alpha) >> 8; + dest_buf[x] = lv_color_32_32_mix_premul(color_premul, dest_buf[x], &cache); + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } +} + +/** + * @brief Blend an image into an ARGB8888 premultiplied buffer. + * + * This function blends an image stored in ARGB8888 premultiplied format + * into the destination buffer. It accounts for opacity and optional masking. + * + * @param dsc Blending descriptor containing source and destination buffer information + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888_premultiplied(lv_draw_sw_blend_image_dsc_t * dsc) +{ + + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; + + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +#if LV_DRAW_SW_SUPPORT_ARGB8888 + +static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply global opacity */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply mask opacity */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply both mask and global opacity */ + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Apply mask and/or opacity */ + if(mask_buf == NULL) + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + blend_non_normal_pixel_premultiplied(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + lv_color32_t * dest_buf_c32 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x, y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_c32[x] = lv_color_32_32_mix_premul(src_buf_c32[x], dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Apply global opacity */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + /* Adjust alpha using mask */ + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_ARGB8888_PREMULTIPLIED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Adjust alpha using both mask and opacity */ + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, opa, mask_buf[x]); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + dest_buf_c32[x] = lv_color_32_32_mix_premul(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb = src_buf_c32[x]; + + /* Unpremultiply the source color by using the reciprocal of the alpha */ + if(color_argb.alpha != 0) { + uint16_t reciprocal_alpha = (255 * 256) / color_argb.alpha; + color_argb.red = (color_argb.red * reciprocal_alpha) >> 8; + color_argb.green = (color_argb.green * reciprocal_alpha) >> 8; + color_argb.blue = (color_argb.blue * reciprocal_alpha) >> 8; + } + + /* Adjust alpha if needed */ + if(mask_buf == NULL) + color_argb.alpha = LV_OPA_MIX2(color_argb.alpha, opa); + else + color_argb.alpha = LV_OPA_MIX3(color_argb.alpha, mask_buf[x], opa); + + /* Premultiply alpha */ + color_argb.red = (color_argb.red * color_argb.alpha) >> 8; + color_argb.green = (color_argb.green * color_argb.alpha) >> 8; + color_argb.blue = (color_argb.blue * color_argb.alpha) >> 8; + + blend_non_normal_pixel_premultiplied(&dest_buf_c32[x], color_argb, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + + +/** + * @brief Mix two ARGB8888 premultiplied colors. + * + * This function blends the foreground (`fg`) and background (`bg`) colors. + * The foreground color is assumed to be premultiplied. + * + * @param fg Foreground color (premultiplied alpha) + * @param bg Background color + * @param cache Alpha blending cache for optimization + * @return lv_color32_t Blended color result + */ +static inline lv_color32_t lv_color_32_32_mix_premul(lv_color32_t fg, lv_color32_t bg, + lv_color_mix_alpha_cache_t * cache) +{ + /*Pick the foreground if it's fully opaque or the background is fully transparent*/ + if(fg.alpha >= LV_OPA_MAX || bg.alpha <= LV_OPA_MIN) { + return fg; + } + /* Transparent foreground: use the background */ + else if(fg.alpha <= LV_OPA_MIN) { + return bg; + } + /* Opaque background: use simple mix */ + else if(bg.alpha == 255) { + return lv_color_mix32_premultiplied(fg, bg); + } + else { + /* Check cache to avoid redundant calculations */ + if(bg.alpha != cache->bg_saved.alpha || fg.alpha != cache->fg_saved.alpha) { + /* Compute final alpha value */ + cache->res_alpha_saved = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha); + LV_ASSERT(cache->res_alpha_saved != 0); + + /* Compute premultiplied blending ratio */ + cache->ratio_saved = (uint32_t)((uint32_t)fg.alpha * 255) / cache->res_alpha_saved; + } + + /* Check if color blending is already cached */ + if(!lv_color32_eq(bg, cache->bg_saved) || !lv_color32_eq(fg, cache->fg_saved)) { + cache->fg_saved = fg; + cache->bg_saved = bg; + + /* Blend using premultiplied alpha */ + uint32_t inv_fg_alpha = 255 - fg.alpha; + cache->res_saved.red = fg.red + ((bg.red * inv_fg_alpha) >> 8); + cache->res_saved.green = fg.green + ((bg.green * inv_fg_alpha) >> 8); + cache->res_saved.blue = fg.blue + ((bg.blue * inv_fg_alpha) >> 8); + cache->res_saved.alpha = cache->res_alpha_saved; + } + + return cache->res_saved; + } +} + +static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) +{ + lv_memzero(&cache->fg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->bg_saved, sizeof(lv_color32_t)); + lv_memzero(&cache->res_saved, sizeof(lv_color32_t)); + cache->res_alpha_saved = 255; + cache->ratio_saved = 255; +} + + +static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) +{ + return (void *)((uint8_t *)buf + stride); +} + + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel_premultiplied( + lv_color32_t * dest, lv_color32_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) +{ + lv_color32_t res; + uint8_t src_alpha = src.alpha; /* Premultiplied alpha of source */ + uint8_t dest_alpha = dest->alpha; + + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + /* Ensure RGB remains premultiplied */ + res.red = LV_MIN(dest->red + src.red, dest_alpha); + res.green = LV_MIN(dest->green + src.green, dest_alpha); + res.blue = LV_MIN(dest->blue + src.blue, dest_alpha); + break; + + case LV_BLEND_MODE_SUBTRACTIVE: + /* Ensure RGB remains non-negative and premultiplied */ + res.red = LV_MAX(dest->red - src.red, 0); + res.green = LV_MAX(dest->green - src.green, 0); + res.blue = LV_MAX(dest->blue - src.blue, 0); + break; + + case LV_BLEND_MODE_MULTIPLY: + /* Adjusted for premultiplied alpha: scale the result properly */ + res.red = ((dest->red * src.red) / LV_MAX(src_alpha, 1)); + res.green = ((dest->green * src.green) / LV_MAX(src_alpha, 1)); + res.blue = ((dest->blue * src.blue) / LV_MAX(src_alpha, 1)); + break; + + case LV_BLEND_MODE_DIFFERENCE: + res.red = LV_ABS(dest->red - src.red); + res.green = LV_ABS(dest->green - src.green); + res.blue = LV_ABS(dest->blue - src.blue); + break; + + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + + res.alpha = src_alpha; /* Keep the alpha from premultiplied source */ + *dest = lv_color_32_32_mix_premul(res, *dest, cache); +} + +#endif /* LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED */ + +#endif /* LV_USE_DRAW_SW */ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h new file mode 100644 index 0000000000..a4de2f2693 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888_premultiplied.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_argb8888_premultiplied.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H +#define LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_draw_sw.h" +#if LV_USE_DRAW_SW + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888_premultiplied(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888_premultiplied(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_ARGB8888_PREMULTIPLIED_H*/ \ No newline at end of file diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c index 6303286cbd..dc523f6732 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c @@ -63,12 +63,18 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_imag static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + + static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix); static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); + static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); /********************** @@ -175,6 +181,23 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + #ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565 #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID #endif @@ -380,6 +403,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_ima argb8888_image_blend(dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_L8 case LV_COLOR_FORMAT_L8: l8_image_blend(dsc); @@ -1120,6 +1148,175 @@ static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_ds #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix_premult(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + uint8_t r = (c1[2] >> 3) + ((((c2 >> 11) & 0x1F) * mix_inv) >> 8); + uint8_t g = (c1[1] >> 2) + ((((c2 >> 5) & 0x3F) * mix_inv) >> 8); + uint8_t b = (c1[0] >> 3) + ((((c2 >> 0) & 0x1F) * mix_inv) >> 8); + + return (r << 11) + (g << 5) + (b); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + /*For the trivial case use the premultipled image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + dest_buf_u16[dest_x] = lv_color_24_16_mix_premult(&src_buf_u8[src_x], dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x])); + } + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_24_16_mix(src_buf_u8_unpremult, dest_buf_u16[dest_x], + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa)); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and full opacity */ + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3]); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and partial opacity */ + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, src_buf_u8[src_x + 3])); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x]); + else + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3])); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + static inline uint16_t LV_ATTRIBUTE_FAST_MEM l8_to_rgb565(const uint8_t c1) { return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); @@ -1160,6 +1357,7 @@ static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * } } + #if LV_DRAW_SW_SUPPORT_I1 static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c index 926ba61be8..9e81f0d9f2 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c @@ -65,10 +65,17 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(lv_draw_sw_blend_im uint32_t dest_px_size); #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size); +#endif + + static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_24_mix(const uint8_t src, uint8_t * dest, uint8_t mix); static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix); + static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode); static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); @@ -161,6 +168,22 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888 + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + #ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888 #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(...) LV_RESULT_INVALID #endif @@ -330,6 +353,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(lv_draw_sw_blend_ima argb8888_image_blend(dsc, dest_px_size); break; #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc, dest_px_size); + break; +#endif #if LV_DRAW_SW_SUPPORT_L8 case LV_COLOR_FORMAT_L8: l8_image_blend(dsc, dest_px_size); @@ -903,6 +931,139 @@ static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(lv_draw_sw_blend_image_ds #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix_premult(const uint8_t * src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + } + else { + lv_opa_t mix_inv = 255 - mix; + dest[0] = (uint32_t)src[0] + ((uint32_t)(dest[0] * mix_inv) >> 8); + dest[1] = (uint32_t)src[1] + ((uint32_t)(dest[1] * mix_inv) >> 8); + dest[2] = (uint32_t)src[2] + ((uint32_t)(dest[2] * mix_inv) >> 8); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, + uint32_t dest_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color32_t * src_buf_c32 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + /*For the trivial case use the premultipled image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + lv_color_24_24_mix_premult((const uint8_t *)&src_buf_c32[src_x], &dest_buf[dest_x], src_buf_c32[src_x].alpha); + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX2(src_pixel.alpha, opa)); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX2(src_pixel.alpha, mask_buf[src_x])); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + lv_color32_t src_pixel = src_buf_c32[src_x]; + if(src_pixel.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_pixel.alpha; + src_pixel.red = (src_pixel.red * reciprocal) >> 8; + src_pixel.green = (src_pixel.green * reciprocal) >> 8; + src_pixel.blue = (src_pixel.blue * reciprocal) >> 8; + lv_color_24_24_mix((const uint8_t *)&src_pixel, &dest_buf[dest_x], LV_OPA_MIX3(src_pixel.alpha, mask_buf[src_x], opa)); + } + } + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x ++) { + src_argb = src_buf_c32[src_x]; + if(src_argb.alpha > 0) { + uint16_t reciprocal = (255 * 256) / src_argb.alpha; + src_argb.red = (src_argb.red * reciprocal) >> 8; + src_argb.green = (src_argb.green * reciprocal) >> 8; + src_argb.blue = (src_argb.blue * reciprocal) >> 8; + } + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_argb.alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_argb.alpha, mask_buf[dest_x], opa); + + blend_non_normal_pixel(&dest_buf[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf += dest_stride; + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} + +#endif + static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode) { uint8_t res[3] = {0, 0, 0}; @@ -970,6 +1131,7 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix(const uint8_t * src, } } + #if LV_DRAW_SW_SUPPORT_I1 static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) diff --git a/src/draw/sw/lv_draw_sw_img.c b/src/draw/sw/lv_draw_sw_img.c index 57312866e3..6a4c2aebd0 100644 --- a/src/draw/sw/lv_draw_sw_img.c +++ b/src/draw/sw/lv_draw_sw_img.c @@ -47,6 +47,10 @@ #define LV_DRAW_SW_RGB888_RECOLOR(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR(...) LV_RESULT_INVALID +#endif + /********************** * TYPEDEFS **********************/ @@ -628,6 +632,55 @@ static void recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_b } } } + else if(cf == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_RECOLOR(dest_buf, blend_area, color, mix, cf_final)) { + uint32_t px_size = lv_color_format_get_size(cf); + src_buf += src_stride * relative_area.y1 + relative_area.x1 * px_size; + + uint16_t c_mult[3]; + c_mult[0] = color.blue * mix; + c_mult[1] = color.green * mix; + c_mult[2] = color.red * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + uint8_t alpha = src_buf[3]; + + if(alpha > 0) { + /* Step 1: Unpremultiply (convert to non-premultiplied RGB) */ + uint16_t reciprocal = (255 * 256) / alpha; + uint8_t r = (src_buf[2] * reciprocal) >> 8; + uint8_t g = (src_buf[1] * reciprocal) >> 8; + uint8_t b = (src_buf[0] * reciprocal) >> 8; + + /* Step 2: Apply recoloring */ + r = (c_mult[2] + (r * mix_inv)) >> 8; + g = (c_mult[1] + (g * mix_inv)) >> 8; + b = (c_mult[0] + (b * mix_inv)) >> 8; + + /* Step 3: Premultiply again */ + dest_buf[0] = (b * alpha) >> 8; + dest_buf[1] = (g * alpha) >> 8; + dest_buf[2] = (r * alpha) >> 8; + } + else { + /* If alpha is 0, just copy the pixel as is */ + dest_buf[0] = src_buf[0]; + dest_buf[1] = src_buf[1]; + dest_buf[2] = src_buf[2]; + } + + dest_buf[3] = alpha; /* Keep original alpha*/ + + src_buf += px_size; + dest_buf += px_size; + } + src_buf += src_stride - w * px_size; + } + } + } } static bool apply_mask(const lv_draw_image_dsc_t * draw_dsc) diff --git a/src/draw/sw/lv_draw_sw_transform.c b/src/draw/sw/lv_draw_sw_transform.c index 41229d5ecf..4d25961535 100644 --- a/src/draw/sw/lv_draw_sw_transform.c +++ b/src/draw/sw/lv_draw_sw_transform.c @@ -63,6 +63,12 @@ static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h int32_t x_end, uint8_t * dest_buf, bool aa); #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED +static void transform_argb8888_premultiplied(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa); +#endif + #if LV_DRAW_SW_SUPPORT_RGB565A8 static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, @@ -249,6 +255,13 @@ void lv_draw_sw_transform(const lv_area_t * dest_area, const void * src_buf, aa); break; #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + transform_argb8888_premultiplied(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, + aa); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB565 && LV_DRAW_SW_SUPPORT_RGB565A8 case LV_COLOR_FORMAT_RGB565: transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, dest_buf, @@ -478,6 +491,138 @@ static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h #endif +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static lv_color32_t unpremultiply(lv_color32_t c) +{ + if(c.alpha == 0) { + c.red = 0; + c.green = 0; + c.blue = 0; + } + else { + uint16_t reciprocal_alpha = (255 * 256) / c.alpha; + c.red = (c.red * reciprocal_alpha) >> 8; + c.green = (c.green * reciprocal_alpha) >> 8; + c.blue = (c.blue * reciprocal_alpha) >> 8; + } + + return c; +} + +static void transform_argb8888_premultiplied(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint8_t * dest_buf, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf; + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + ((uint32_t *)dest_buf)[x] = 0x00000000; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = 0x7F - xs_fract; + } + else { + x_next = 1; + xs_fract = xs_fract - 0x80; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = 0x7F - ys_fract; + } + else { + y_next = 1; + ys_fract = ys_fract - 0x80; + } + + const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4); + + dest_c32[x] = src_c32[0]; + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + lv_color32_t px_hor = src_c32[x_next]; + lv_color32_t px_ver = *(const lv_color32_t *)((uint8_t *)src_c32 + y_next * src_stride); + + /*Have the non-premultipled colors first, mix them as needed, + *and premultiply again*/ + dest_c32[x] = unpremultiply(dest_c32[x]); + px_hor = unpremultiply(px_hor); + px_ver = unpremultiply(px_ver); + + if(px_ver.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - ys_fract)) >> 8; + + } + else if(!lv_color32_eq(dest_c32[x], px_ver)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_ver.alpha * ys_fract) + (dest_c32[x].alpha * (0xFF - ys_fract))) >> 8; + px_ver.alpha = ys_fract; + dest_c32[x] = lv_color_mix32(px_ver, dest_c32[x]); + } + + if(px_hor.alpha == 0) { + dest_c32[x].alpha = (dest_c32[x].alpha * (0xFF - xs_fract)) >> 8; + } + else if(!lv_color32_eq(dest_c32[x], px_hor)) { + if(dest_c32[x].alpha) dest_c32[x].alpha = ((px_hor.alpha * xs_fract) + (dest_c32[x].alpha * (0xFF - xs_fract))) >> 8; + px_hor.alpha = xs_fract; + dest_c32[x] = lv_color_mix32(px_hor, dest_c32[x]); + } + + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + + } + /*Partially out of the image*/ + else { + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + dest_c32[x] = unpremultiply(dest_c32[x]); + lv_opa_t alpha = (dest_c32[x].alpha * (0x7F - xs_fract)) >> 7; + dest_c32[x].alpha = alpha; + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + dest_c32[x] = unpremultiply(dest_c32[x]); + lv_opa_t alpha = (dest_c32[x].alpha * (0x7F - ys_fract)) >> 7; + dest_c32[x].alpha = alpha; + dest_c32[x].red = (dest_c32[x].red * dest_c32[x].alpha) >> 8; + dest_c32[x].green = (dest_c32[x].green * dest_c32[x].alpha) >> 8; + dest_c32[x].blue = (dest_c32[x].blue * dest_c32[x].alpha) >> 8; + } + } + } +} +#endif + #if LV_DRAW_SW_SUPPORT_RGB565A8 static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, diff --git a/src/draw/vg_lite/lv_vg_lite_utils.c b/src/draw/vg_lite/lv_vg_lite_utils.c index 5fe322542b..2a889adace 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.c +++ b/src/draw/vg_lite/lv_vg_lite_utils.c @@ -578,6 +578,8 @@ vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf) case LV_COLOR_FORMAT_ARGB8888: return VG_LITE_BGRA8888; + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + return VG_sBGRA_8888_PRE; case LV_COLOR_FORMAT_XRGB8888: return VG_LITE_BGRX8888; @@ -640,6 +642,7 @@ void lv_vg_lite_buffer_format_bytes( case VG_LITE_BGRX8888: case VG_LITE_XBGR8888: case VG_LITE_XRGB8888: + case VG_sBGRA_8888_PRE: *mul = 4; break; case VG_LITE_NV12: diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index fd98dd06b5..5f2738b64f 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -450,6 +450,17 @@ #define LV_DRAW_SW_SUPPORT_ARGB8888 1 #endif #endif + #ifndef LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED 1 + #endif + #endif #ifndef LV_DRAW_SW_SUPPORT_L8 #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_L8 diff --git a/src/misc/lv_color.c b/src/misc/lv_color.c index 1096e3b9b6..4142cd3428 100644 --- a/src/misc/lv_color.c +++ b/src/misc/lv_color.c @@ -77,6 +77,7 @@ uint8_t lv_color_format_get_bpp(lv_color_format_t cf) case LV_COLOR_FORMAT_RGB888: return 24; case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: case LV_COLOR_FORMAT_XRGB8888: return 32; @@ -100,6 +101,7 @@ bool lv_color_format_has_alpha(lv_color_format_t cf) case LV_COLOR_FORMAT_RGB565A8: case LV_COLOR_FORMAT_ARGB8565: case LV_COLOR_FORMAT_ARGB8888: + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: case LV_COLOR_FORMAT_AL88: case LV_COLOR_FORMAT_ARGB2222: case LV_COLOR_FORMAT_ARGB1555: diff --git a/src/misc/lv_color.h b/src/misc/lv_color.h index 1a160b4a56..106d16a37c 100644 --- a/src/misc/lv_color.h +++ b/src/misc/lv_color.h @@ -88,6 +88,7 @@ enum { (cf) == LV_COLOR_FORMAT_ARGB8565 ? 24 : \ (cf) == LV_COLOR_FORMAT_RGB888 ? 24 : \ (cf) == LV_COLOR_FORMAT_ARGB8888 ? 32 : \ + (cf) == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED ? 32 : \ (cf) == LV_COLOR_FORMAT_XRGB8888 ? 32 : \ 0 \ ) @@ -158,6 +159,7 @@ typedef enum { LV_COLOR_FORMAT_RGB888 = 0x0F, LV_COLOR_FORMAT_ARGB8888 = 0x10, LV_COLOR_FORMAT_XRGB8888 = 0x11, + LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED = 0x1A, /*Formats not supported by software renderer but kept here so GPU can use it*/ LV_COLOR_FORMAT_A1 = 0x0B, diff --git a/src/misc/lv_color_op.c b/src/misc/lv_color_op.c index b4e64ff866..9968341d89 100644 --- a/src/misc/lv_color_op.c +++ b/src/misc/lv_color_op.c @@ -58,6 +58,26 @@ lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg) return bg; } +lv_color32_t lv_color_mix32_premultiplied(lv_color32_t fg, lv_color32_t bg) +{ + if(fg.alpha >= LV_OPA_MAX) { + return fg; /* Fully opaque foreground replaces background */ + } + if(fg.alpha <= LV_OPA_MIN) { + return bg; /* Fully transparent foreground, return background */ + } + + uint32_t inv_fg_alpha = LV_OPA_MAX - fg.alpha; + + /* Premultiplied blending */ + bg.red = fg.red + ((bg.red * inv_fg_alpha) >> 8); + bg.green = fg.green + ((bg.green * inv_fg_alpha) >> 8); + bg.blue = fg.blue + ((bg.blue * inv_fg_alpha) >> 8); + bg.alpha = fg.alpha + ((bg.alpha * inv_fg_alpha) >> 8); + + return bg; +} + uint8_t lv_color_brightness(lv_color_t c) { uint16_t bright = (uint16_t)(3u * c.red + c.green + 4u * c.blue); diff --git a/src/misc/lv_color_op.h b/src/misc/lv_color_op.h index 80ecd02cb1..6905d1ab87 100644 --- a/src/misc/lv_color_op.h +++ b/src/misc/lv_color_op.h @@ -58,6 +58,21 @@ lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint */ lv_color32_t lv_color_mix32(lv_color32_t fg, lv_color32_t bg); +/** + * @brief Blends two premultiplied ARGB8888 colors while maintaining correct alpha compositing. + * + * This function correctly blends the foreground (fg) and background (bg) colors, + * ensuring that the output remains in a premultiplied alpha format. + * + * @param fg The foreground color in premultiplied ARGB8888 format. + * @param bg The background color in premultiplied ARGB8888 format. + * @return The resulting blended color in premultiplied ARGB8888 format. + * + * @note If the foreground is fully opaque, it is returned as is. + * @note If the foreground is fully transparent, the background is returned. + */ +lv_color32_t lv_color_mix32_premultiplied(lv_color32_t fg, lv_color32_t bg); + /** * Get the brightness of a color * @param c a color diff --git a/src/others/test/lv_test_screenshot_compare.c b/src/others/test/lv_test_screenshot_compare.c index 555292e783..575b50ac81 100644 --- a/src/others/test/lv_test_screenshot_compare.c +++ b/src/others/test/lv_test_screenshot_compare.c @@ -362,7 +362,8 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) buf_out += draw_buf->header.w * 4; } } - else if(cf_in == LV_COLOR_FORMAT_ARGB8888 || cf_in == LV_COLOR_FORMAT_XRGB8888) { + else if(cf_in == LV_COLOR_FORMAT_ARGB8888 || cf_in == LV_COLOR_FORMAT_XRGB8888 || + cf_in == LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED) { uint32_t y; for(y = 0; y < draw_buf->header.h; y++) { uint32_t x; diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_128.png index 7a18ccadb4..e2e998b998 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_255.png index 84853b45ae..ede10cf3d2 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_128.png index b26d019bc3..33785baee7 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_255.png index 81419f7681..04ceee40ee 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_128.png index f200d67da4..63cc13c426 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_255.png index c4c4693181..4ec5cac972 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_128.png index 7888caf22a..dcb7132cda 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_255.png index b8706cdc25..02fd7eed46 100644 Binary files a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_128.png index da5a2fefff..bb61aaf1f0 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_255.png index 3ad48c8d42..b82c9944a5 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_128.png index 0953b3ae39..0dffe87c78 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_255.png index 623d0f2c1f..2de0d2d2c4 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png index 926b8f07c0..4ab5c7a960 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png index 7232f088b4..47136063f4 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png index 7cc2be38ba..fa2d998441 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png index 95a296e72f..f3f0cd0ceb 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png new file mode 100644 index 0000000000..d4033d09dd Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000..9431d7f88e Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png new file mode 100644 index 0000000000..281a4222e3 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png new file mode 100644 index 0000000000..e62432eaf6 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png new file mode 100644 index 0000000000..09d9205fd1 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png new file mode 100644 index 0000000000..56e9c706b9 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png new file mode 100644 index 0000000000..64cbff3b2c Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png new file mode 100644 index 0000000000..11f30926aa Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png new file mode 100644 index 0000000000..8281d0c343 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png new file mode 100644 index 0000000000..27540f1125 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png new file mode 100644 index 0000000000..9610b79061 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png new file mode 100644 index 0000000000..8fb03e2874 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png new file mode 100644 index 0000000000..cc03ffe0fb Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png new file mode 100644 index 0000000000..71a75e03e4 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000..882cdf243a Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png new file mode 100644 index 0000000000..493650b6a6 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000..90fe568fd9 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png new file mode 100644 index 0000000000..2553905453 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000..1a247f81e6 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png new file mode 100644 index 0000000000..0fede053bc Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png new file mode 100644 index 0000000000..43cb471e0d Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png new file mode 100644 index 0000000000..7b6335fc01 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png new file mode 100644 index 0000000000..2b837d3616 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png new file mode 100644 index 0000000000..f437587c7b Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png new file mode 100644 index 0000000000..43c5944ad6 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png new file mode 100644 index 0000000000..b4c1cead68 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png new file mode 100644 index 0000000000..c0f1b02438 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000..096da787f3 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png index 2cb43a536c..0d28c99ad3 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png index 8e9a9498bb..eeef24d4f0 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png index 211121e05b..f2aff493da 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png index ea5ab40ebe..48871afd2f 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png index a902ba0438..012d168a83 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png index 57740b49c0..e16430cb72 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png index fae6b43278..747a59fe34 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png index 93e86c11a7..d3b58f9736 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_128.png index 13b8f5f1c8..f2676288b6 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_255.png index 051e27cda7..7f627364ca 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_128.png index 1ed3526f72..9c262b75b8 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_255.png index 49572e17ca..eae7583eae 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_128.png index 4449b43f61..1c7e904848 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_255.png index 335f5528e9..bc5fc1c456 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_128.png index 3959fdeb43..42bd9fcbeb 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_255.png index 0f2166ebc0..e8f5451be7 100644 Binary files a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_128.png index 185702bfcb..5a96ab9250 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_255.png index 7f1d9d419e..8d51de995b 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_128.png index f9064ba59c..9deb26d674 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_255.png index 6c578c549e..44e842330c 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png index 669b9c8ab0..d9c3d5abe6 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png index acd5970a31..cad3b946d1 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png index cf48ddeea2..4e465192a2 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png index f1ec2e00c6..89b432eafb 100644 Binary files a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_128.png index d846de4e3b..584a74d5e4 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_255.png index 2d016b4d59..36374575b7 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_128.png index 86ee3eb8d6..68a4b49f4b 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_255.png index 01e79374ac..b3568a8ecc 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png index ee4ab0eda4..14b89f2e94 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png index 918cce0804..03a2933e1a 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png index 294804b390..e62c7f28f2 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png index c8b7354a61..ce3170b353 100644 Binary files a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png index d846de4e3b..584a74d5e4 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png index 2d016b4d59..36374575b7 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png index 86ee3eb8d6..68a4b49f4b 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png index 01e79374ac..b3568a8ecc 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png index ee4ab0eda4..14b89f2e94 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png index 918cce0804..03a2933e1a 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png index 294804b390..e62c7f28f2 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png index c8b7354a61..ce3170b353 100644 Binary files a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_128.png index b5edfd1ffd..dc2f06e2c9 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_255.png index 7e3092c8aa..fa21a7ed49 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png index 5b580440a4..3fffdacf18 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png index f03a8b0524..21f0dcea19 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_128.png index fb01776b17..91f780321d 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_255.png index 7fa18c6c96..c35759079f 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png index 0c43bc27e4..c6d0e5d194 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png index e5979d2986..bce37878da 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_128.png index 905e51f340..f78f7587ed 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_255.png index 421f5f3417..f79356a90a 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png index 9b1eba6f4a..dc55af9cf2 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png index 33fe910d0b..1ce000f1c2 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_128.png index 59b601d0b9..41d791d422 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_255.png index 4ce4b1373a..84dbf307f3 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png index 116e075125..4ed59aae63 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png index 83446ab986..99158c1fd2 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_128.png index 299bdfc6e2..922504c15b 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_255.png index c5e0ee2ba9..a26a4b472d 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png index 2af4bb0e38..b8355e71f3 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png index 5507531223..d401ab226b 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_128.png index a6b7485dfd..07205aba23 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_255.png index 4c2b7f3519..0dd648eacc 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png index 3fe0581a5b..7f8beb7ce1 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png index 6ef7629379..81280bf1dd 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_128.png index d8442754b4..8a6a77b750 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_255.png index 089e89dfcf..d9c9cf84cb 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png index cfc6198b30..703b61541f 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_255.png index 5d6d07db6e..e64541ecb3 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png index f2d33fd92d..4b45ff08c9 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png index f0ba7740a9..cdc4766a32 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png index 1f8bc1c122..eb59a6ba0a 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png index 5d23940567..dca8011bfc 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png new file mode 100644 index 0000000000..d4033d09dd Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000..9431d7f88e Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_image_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png new file mode 100644 index 0000000000..281a4222e3 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png new file mode 100644 index 0000000000..e62432eaf6 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_arc_normal_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png new file mode 100644 index 0000000000..a9cbcb258f Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png new file mode 100644 index 0000000000..7f03d73c0f Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_blend_mode_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png new file mode 100644 index 0000000000..64cbff3b2c Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png new file mode 100644 index 0000000000..11f30926aa Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_border_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png new file mode 100644 index 0000000000..8281d0c343 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png new file mode 100644 index 0000000000..27540f1125 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_box_shadow_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_conical_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png new file mode 100644 index 0000000000..9610b79061 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png new file mode 100644 index 0000000000..8fb03e2874 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_fill_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png new file mode 100644 index 0000000000..cc03ffe0fb Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png new file mode 100644 index 0000000000..71a75e03e4 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000..0509fd69ec Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png new file mode 100644 index 0000000000..0509fd69ec Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000..90fe568fd9 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png new file mode 100644 index 0000000000..2553905453 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000..0509fd69ec Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png new file mode 100644 index 0000000000..0509fd69ec Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png new file mode 100644 index 0000000000..a20eafe5de Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png new file mode 100644 index 0000000000..c272a18a0f Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_layer_normal_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png new file mode 100644 index 0000000000..2b837d3616 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png new file mode 100644 index 0000000000..f437587c7b Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_line_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_linear_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000..3093276631 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_radial_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png new file mode 100644 index 0000000000..43c5944ad6 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png new file mode 100644 index 0000000000..b4c1cead68 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_text_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png new file mode 100644 index 0000000000..c0f1b02438 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000..096da787f3 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_triangle_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png index 5c4847bd39..4b5b3c48a0 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png index f3fa6ad21a..fc575f5b47 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png index 4300101bf7..30e6841ad2 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png index 910bfc1cd3..ecb662e05e 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png index 967f9dfae1..a883ec8fe0 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png index 326b6ae707..ea913a0d21 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png index bbb5804e91..ab7d197c99 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png index 488c68c665..db3643c7a8 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_128.png index d5497b6cf2..b365edb41b 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_255.png index 991f007fbf..c4632cfd32 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png index e58de56ba8..6a82aa7758 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_255.png index e1dd726e5f..72c5cdcf08 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png index 4a0f487fda..62364ff59a 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png index 51f18610dc..0f621e3bdc 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png index 11bc09c435..7183fbe13c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png index 5631ff1a0b..a652aac645 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_128.png index d8442754b4..de4bb1d2ff 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_255.png index 089e89dfcf..1d3b963c8b 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_128.png index 304a985a59..01b5151f37 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_255.png index 543905a6c0..4e15bed284 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png index f2d33fd92d..c83f8c00fb 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png index f0ba7740a9..abb0afd4b9 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png index a22502dae5..27f5549574 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png index c7bf94db4c..f7f792cb5a 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png index d8442754b4..678b339667 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png index 089e89dfcf..6bccf20485 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png index 5431c832ac..aeb7089c6f 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png index de79500510..fd44af79fd 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png index f2d33fd92d..8cb00431f8 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png index f0ba7740a9..17e12012ba 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png index 2e77d35c38..d1632e4cec 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png index eab2fba503..8e05d9d255 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c b/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c new file mode 100644 index 0000000000..382bce0d26 --- /dev/null +++ b/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c @@ -0,0 +1,44 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" +#include "../../lvgl_private.h" +#include "../demos/lv_demos.h" + +#include "unity/unity.h" + +void setUp(void) +{ + /* Function run before every test */ +} + +void tearDown(void) +{ + /* Function run after every test */ + lv_display_set_color_format(NULL, LV_COLOR_FORMAT_XRGB8888); +} + +void test_render_to_argb8888_premultiplied(void) +{ + lv_display_set_color_format(NULL, LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED); + + lv_opa_t opa_values[2] = {0xff, 0x80}; + uint32_t opa; + for(opa = 0; opa < 2; opa++) { + uint32_t i; + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { + + /*Skip test with transformed indexed images if they are not loaded to RAM*/ + if(LV_BIN_DECODER_RAM_LOAD == 0 && + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_2 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_2)) continue; + + lv_demo_render(i, opa_values[opa]); + + char buf[128]; + lv_snprintf(buf, sizeof(buf), "draw/render/argb8888_premultiplied/demo_render_%s_opa_%d.png", + lv_demo_render_get_scene_name(i), opa_values[opa]); + TEST_ASSERT_EQUAL_SCREENSHOT(buf); + } + } +} + +#endif