diff --git a/Kconfig b/Kconfig index eda178a69c..cdacefa2ec 100644 --- a/Kconfig +++ b/Kconfig @@ -238,6 +238,11 @@ menu "LVGL configuration" bool "Enable support for A8 color format" default y depends on LV_USE_DRAW_SW + + config LV_DRAW_SW_SUPPORT_I1 + bool "Enable support for I1 color format" + default y + depends on LV_USE_DRAW_SW config LV_DRAW_SW_DRAW_UNIT_CNT int "Number of draw units" diff --git a/demos/render/assets/img_render_lvgl_logo_i1.c b/demos/render/assets/img_render_lvgl_logo_i1.c new file mode 100644 index 0000000000..1e55982763 --- /dev/null +++ b/demos/render/assets/img_render_lvgl_logo_i1.c @@ -0,0 +1,73 @@ +#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_I1 +#define LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_I1 +#endif + +static const +LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_I1 +uint8_t img_render_lvgl_logo_i1_map[] = { + + 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff, + + 0x20,0x00,0x00,0x18, + 0xc0,0x00,0x00,0x04, + 0x80,0x00,0x00,0x00, + 0x00,0x00,0x00,0x70, + 0x00,0x00,0x00,0xf0, + 0x00,0x00,0x00,0x60, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00, + 0xff,0x80,0x00,0x00, + 0xff,0xc0,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0x80,0x60,0x00,0x00, + 0xff,0xe0,0x00,0x00, + 0x7f,0x9f,0xf0,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x00, + 0x80,0x60,0x18,0x04, + 0x40,0x00,0x18,0x0c, + +}; + +const lv_image_dsc_t img_render_lvgl_logo_i1 = { + .header.magic = LV_IMAGE_HEADER_MAGIC, + .header.cf = LV_COLOR_FORMAT_I1, + .header.flags = 0, + .header.w = 30, + .header.h = 30, + .header.stride = 4, + .data_size = sizeof(img_render_lvgl_logo_i1_map), + .data = img_render_lvgl_logo_i1_map, +}; + diff --git a/demos/render/assets/img_render_lvgl_logo_i1.png b/demos/render/assets/img_render_lvgl_logo_i1.png new file mode 100644 index 0000000000..241368d6ae Binary files /dev/null and b/demos/render/assets/img_render_lvgl_logo_i1.png differ diff --git a/demos/render/assets/img_render_lvgl_logo_l8.c b/demos/render/assets/img_render_lvgl_logo_l8.c index 14d0908506..46fb6b7bf0 100644 --- a/demos/render/assets/img_render_lvgl_logo_l8.c +++ b/demos/render/assets/img_render_lvgl_logo_l8.c @@ -14,54 +14,58 @@ #ifndef LV_ATTRIBUTE_MEM_ALIGN - #define LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN #endif -#ifndef LV_ATTRIBUTE_IMG_IMG_RENDER_LVGL_LOGO_L8 - #define LV_ATTRIBUTE_IMG_IMG_RENDER_LVGL_LOGO_L8 +#ifndef LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_L8 +#define LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_L8 #endif -const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMG_RENDER_LVGL_LOGO_L8 uint8_t -img_render_lvgl_logo_l8_map[] = { - /*Pixel format: Grayscale 8 bit*/ - 0xfd,0xfd,0xdf,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xcb,0xed,0xfd,0xfd, - 0xfd,0xa8,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x22,0xcf,0xfd, - 0xdf,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x46,0xfc, - 0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x3f,0xbf,0xb1,0x1d,0x1d,0x1d,0xe7, - 0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xb9,0xfd,0xfd,0x8d,0x1d,0x1d,0xe6, - 0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x97,0xfd,0xfa,0x67,0x1d,0x1d,0xe6, - 0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x72,0x64,0x1d,0x1d,0x1d,0xe6, - 0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xe0,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xfd,0xf1,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe1,0x7c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xfa,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xdb,0xfd,0xc7,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xed,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd7,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xf2,0xdd,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xfd,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xf1,0xfd,0xfd,0xf0,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xe6,0xde,0x78,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xfa,0xd5,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xdd,0xfd,0xfa,0xd5,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xdd,0xfd,0xc7,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xee,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xee,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xe6, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xea, - 0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xd2,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xe9,0xcb,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x64,0xfd, - 0xd7,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xf2,0xd7,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0xf2,0xdc,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x56,0xe1,0xfd, - 0xfd,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xee,0xfd,0xfd,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xe9,0xee,0xfd,0xfd,0xed,0xe6,0xe6,0xe6,0xe6,0xe6,0xfa,0xfd,0xfd, +static const +LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_L8 +uint8_t img_render_lvgl_logo_l8_map[] = { + + 0x00,0x00,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x47,0x48,0x47,0x47,0x47,0x46,0x47,0x20,0x00, + 0x02,0x4b,0x2f,0x32,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x2c,0x2a,0x2e,0x3e,0x29, + 0x40,0x2f,0x35,0x36,0x35,0x36,0x36,0x37,0x36,0x35,0x36,0x36,0x35,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x31,0x5e,0x69,0x35,0x2a,0x45, + 0x47,0x32,0x36,0x35,0x36,0x36,0x35,0x36,0x35,0x36,0x36,0x35,0x36,0x35,0x36,0x35,0x37,0x36,0x36,0x36,0x36,0x35,0x37,0x2d,0x7a,0xfb,0xfd,0x9c,0x2c,0x38, + 0x47,0x33,0x35,0x36,0x35,0x36,0x36,0x36,0x36,0x35,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x36,0x35,0x36,0x36,0x37,0x29,0xb1,0xfd,0xfd,0xd8,0x2f,0x39, + 0x47,0x33,0x36,0x36,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x37,0x35,0x36,0x36,0x36,0x36,0x37,0x2f,0x60,0xe7,0xf1,0x7f,0x2d,0x39, + 0x47,0x33,0x36,0x36,0x36,0x36,0x36,0x35,0x36,0x36,0x35,0x36,0x36,0x36,0x35,0x35,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x30,0x43,0x49,0x2f,0x35,0x39, + 0x46,0x33,0x36,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x35,0x36,0x36,0x35,0x36,0x36,0x37,0x36,0x36,0x35,0x36,0x36,0x35,0x36,0x36,0x32,0x31,0x35,0x35,0x39, + 0x49,0x27,0x29,0x2a,0x29,0x2a,0x2a,0x29,0x29,0x2f,0x37,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x35,0x37,0x35,0x35,0x37,0x36,0x36,0x37,0x35,0x36,0x35,0x39, + 0x17,0x41,0x45,0x45,0x45,0x45,0x45,0x44,0x45,0x47,0x2e,0x36,0x35,0x37,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x05,0x35,0x3c,0x3a,0x3a,0x3a,0x3a,0x3d,0x33,0x07,0x49,0x2e,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x35,0x36,0x36,0x35,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x67,0x71,0x72,0x71,0x71,0x71,0x72,0x72,0x6c,0x48,0x32,0x2b,0x36,0x36,0x36,0x35,0x35,0x36,0x36,0x37,0x35,0x36,0x36,0x36,0x36,0x36,0x35,0x35,0x35,0x39, + 0x72,0x77,0x79,0x79,0x79,0x79,0x79,0x79,0x6f,0x5a,0x30,0x2b,0x35,0x37,0x36,0x36,0x36,0x36,0x36,0x35,0x36,0x36,0x35,0x36,0x35,0x36,0x36,0x36,0x35,0x39, + 0x72,0x77,0x79,0x79,0x78,0x79,0x79,0x79,0x70,0x59,0x31,0x2c,0x36,0x37,0x35,0x36,0x36,0x36,0x36,0x35,0x35,0x36,0x35,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x72,0x77,0x79,0x79,0x79,0x79,0x79,0x79,0x70,0x59,0x31,0x2c,0x35,0x36,0x36,0x36,0x37,0x35,0x36,0x36,0x36,0x36,0x35,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x72,0x77,0x79,0x79,0x79,0x79,0x79,0x79,0x70,0x59,0x31,0x2b,0x36,0x36,0x35,0x36,0x36,0x36,0x35,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x35,0x36,0x35,0x39, + 0x72,0x77,0x79,0x79,0x79,0x79,0x78,0x79,0x70,0x59,0x31,0x2c,0x36,0x36,0x36,0x35,0x35,0x36,0x35,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x71,0x77,0x79,0x79,0x78,0x79,0x79,0x79,0x70,0x59,0x32,0x2b,0x36,0x36,0x35,0x36,0x35,0x36,0x36,0x37,0x36,0x36,0x35,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x72,0x71,0x74,0x74,0x74,0x73,0x74,0x74,0x6b,0x5a,0x31,0x23,0x2f,0x2e,0x2f,0x2f,0x2f,0x2d,0x2e,0x32,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x41,0x70,0x72,0x72,0x72,0x72,0x72,0x72,0x6f,0x29,0x0e,0x49,0x46,0x47,0x48,0x48,0x48,0x48,0x48,0x3f,0x2e,0x36,0x35,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x00,0x07,0x11,0x10,0x10,0x10,0x10,0x11,0x07,0x00,0x00,0x01,0x13,0x11,0x11,0x11,0x11,0x11,0x0e,0x0b,0x4b,0x2e,0x36,0x36,0x36,0x36,0x36,0x36,0x35,0x39, + 0x51,0x9d,0xa4,0xa4,0xa4,0xa4,0xa4,0xa4,0x9b,0x2e,0x1a,0x62,0x65,0x65,0x65,0x65,0x65,0x65,0x60,0x52,0x15,0x36,0x34,0x36,0x36,0x36,0x35,0x36,0x35,0x39, + 0x91,0xaf,0xb1,0xb1,0xb1,0xb1,0xb1,0xb1,0xac,0x60,0x35,0x59,0x63,0x63,0x63,0x63,0x63,0x63,0x5d,0x65,0x0d,0x3d,0x32,0x36,0x35,0x36,0x36,0x36,0x35,0x39, + 0x8f,0xb1,0xb3,0xb3,0xb3,0xb3,0xb3,0xb3,0xae,0x5b,0x32,0x5e,0x65,0x65,0x65,0x65,0x65,0x65,0x60,0x65,0x11,0x3f,0x31,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x8d,0xb1,0xb3,0xb3,0xb3,0xb3,0xb3,0xb3,0xad,0x5c,0x32,0x5e,0x65,0x65,0x65,0x65,0x65,0x65,0x60,0x65,0x11,0x3f,0x32,0x36,0x35,0x36,0x36,0x36,0x35,0x39, + 0x8f,0xb1,0xb3,0xb3,0xb3,0xb3,0xb3,0xb3,0xae,0x5c,0x32,0x5e,0x65,0x65,0x65,0x65,0x65,0x65,0x60,0x65,0x11,0x3f,0x32,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x8f,0xb1,0xb3,0xb3,0xb3,0xb3,0xb3,0xb3,0xad,0x5b,0x32,0x5e,0x65,0x65,0x65,0x65,0x65,0x65,0x60,0x65,0x11,0x3f,0x32,0x35,0x36,0x36,0x36,0x36,0x35,0x39, + 0x6e,0xb0,0xb3,0xb3,0xb3,0xb3,0xb3,0xb3,0xae,0x5c,0x32,0x5e,0x65,0x65,0x65,0x65,0x65,0x65,0x5f,0x65,0x11,0x3f,0x32,0x36,0x36,0x36,0x36,0x36,0x33,0x3d, + 0x1b,0x9c,0xaf,0xb1,0xb1,0xb1,0xb1,0xb1,0xad,0x5e,0x35,0x5b,0x65,0x65,0x65,0x65,0x65,0x65,0x5e,0x65,0x11,0x3a,0x31,0x35,0x35,0x35,0x35,0x33,0x26,0x48, + 0x00,0x26,0x8a,0xa7,0xac,0xab,0xab,0xac,0xa3,0x35,0x1c,0x62,0x65,0x65,0x65,0x65,0x65,0x65,0x5e,0x58,0x03,0x49,0x33,0x39,0x39,0x3a,0x38,0x3d,0x49,0x02, }; const lv_image_dsc_t img_render_lvgl_logo_l8 = { + .header.magic = LV_IMAGE_HEADER_MAGIC, .header.cf = LV_COLOR_FORMAT_L8, + .header.flags = 0, .header.w = 30, .header.h = 30, - .data = img_render_lvgl_logo_l8_map, + .header.stride = 30, .data_size = sizeof(img_render_lvgl_logo_l8_map), + .data = img_render_lvgl_logo_l8_map, }; diff --git a/demos/render/assets/img_render_lvgl_logo_l8.png b/demos/render/assets/img_render_lvgl_logo_l8.png index f5db880fbf..230f4b53c2 100644 Binary files a/demos/render/assets/img_render_lvgl_logo_l8.png and b/demos/render/assets/img_render_lvgl_logo_l8.png differ diff --git a/demos/render/lv_demo_render.c b/demos/render/lv_demo_render.c index 182bb69b79..d42ec9cf02 100644 --- a/demos/render/lv_demo_render.c +++ b/demos/render/lv_demo_render.c @@ -336,6 +336,7 @@ 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_argb8888); LV_IMAGE_DECLARE(img_render_lvgl_logo_l8); + LV_IMAGE_DECLARE(img_render_lvgl_logo_i1); const void * srcs[] = { &img_render_lvgl_logo_argb8888, @@ -343,6 +344,7 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) &img_render_lvgl_logo_rgb888, &img_render_lvgl_logo_rgb565, &img_render_lvgl_logo_l8, + &img_render_lvgl_logo_i1, }; const void * names[] = { @@ -351,6 +353,7 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) "RGB\n888", "RGB\n565", "L8", + "I1", }; uint32_t stopAt = startAt + LV_MIN(sizeof(srcs) / sizeof(void *) - startAt, 4); diff --git a/docs/porting/display.rst b/docs/porting/display.rst index e664ce7dd1..82977eb30b 100644 --- a/docs/porting/display.rst +++ b/docs/porting/display.rst @@ -172,7 +172,8 @@ The default color format of the display is set according to :c:macro:`LV_COLOR_D - :c:macro:`LV_COLOR_DEPTH` ``32``: XRGB8888 (4 bytes/pixel) - :c:macro:`LV_COLOR_DEPTH` ``24``: RGB888 (3 bytes/pixel) - :c:macro:`LV_COLOR_DEPTH` ``16``: RGB565 (2 bytes/pixel) -- :c:macro:`LV_COLOR_DEPTH` ``8``: L8 (1 bytes/pixel) Not supported yet +- :c:macro:`LV_COLOR_DEPTH` ``8``: L8 (1 bytes/pixel) +- :c:macro:`LV_COLOR_DEPTH` ``1``: I1 (1 bit/pixel) Only support for horizontal mapped buffers. The ``color_format`` can be changed with :cpp:expr:`lv_display_set_color_depth(display, LV_COLOR_FORMAT_...)`. diff --git a/lv_conf_template.h b/lv_conf_template.h index cf425d17c6..d9e457483f 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -137,6 +137,7 @@ #define LV_DRAW_SW_SUPPORT_L8 1 #define LV_DRAW_SW_SUPPORT_AL88 1 #define LV_DRAW_SW_SUPPORT_A8 1 + #define LV_DRAW_SW_SUPPORT_I1 1 /* Set the number of draw unit. * > 1 requires an operating system enabled in `LV_USE_OS` diff --git a/src/draw/sw/blend/lv_draw_sw_blend.c b/src/draw/sw/blend/lv_draw_sw_blend.c index 8ff672624e..65ad81e761 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.c +++ b/src/draw/sw/blend/lv_draw_sw_blend.c @@ -22,7 +22,9 @@ #if LV_DRAW_SW_SUPPORT_RGB888 #include "lv_draw_sw_blend_to_rgb888.h" #endif - +#if LV_DRAW_SW_SUPPORT_I1 + #include "lv_draw_sw_blend_to_i1.h" +#endif #if LV_USE_DRAW_SW /********************* @@ -73,9 +75,11 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) fill_dsc.mask_buf = NULL; else fill_dsc.mask_buf = blend_dsc->mask_buf; + + fill_dsc.relative_area = blend_area; + lv_area_move(&fill_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); fill_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, blend_area.y1 - layer->buf_area.y1); - if(fill_dsc.mask_buf) { fill_dsc.mask_stride = blend_dsc->mask_stride == 0 ? lv_area_get_width(blend_dsc->mask_area) : blend_dsc->mask_stride; fill_dsc.mask_buf += fill_dsc.mask_stride * (blend_area.y1 - blend_dsc->mask_area->y1) + @@ -112,6 +116,11 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * case LV_COLOR_FORMAT_AL88: lv_draw_sw_blend_color_to_al88(&fill_dsc); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + lv_draw_sw_blend_color_to_i1(&fill_dsc); + break; #endif default: break; @@ -139,11 +148,12 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * image_dsc.src_color_format = blend_dsc->src_color_format; const uint8_t * src_buf = blend_dsc->src_buf; - uint32_t src_px_size = lv_color_format_get_size(blend_dsc->src_color_format); + uint32_t src_px_size = lv_color_format_get_bpp(blend_dsc->src_color_format); src_buf += image_dsc.src_stride * (blend_area.y1 - blend_dsc->src_area->y1); - src_buf += (blend_area.x1 - blend_dsc->src_area->x1) * src_px_size; + src_buf += ((blend_area.x1 - blend_dsc->src_area->x1) * src_px_size) >> 3; image_dsc.src_buf = src_buf; + if(blend_dsc->mask_buf == NULL) image_dsc.mask_buf = NULL; else if(blend_dsc->mask_res == LV_DRAW_SW_MASK_RES_FULL_COVER) image_dsc.mask_buf = NULL; else image_dsc.mask_buf = blend_dsc->mask_buf; @@ -155,6 +165,12 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * (blend_area.x1 - blend_dsc->mask_area->x1); } + image_dsc.relative_area = blend_area; + lv_area_move(&image_dsc.relative_area, -layer->buf_area.x1, -layer->buf_area.y1); + + image_dsc.src_area = *blend_dsc->src_area; + lv_area_move(&image_dsc.src_area, -layer->buf_area.x1, -layer->buf_area.y1); + image_dsc.dest_buf = lv_draw_layer_go_to_xy(layer, blend_area.x1 - layer->buf_area.x1, blend_area.y1 - layer->buf_area.y1); @@ -189,6 +205,11 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t * case LV_COLOR_FORMAT_AL88: lv_draw_sw_blend_image_to_al88(&image_dsc); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + lv_draw_sw_blend_image_to_i1(&image_dsc); + break; #endif default: break; diff --git a/src/draw/sw/blend/lv_draw_sw_blend.h b/src/draw/sw/blend/lv_draw_sw_blend.h index c1b1edca0c..eada7ba480 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.h +++ b/src/draw/sw/blend/lv_draw_sw_blend.h @@ -53,6 +53,7 @@ typedef struct { int32_t mask_stride; lv_color_t color; lv_opa_t opa; + lv_area_t relative_area; } _lv_draw_sw_blend_fill_dsc_t; typedef struct { @@ -67,6 +68,8 @@ typedef struct { lv_color_format_t src_color_format; lv_opa_t opa; lv_blend_mode_t blend_mode; + lv_area_t relative_area; /**< The blend area relative to the layer's buffer area. */ + lv_area_t src_area; /**< The original src area. */ } _lv_draw_sw_blend_image_dsc_t; /********************** diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c index b8647695b2..81d39de01b 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_al88.c @@ -50,6 +50,12 @@ typedef struct { static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_RGB565 @@ -168,6 +174,22 @@ static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_16a_16a_mix(lv_color16a_ #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + /********************** * GLOBAL FUNCTIONS **********************/ @@ -315,6 +337,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(_lv_draw_sw_blend_imag case LV_COLOR_FORMAT_AL88: al88_image_blend(dsc); break; +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; +#endif default: LV_LOG_WARN("Not supported source color format"); break; @@ -324,9 +351,100 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_al88(_lv_draw_sw_blend_imag /********************** * STATIC FUNCTIONS **********************/ +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_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_color16a_t * dest_buf_al88 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = 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_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_I1_BLEND_NORMAL_TO_AL88(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_al88[x].lumi = get_bit(src_buf_i1, x) * 255; + dest_buf_al88[x].alpha = 255; + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = opa; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = mask_buf[x]; + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_AL88_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + lv_color_16a_16a_mix(src_color, &dest_buf_al88[x], &cache); + } + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + lv_color16a_t src_color; + src_color.lumi = get_bit(src_buf_i1, x) * 255; + if(mask_buf == NULL) src_color.alpha = opa; + else src_color.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_al88[x], src_color, dsc->blend_mode, &cache); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_al88 = drawbuf_next_row(dest_buf_al88, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } +} +#endif #if LV_DRAW_SW_SUPPORT_L8 - static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; @@ -877,6 +995,15 @@ void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) cache->ratio_saved = 255; } +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color16a_t * dest, lv_color16a_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) { 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 4c82a70e4b..76d308f851 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 @@ -50,6 +50,12 @@ typedef struct { static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + #if LV_DRAW_SW_SUPPORT_L8 static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #endif @@ -180,6 +186,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_I1_BLEND_NORMAL_TO_ARGB8888 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + /********************** * GLOBAL FUNCTIONS **********************/ @@ -323,6 +345,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_ case LV_COLOR_FORMAT_AL88: al88_image_blend(dsc); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; #endif default: LV_LOG_WARN("Not supported source color format"); @@ -334,8 +361,100 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_ * STATIC FUNCTIONS **********************/ -#if LV_DRAW_SW_SUPPORT_AL88 +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_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 uint8_t * src_buf_i1 = 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_I1_BLEND_NORMAL_TO_ARGB8888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_c32[dest_x].alpha = chan_val; + dest_buf_c32[dest_x].red = chan_val; + dest_buf_c32[dest_x].green = chan_val; + dest_buf_c32[dest_x].blue = chan_val; + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], opa); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], mask_buf[src_x]); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_32_mix(chan_val, &dest_buf_c32[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_c32[dest_x], src_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_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; @@ -898,6 +1017,15 @@ void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache) cache->ratio_saved = 255; } +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src, lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache) { diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c new file mode 100644 index 0000000000..a500485215 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c @@ -0,0 +1,1117 @@ +/** + * @file lv_draw_sw_blend_to_i1.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_i1.h" +#if LV_USE_DRAW_SW + +#include "lv_draw_sw_blend.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#include "../../../stdlib/lv_string.h" + +#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON + #include "neon/lv_blend_neon.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM + #include "helium/lv_blend_helium.h" +#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM + #include LV_DRAW_SW_ASM_CUSTOM_INCLUDE +#endif + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_L8 + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 + static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size); +#endif + +#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 inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_8_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_buf, int32_t dest_x, + lv_color32_t src, + lv_blend_mode_t mode); + + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ set_bit(uint8_t * buf, int32_t bit_idx); + +static inline void /* LV_ATTRIBUTE_FAST_MEM */ clear_bit(uint8_t * buf, int32_t bit_idx); + +static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#define I1_LUM_THRESHOLD 127 + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1 + #define LV_DRAW_SW_COLOR_BLEND_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_i1(_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; + + uint8_t src_color = lv_color_luminance(dsc->color) / (I1_LUM_THRESHOLD + 1); + uint8_t * dest_buf = dsc->dest_buf; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + /* Simple fill */ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + if(src_color) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /* Opacity only */ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_OPA(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t new_bit = (opa * src_color + (255 - opa) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + } + } + } + /* Masked with full opacity */ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_WITH_MASK(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t mask_val = mask[x]; + if(mask_val == LV_OPA_TRANSP) continue; + if(mask_val == LV_OPA_COVER) { + if(src_color) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + else { + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t new_bit = (mask_val * src_color + (255 - mask_val) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } + /* Masked with opacity */ + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_I1_MIX_MASK_OPA(dsc)) { + for(int32_t y = 0; y < h; y++) { + for(int32_t x = 0; x < w; x++) { + uint8_t mask_val = mask[x]; + if(mask_val == LV_OPA_TRANSP) continue; + uint8_t * dest_bit = &dest_buf[(x + bit_ofs) / 8]; + uint8_t current_bit = (*dest_bit >> (7 - ((x + bit_ofs) % 8))) & 0x01; + uint8_t blended_opa = (mask_val * opa) / 255; + uint8_t new_bit = (blended_opa * src_color + (255 - blended_opa) * current_bit) / 255; + if(new_bit) { + set_bit(dest_buf, x + bit_ofs); + } + else { + clear_bit(dest_buf, x + bit_ofs); + } + } + dest_buf = drawbuf_next_row(dest_buf, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(_lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { +#if LV_DRAW_SW_SUPPORT_RGB565 + case LV_COLOR_FORMAT_RGB565: + rgb565_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_RGB888 + case LV_COLOR_FORMAT_RGB888: + rgb888_image_blend(dsc, 3); + break; +#endif +#if LV_DRAW_SW_SUPPORT_XRGB8888 + case LV_COLOR_FORMAT_XRGB8888: + rgb888_image_blend(dsc, 4); + break; +#endif +#if LV_DRAW_SW_SUPPORT_ARGB8888 + case LV_COLOR_FORMAT_ARGB8888: + argb8888_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + case LV_COLOR_FORMAT_AL88: + al88_image_blend(dsc); + break; +#endif + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; + default: + LV_LOG_WARN("Not supported source color format"); + break; + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void LV_ATTRIBUTE_FAST_MEM i1_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; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = 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; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(get_bit(src_buf_i1, src_x)) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blended = (src * opa + dest * (255 - opa)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t mask_val = mask_buf[src_x]; + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blended = (src * mask_val + dest * (255 - mask_val)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t mask_val = mask_buf[src_x]; + if(mask_val == LV_OPA_TRANSP) continue; + uint8_t src = get_bit(src_buf_i1, src_x); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs); + uint8_t blend_opa = LV_OPA_MIX2(mask_val, opa); + uint8_t blended = (src * blend_opa + dest * (255 - blend_opa)); + if(blended > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, 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++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} + +#if LV_DRAW_SW_SUPPORT_L8 +static void LV_ATTRIBUTE_FAST_MEM l8_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; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_l8 = 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 src_x, dest_x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + if(src_buf_l8[src_x] > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_l8[src_x], &dest_val, opa); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src_luminance = src_buf_l8[src_x]; + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_luminance, &dest_val, mask_buf[src_x]); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src_luminance = src_buf_l8[src_x]; + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_luminance, &dest_val, LV_OPA_MIX2(mask_buf[src_x], opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0; src_x < w; src_x++) { + src_argb.red = src_buf_l8[src_x]; + src_argb.green = src_buf_l8[src_x]; + src_argb.blue = src_buf_l8[src_x]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(dest_buf_i1, src_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_l8 = drawbuf_next_row(src_buf_l8, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 +static void LV_ATTRIBUTE_FAST_MEM al88_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; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16a_t * src_buf_al88 = 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; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, src_buf_al88[src_x].alpha); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[src_x])); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_AL88_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t dest_val = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src_buf_al88[src_x].lumi, &dest_val, LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa)); + if(dest_val > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, 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++, src_x++) { + src_argb.red = src_buf_al88[src_x].lumi; + src_argb.green = src_buf_al88[src_x].lumi; + src_argb.blue = src_buf_al88[src_x].lumi; + if(mask_buf == NULL) src_argb.alpha = LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa); + else src_argb.alpha = LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[src_x], opa); + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + } + } +} +#endif + +#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; + uint8_t * dest_buf_i1 = 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 x; + int32_t y; + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + 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_I1(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, src_buf_c32[x].alpha); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, 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_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(opa, src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, 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_I1_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[x], src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, 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_I1_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint8_t src = lv_color32_luminance(src_buf_c32[x]); + uint8_t dest = get_bit(dest_buf_i1, x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX3(opa, mask_buf[x], src_buf_c32[x].alpha)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, 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++) { + lv_color32_t color_argb = src_buf_c32[x]; + 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_non_normal_pixel(dest_buf_i1, x + bit_ofs, color_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_c32 = drawbuf_next_row(src_buf_c32, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB888 +static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, + const uint8_t src_px_size) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint8_t * dest_buf_i1 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_rgb888 = 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; + + + int32_t bit_ofs = dsc->relative_area.x1 % 8; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + /*Special case*/ + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + if(src > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, opa); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x += src_px_size) { + uint8_t src = lv_color24_luminance(&src_buf_rgb888[src_x]); + uint8_t dest = get_bit(dest_buf_i1, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_i1, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_i1, dest_x + bit_ofs); + } + } + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, 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; dest_x < w; dest_x++, src_x += src_px_size) { + src_argb.red = src_buf_rgb888[src_x + 2]; + src_argb.green = src_buf_rgb888[src_x + 1]; + src_argb.blue = src_buf_rgb888[src_x + 0]; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + + blend_non_normal_pixel(dest_buf_i1, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_i1 = drawbuf_next_row(dest_buf_i1, dest_stride); + src_buf_rgb888 = drawbuf_next_row(src_buf_rgb888, src_stride); + } + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_RGB565 +static void LV_ATTRIBUTE_FAST_MEM rgb565_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; + uint8_t * dest_buf_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const lv_color16_t * src_buf_c16 = (const lv_color16_t *)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 bit_ofs = dsc->relative_area.x1 % 8; + + int32_t src_x; + int32_t dest_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_RGB565_BLEND_NORMAL_TO_I1(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + if(src > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, opa); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_WITH_MASK(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, mask_buf[mask_x]); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(dsc)) { + uint32_t mask_x; + for(y = 0; y < h; y++) { + for(mask_x = 0, dest_x = 0, src_x = 0; dest_x < w; mask_x++, dest_x++, src_x++) { + uint8_t src = lv_color16_luminance(src_buf_c16[src_x]); + uint8_t dest = get_bit(dest_buf_u8, dest_x + bit_ofs) * 255; + lv_color_8_8_mix(src, &dest, LV_OPA_MIX2(mask_buf[mask_x], opa)); + if(dest > I1_LUM_THRESHOLD) { + set_bit(dest_buf_u8, dest_x + bit_ofs); + } + else { + clear_bit(dest_buf_u8, dest_x + bit_ofs); + } + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; src_x++, dest_x++) { + src_argb.red = (src_buf_c16[src_x].red * 2106) >> 8; + src_argb.green = (src_buf_c16[src_x].green * 1037) >> 8; + src_argb.blue = (src_buf_c16[src_x].blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + + blend_non_normal_pixel(dest_buf_u8, dest_x + bit_ofs, src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_c16 = drawbuf_next_row(src_buf_c16, src_stride); + } + } +} +#endif + +static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest_buf, int32_t dest_x, lv_color32_t src, + lv_blend_mode_t mode) +{ + uint8_t res; + int32_t src_lumi = lv_color32_luminance(src); + uint8_t dest_lumi = get_bit(dest_buf, dest_x) * 255; + switch(mode) { + case LV_BLEND_MODE_ADDITIVE: + res = LV_MIN(dest_lumi + src_lumi, 255); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = LV_MAX(dest_lumi - src_lumi, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = (dest_lumi * src_lumi) >> 8; + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", mode); + return; + } + + lv_color_8_8_mix(res, &dest_lumi, src.alpha); + if(dest_lumi > I1_LUM_THRESHOLD) { + set_bit(dest_buf, dest_x); + } + else { + clear_bit(dest_buf, dest_x); + } +} + +static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uint8_t * dest, uint8_t mix) +{ + + if(mix == 0) return; + + if(mix >= LV_OPA_MAX) { + *dest = src; + } + else { + lv_opa_t mix_inv = 255 - mix; + *dest = (uint32_t)((uint32_t)src * mix + dest[0] * mix_inv) >> 8; + } +} + +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 set_bit(uint8_t * buf, int32_t bit_idx) +{ + buf[bit_idx / 8] |= (1 << (7 - (bit_idx % 8))); +} + +static inline void LV_ATTRIBUTE_FAST_MEM clear_bit(uint8_t * buf, int32_t bit_idx) +{ + buf[bit_idx / 8] &= ~(1 << (7 - (bit_idx % 8))); +} + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h new file mode 100644 index 0000000000..7a396961f6 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_i1.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_I1_H +#define LV_DRAW_SW_BLEND_I1_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_i1(_lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_i1(_lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_I1_H*/ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c index 23a405e12e..403299e5f1 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_l8.c @@ -38,6 +38,12 @@ * STATIC PROTOTYPES **********************/ +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #if LV_DRAW_SW_SUPPORT_AL88 @@ -152,6 +158,22 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + /********************** * GLOBAL FUNCTIONS **********************/ @@ -288,6 +310,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(_lv_draw_sw_blend_image_ case LV_COLOR_FORMAT_AL88: al88_image_blend(dsc); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; #endif default: LV_LOG_WARN("Not supported source color format"); @@ -299,6 +326,94 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(_lv_draw_sw_blend_image_ * STATIC FUNCTIONS **********************/ +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_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; + uint8_t * dest_buf_l8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = 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_I1_BLEND_NORMAL_TO_L8(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], opa); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], mask_buf[src_x]); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x++, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_8_mix(chan_val, &dest_buf_l8[dest_x], LV_OPA_MIX2(mask_buf[src_x], opa)); + } + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, 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++, src_x++) { + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[dest_x], opa); + blend_non_normal_pixel(&dest_buf_l8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_l8 = drawbuf_next_row(dest_buf_l8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + static void LV_ATTRIBUTE_FAST_MEM l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; @@ -741,6 +856,16 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_color_8_8_mix(const uint8_t src, uin } } + +#if LV_DRAW_SW_SUPPORT_I1 + +static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t bit_idx) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#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; 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 be82fee47b..cf1ff8ea06 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 @@ -42,6 +42,12 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + #if LV_DRAW_SW_SUPPORT_L8 static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc); #endif @@ -169,6 +175,22 @@ 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_I1_BLEND_NORMAL_TO_RGB565 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + /********************** * GLOBAL FUNCTIONS **********************/ @@ -367,6 +389,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_im case LV_COLOR_FORMAT_AL88: al88_image_blend(dsc); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc); + break; #endif default: LV_LOG_WARN("Not supported source color format"); @@ -378,8 +405,124 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_im * STATIC FUNCTIONS **********************/ -#if LV_DRAW_SW_SUPPORT_AL88 +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_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_i1 = 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_I1_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++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = l8_to_rgb565(chan_val); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_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++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_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++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], mask_buf[dest_x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_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++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u16[dest_x] = lv_color_8_16_mix(chan_val, dest_buf_u16[dest_x], LV_OPA_MIX2(mask_buf[dest_x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint16_t res = 0; + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + // Additive blending mode + res = (LV_MIN(dest_buf_u16[dest_x] + l8_to_rgb565(chan_val), 0xFFFF)); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + // Subtractive blending mode + res = (LV_MAX(dest_buf_u16[dest_x] - l8_to_rgb565(chan_val), 0)); + break; + case LV_BLEND_MODE_MULTIPLY: + // Multiply blending mode + res = ((((dest_buf_u16[dest_x] >> 11) * (l8_to_rgb565(chan_val) >> 3)) & 0x1F) << 11) | + ((((dest_buf_u16[dest_x] >> 5) & 0x3F) * ((l8_to_rgb565(chan_val) >> 2) & 0x3F) >> 6) << 5) | + (((dest_buf_u16[dest_x] & 0x1F) * (l8_to_rgb565(chan_val) & 0x1F)) >> 5); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = res; + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_16_16_mix(res, dest_buf_u16[dest_x], opa); + } + 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_MIX2(mask_buf[dest_x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc) { int32_t w = dsc->dest_w; @@ -988,6 +1131,15 @@ 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) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) { return (void *)((uint8_t *)buf + stride); 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 c0be677211..245730bdea 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 @@ -42,6 +42,12 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif +#if LV_DRAW_SW_SUPPORT_I1 + static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); + + static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, int32_t bit_idx); +#endif + #if LV_DRAW_SW_SUPPORT_L8 static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size); #endif @@ -155,6 +161,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_I1_BLEND_NORMAL_TO_888 + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + /********************** * GLOBAL FUNCTIONS **********************/ @@ -317,6 +339,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_im case LV_COLOR_FORMAT_AL88: al88_image_blend(dsc, dest_px_size); break; +#endif +#if LV_DRAW_SW_SUPPORT_I1 + case LV_COLOR_FORMAT_I1: + i1_image_blend(dsc, dest_px_size); + break; #endif default: LV_LOG_WARN("Not supported source color format"); @@ -328,8 +355,97 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_im * STATIC FUNCTIONS **********************/ -#if LV_DRAW_SW_SUPPORT_AL88 +#if LV_DRAW_SW_SUPPORT_I1 +static void LV_ATTRIBUTE_FAST_MEM i1_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_u8 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_i1 = 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_I1_BLEND_NORMAL_TO_888(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + dest_buf_u8[dest_x + 2] = chan_val; + dest_buf_u8[dest_x + 1] = chan_val; + dest_buf_u8[dest_x + 0] = chan_val; + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_I1_BLEND_NORMAL_TO_888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; src_x < w; dest_x += dest_px_size, src_x++) { + uint8_t chan_val = get_bit(src_buf_i1, src_x) * 255; + lv_color_8_24_mix(chan_val, &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + 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_argb; + src_argb.red = get_bit(src_buf_i1, src_x) * 255; + src_argb.green = src_argb.red; + src_argb.blue = src_argb.red; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[src_x], opa); + blend_non_normal_pixel(&dest_buf_u8[dest_x], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 = drawbuf_next_row(dest_buf_u8, dest_stride); + src_buf_i1 = drawbuf_next_row(src_buf_i1, src_stride); + } + } +} +#endif + +#if LV_DRAW_SW_SUPPORT_AL88 static void LV_ATTRIBUTE_FAST_MEM al88_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size) { int32_t w = dsc->dest_w; @@ -849,6 +965,16 @@ 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) +{ + return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; +} + +#endif + + static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride) { return (void *)((uint8_t *)buf + stride); diff --git a/src/draw/sw/lv_draw_sw.c b/src/draw/sw/lv_draw_sw.c index 60fa6dfbdf..ef173efba8 100644 --- a/src/draw/sw/lv_draw_sw.c +++ b/src/draw/sw/lv_draw_sw.c @@ -226,6 +226,37 @@ void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) } +void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size) +{ + if(buf == NULL) return; + + uint8_t * byte_buf = (uint8_t *)buf; + uint32_t i; + + /*Make the buffer aligned*/ + while(((uintptr_t)(byte_buf) & (sizeof(int) - 1)) && buf_size > 0) { + *byte_buf = ~(*byte_buf); + byte_buf++; + buf_size--; + } + + if(buf_size >= sizeof(uint32_t)) { + uint32_t * aligned_addr = (uint32_t *)byte_buf; + uint32_t word_count = buf_size / 4; + + for(i = 0; i < word_count; ++i) { + aligned_addr[i] = ~aligned_addr[i]; + } + + byte_buf = (uint8_t *)(aligned_addr + word_count); + buf_size = buf_size % sizeof(uint32_t); + } + + for(i = 0; i < buf_size; ++i) { + byte_buf[i] = ~byte_buf[i]; + } +} + void lv_draw_sw_rotate(const void * src, void * dest, int32_t src_width, int32_t src_height, int32_t src_stride, int32_t dest_stride, lv_display_rotation_t rotation, lv_color_format_t color_format) { diff --git a/src/draw/sw/lv_draw_sw.h b/src/draw/sw/lv_draw_sw.h index a97665be81..e549ec39b3 100644 --- a/src/draw/sw/lv_draw_sw.h +++ b/src/draw/sw/lv_draw_sw.h @@ -179,6 +179,16 @@ void lv_draw_sw_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_task_dsc */ void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px); +/** + * Invert a draw buffer in the I1 color format. + * Conventionally, a bit is set to 1 during blending if the luminance is greater than 127. + * Depending on the display controller used, you might want to have different behavior. + * The inversion will be performed in place. + * @param buf pointer to the buffer to be inverted + * @param buf_size size of the buffer in bytes + */ +void lv_draw_sw_i1_invert(void * buf, uint32_t buf_size); + /** * Rotate a buffer into another buffer * @param src the source buffer diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 8f3dfc9fb6..2c19860925 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -426,6 +426,17 @@ #define LV_DRAW_SW_SUPPORT_A8 1 #endif #endif + #ifndef LV_DRAW_SW_SUPPORT_I1 + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_I1 + #define LV_DRAW_SW_SUPPORT_I1 CONFIG_LV_DRAW_SW_SUPPORT_I1 + #else + #define LV_DRAW_SW_SUPPORT_I1 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_I1 1 + #endif + #endif /* Set the number of draw unit. * > 1 requires an operating system enabled in `LV_USE_OS` diff --git a/src/others/snapshot/lv_snapshot.c b/src/others/snapshot/lv_snapshot.c index 28fca5b654..07d0950b07 100644 --- a/src/others/snapshot/lv_snapshot.c +++ b/src/others/snapshot/lv_snapshot.c @@ -81,6 +81,7 @@ lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, l case LV_COLOR_FORMAT_XRGB8888: case LV_COLOR_FORMAT_ARGB8888: case LV_COLOR_FORMAT_L8: + case LV_COLOR_FORMAT_I1: break; default: LV_LOG_WARN("Not supported color format"); 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 db07b87c43..bfac353b3f 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 1b6c70471c..b045840d82 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_2_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_2_opa_128.png index 2a88492a46..c97c4140c4 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 36f5edc1f0..601a470c72 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_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_2_opa_128.png index d7aa743448..c84f1cf180 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 28863049b6..bcb2b80ab8 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_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png index c9a8d0832d..abbb45c538 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 391d21eead..2d22bfc1c6 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/i1/demo_render_arc_image_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_192.png new file mode 100644 index 0000000000..2b5b4b25b4 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000..6bbcaaee4c Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_arc_image_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_192.png new file mode 100644 index 0000000000..7b95fae380 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_255.png new file mode 100644 index 0000000000..7b95fae380 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_arc_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_192.png new file mode 100644 index 0000000000..37721ec571 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_255.png new file mode 100644 index 0000000000..8d6eba6a8b Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_blend_mode_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_border_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_border_opa_192.png new file mode 100644 index 0000000000..7157961b75 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_border_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_border_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_border_opa_255.png new file mode 100644 index 0000000000..7157961b75 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_border_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_192.png new file mode 100644 index 0000000000..e03d8878a3 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_255.png new file mode 100644 index 0000000000..f1f5fe2a69 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_box_shadow_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_192.png new file mode 100644 index 0000000000..753dac9c8d Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000..4c48e18687 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_conical_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_192.png new file mode 100644 index 0000000000..151f952b62 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_fill_opa_255.png new file mode 100644 index 0000000000..788ae7233e Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_fill_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 new file mode 100644 index 0000000000..da136154c8 Binary files /dev/null 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 new file mode 100644 index 0000000000..8af8e3068e Binary files /dev/null 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 new file mode 100644 index 0000000000..7f668890b6 Binary files /dev/null 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 new file mode 100644 index 0000000000..8a2e3f1ebe Binary files /dev/null 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 new file mode 100644 index 0000000000..86f31be366 Binary files /dev/null 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 new file mode 100644 index 0000000000..c01ba9587e Binary files /dev/null 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 new file mode 100644 index 0000000000..462687ddf6 Binary files /dev/null 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 new file mode 100644 index 0000000000..095a4fa198 Binary files /dev/null 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/i1/demo_render_layer_normal_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_192.png new file mode 100644 index 0000000000..5e26124fbd Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_255.png new file mode 100644 index 0000000000..743e98aa7c Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_layer_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_line_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_192.png new file mode 100644 index 0000000000..7b95fae380 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_line_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_255.png new file mode 100644 index 0000000000..7b95fae380 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_line_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_192.png new file mode 100644 index 0000000000..75907937d3 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000..9314b4cd62 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_linear_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_192.png new file mode 100644 index 0000000000..d5437fd2b5 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000..1bdcb9c66e Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_radial_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_text_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_text_opa_192.png new file mode 100644 index 0000000000..913d65a456 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_text_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_text_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_text_opa_255.png new file mode 100644 index 0000000000..913d65a456 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_text_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_192.png new file mode 100644 index 0000000000..26d4fc46bf Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000..c4d15fed95 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_triangle_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 0e8f91d9b6..5e886bbc61 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 4273574974..944e61de79 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_2_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_2_opa_128.png index 63cd21d55f..5008f1852a 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 e17bd361ba..2d590056f7 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_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_2_opa_128.png index 69389766e1..8e0ade0426 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 72325de458..1a194b099f 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_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png index bdf4d94af4..7093869bff 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 bba0a89f96..3f37b8c1c0 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_2_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_2_opa_128.png index d7aa743448..c84f1cf180 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 28863049b6..ef68b95286 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_2_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png index c9a8d0832d..aae2c1eb33 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 31dddde126..64270ea7fa 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_2_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png index d7aa743448..c84f1cf180 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 28863049b6..ef68b95286 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_2_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png index c9a8d0832d..aae2c1eb33 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 31dddde126..64270ea7fa 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/al88/demo_render_arc_image_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_128.png deleted file mode 100644 index 8f311ca657..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png deleted file mode 100644 index a9d94ba79b..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_image_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_128.png deleted file mode 100644 index b22972d272..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_255.png deleted file mode 100644 index 0f1e631870..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_arc_normal_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png deleted file mode 100644 index 48f37d5501..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_255.png deleted file mode 100644 index db9e1acceb..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_blend_mode_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png deleted file mode 100644 index 32074b7deb..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png deleted file mode 100644 index a3d8407f44..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_border_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_128.png deleted file mode 100644 index a2ca505d0c..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_255.png deleted file mode 100644 index ff313a7ab3..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_box_shadow_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png deleted file mode 100644 index ba56e552f7..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png deleted file mode 100644 index 75ccdad452..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_conical_gradient_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png deleted file mode 100644 index 5442807449..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png deleted file mode 100644 index 2615e12b12..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_fill_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_128.png deleted file mode 100644 index 710f247e9d..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_255.png deleted file mode 100644 index 54926566da..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_1_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png deleted file mode 100644 index 92ddaec467..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png deleted file mode 100644 index 7dd9f11358..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_normal_2_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png deleted file mode 100644 index f18d43a5a9..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_255.png deleted file mode 100644 index dbcb5dea87..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_1_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png deleted file mode 100644 index 4ac4d25f1b..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_255.png deleted file mode 100644 index 77d5fdc7a6..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_image_recolor_2_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png deleted file mode 100644 index ba4bd75608..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_255.png deleted file mode 100644 index 572a503a6d..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_layer_normal_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png deleted file mode 100644 index f7e6ec83fb..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png deleted file mode 100644 index 053dbba522..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_line_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_128.png deleted file mode 100644 index 8a9f2ad6c9..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png deleted file mode 100644 index 6a0e4bd42d..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_linear_gradient_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png deleted file mode 100644 index 072ec6feda..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png deleted file mode 100644 index d43c9e635b..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_radial_gradient_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png deleted file mode 100644 index 0a12a45074..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_255.png deleted file mode 100644 index bf1e6fc7a4..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_text_opa_255.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_128.png deleted file mode 100644 index 91c21a9c95..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_128.png and /dev/null differ diff --git a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png deleted file mode 100644 index 194fd278a1..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/al88/demo_render_triangle_opa_255.png and /dev/null 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 350e93dcab..175ed441ba 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 516003afb6..ea06ded841 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_128.png index f161594ef1..a0e1b84fbb 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 12cdd7e5ee..0b695a9f43 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/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 deleted file mode 100644 index 8e9ff999e1..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_128.png and /dev/null 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 deleted file mode 100644 index f37d36b717..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_1_opa_255.png and /dev/null 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 deleted file mode 100644 index 0e8f91d9b6..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png and /dev/null 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 deleted file mode 100644 index 4273574974..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png and /dev/null 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 deleted file mode 100644 index 2643f82c60..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_128.png and /dev/null 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 deleted file mode 100644 index 116da90c67..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_1_opa_255.png and /dev/null 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 deleted file mode 100644 index 63cd21d55f..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png and /dev/null 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 deleted file mode 100644 index e17bd361ba..0000000000 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png and /dev/null 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 b7d6e863dc..bbbed7150b 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 4cb7334df6..b570b76c1d 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_2_opa_128.png index 7a6c87afe0..fa676393b7 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 670c12403b..ed0e23c9eb 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_2_opa_128.png index 350e93dcab..bc4fb8f9f1 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 516003afb6..95f42839ab 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_2_opa_128.png index f161594ef1..a8f890df4f 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 f9ed806330..35d473afad 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_2_opa_128.png index 350e93dcab..175ed441ba 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 516003afb6..ea06ded841 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_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_2_opa_128.png index f161594ef1..ddbfe13ee4 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 f9ed806330..f4846c0bcd 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_draw_sw_rotate.c b/tests/src/test_cases/draw/test_draw_sw_post_process.c similarity index 88% rename from tests/src/test_cases/draw/test_draw_sw_rotate.c rename to tests/src/test_cases/draw/test_draw_sw_post_process.c index 79bf43862e..8371b0ab3c 100644 --- a/tests/src/test_cases/draw/test_draw_sw_rotate.c +++ b/tests/src/test_cases/draw/test_draw_sw_post_process.c @@ -224,4 +224,27 @@ void test_rotate270_ARGB8888(void) TEST_ASSERT_EQUAL_UINT8_ARRAY(expectedArray, dstArray, sizeof(dstArray)); } + + +void test_invert(void) +{ + uint8_t expected_buf[10] = {0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6}; + + /*Aligned start and aligned end*/ + uint8_t buf1[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; + lv_draw_sw_i1_invert(buf1, 8); + TEST_ASSERT_EQUAL_UINT8_ARRAY(expected_buf, buf1, 8); + + /*Unaligned start and unaligned end*/ + uint8_t buf2[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; + lv_draw_sw_i1_invert(&buf2[3], 6); + TEST_ASSERT_EQUAL_UINT8_ARRAY(&expected_buf[3], &buf2[3], 6); + + /*Small buffer*/ + uint8_t buf3[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; + lv_draw_sw_i1_invert(&buf3[3], 2); + TEST_ASSERT_EQUAL_UINT8_ARRAY(&expected_buf[3], &buf3[3], 2); +} + + #endif diff --git a/tests/src/test_cases/draw/test_render_to_al88.c b/tests/src/test_cases/draw/test_render_to_al88.c index 24d89e3ff2..76fd1ace42 100644 --- a/tests/src/test_cases/draw/test_render_to_al88.c +++ b/tests/src/test_cases/draw/test_render_to_al88.c @@ -17,6 +17,9 @@ void tearDown(void) void test_render_to_al88(void) { +#if LV_USE_DRAW_VG_LITE + TEST_PASS(); +#else lv_display_set_color_format(NULL, LV_COLOR_FORMAT_AL88); lv_opa_t opa_values[2] = {0xff, 0x80}; @@ -24,6 +27,12 @@ void test_render_to_al88(void) 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]; @@ -32,6 +41,7 @@ void test_render_to_al88(void) TEST_ASSERT_EQUAL_SCREENSHOT(buf); } } +#endif } #endif diff --git a/tests/src/test_cases/draw/test_render_to_argb8888.c b/tests/src/test_cases/draw/test_render_to_argb8888.c index fe02d90e35..aef82831ae 100644 --- a/tests/src/test_cases/draw/test_render_to_argb8888.c +++ b/tests/src/test_cases/draw/test_render_to_argb8888.c @@ -24,6 +24,12 @@ void test_render_to_argb8888(void) 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]; diff --git a/tests/src/test_cases/draw/test_render_to_i1.c b/tests/src/test_cases/draw/test_render_to_i1.c new file mode 100644 index 0000000000..313f2a6fb2 --- /dev/null +++ b/tests/src/test_cases/draw/test_render_to_i1.c @@ -0,0 +1,42 @@ +#if LV_BUILD_TEST +#include "../lvgl.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_i1(void) +{ +#if LV_BIN_DECODER_RAM_LOAD && LV_USE_DRAW_VG_LITE == 0 + lv_display_set_color_format(NULL, LV_COLOR_FORMAT_I1); + + lv_opa_t opa_values[2] = {0xff, 0xc0}; + uint32_t opa; + for(opa = 0; opa < 2; opa++) { + uint32_t i; + for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { + lv_demo_render(i, opa_values[opa]); + + char buf[128]; + lv_snprintf(buf, sizeof(buf), "draw/render/i1/demo_render_%s_opa_%d.png", + lv_demo_render_get_scene_name(i), opa_values[opa]); + TEST_ASSERT_EQUAL_SCREENSHOT(buf); + } + } +#else + /*Without LV_BIN_DECODER_RAM_LOAD can't test rotated images*/ + TEST_PASS(); +#endif +} + +#endif diff --git a/tests/src/test_cases/draw/test_render_to_l8.c b/tests/src/test_cases/draw/test_render_to_l8.c index c5c194b80b..2098dd8602 100644 --- a/tests/src/test_cases/draw/test_render_to_l8.c +++ b/tests/src/test_cases/draw/test_render_to_l8.c @@ -17,6 +17,9 @@ void tearDown(void) void test_render_to_l8(void) { +#if LV_USE_DRAW_VG_LITE + TEST_PASS(); +#else lv_display_set_color_format(NULL, LV_COLOR_FORMAT_L8); lv_opa_t opa_values[2] = {0xff, 0x80}; @@ -26,12 +29,18 @@ void test_render_to_l8(void) for(i = 0; i < _LV_DEMO_RENDER_SCENE_NUM; i++) { lv_demo_render(i, opa_values[opa]); + /*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; + char buf[128]; lv_snprintf(buf, sizeof(buf), "draw/render/l8/demo_render_%s_opa_%d.png", lv_demo_render_get_scene_name(i), opa_values[opa]); TEST_ASSERT_EQUAL_SCREENSHOT(buf); } } +#endif } #endif diff --git a/tests/src/test_cases/draw/test_render_to_rgb565.c b/tests/src/test_cases/draw/test_render_to_rgb565.c index fc00f8188f..d9b53706a0 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb565.c +++ b/tests/src/test_cases/draw/test_render_to_rgb565.c @@ -24,6 +24,13 @@ void test_render_to_rgb565(void) 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]; diff --git a/tests/src/test_cases/draw/test_render_to_rgb888.c b/tests/src/test_cases/draw/test_render_to_rgb888.c index 5cbbf27315..ab3978420b 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb888.c +++ b/tests/src/test_cases/draw/test_render_to_rgb888.c @@ -24,6 +24,13 @@ void test_render_to_rgb888(void) 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]; diff --git a/tests/src/test_cases/draw/test_render_to_xrgb8888.c b/tests/src/test_cases/draw/test_render_to_xrgb8888.c index 875a22f2fd..15b0ec4a1c 100644 --- a/tests/src/test_cases/draw/test_render_to_xrgb8888.c +++ b/tests/src/test_cases/draw/test_render_to_xrgb8888.c @@ -24,6 +24,13 @@ void test_render_to_xrgb8888(void) 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]; diff --git a/tests/unity/unity_support.c b/tests/unity/unity_support.c index 0c32ddc78c..4492bbb44b 100644 --- a/tests/unity/unity_support.c +++ b/tests/unity/unity_support.c @@ -457,6 +457,28 @@ static void buf_to_xrgb8888(const uint8_t * buf_in, uint8_t * buf_out, lv_color_ buf_out[x * 4 + 0] = buf_in[x * 2 + 0]; } + buf_in += stride; + buf_out += 800 * 4; + } + } + else if (cf_in == LV_COLOR_FORMAT_I1) + { + uint32_t y; + for (y = 0; y < 480; y++) + { + uint32_t x; + for (x = 0; x < 800; x++) + { + const uint8_t byte = buf_in[x / 8]; + const uint8_t bit_pos = x % 8; + const uint8_t pixel = (byte >> (7 - bit_pos)) & 0x01; + + buf_out[x * 4 + 3] = 0xff; + buf_out[x * 4 + 2] = pixel ? 0xff : 0x00; + buf_out[x * 4 + 1] = pixel ? 0xff : 0x00; + buf_out[x * 4 + 0] = pixel ? 0xff : 0x00; + } + buf_in += stride; buf_out += 800 * 4; }