diff --git a/demos/render/assets/img_render_lvgl_logo_rgb565_swapped.c b/demos/render/assets/img_render_lvgl_logo_rgb565_swapped.c new file mode 100644 index 0000000000..45575e6428 --- /dev/null +++ b/demos/render/assets/img_render_lvgl_logo_rgb565_swapped.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_RGB565_SWAPPED +#define LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_RGB565_SWAPPED +#endif + +static const +LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_RENDER_LVGL_LOGO_RGB565_SWAPPED +uint8_t img_render_lvgl_logo_rgb565_swapped_map[] = { + + 0xff,0xff,0xff,0xff,0xbd,0xd7,0x7b,0xcf,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x73,0xae,0x94,0x92,0xef,0x5d,0xff,0xff, + 0xff,0xff,0x94,0xb2,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x29,0x86,0x21,0x45,0x21,0x45,0x29,0x66,0x4a,0x8a,0xde,0xfb, + 0xbd,0xf7,0x29,0x86,0x31,0xa6,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x86,0x5b,0x0c,0x6b,0x4d,0x31,0xa6,0x21,0x45,0x63,0x4d, + 0x7b,0xcf,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x65,0x7b,0xcf,0xff,0xdf,0xff,0xff,0x9c,0xf3,0x29,0x65,0x42,0x28, + 0x73,0xae,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x21,0x45,0xad,0x96,0xff,0xff,0xff,0xff,0xde,0xdb,0x29,0x86,0x3a,0x08, + 0x73,0xae,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x86,0x5b,0x0c,0xef,0x5d,0xf7,0x9e,0x7c,0x10,0x29,0x65,0x42,0x28, + 0x73,0xae,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x86,0x42,0x28,0x42,0x49,0x29,0x86,0x31,0xa6,0x42,0x28, + 0x73,0x8e,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x86,0x29,0x86,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x7c,0x10,0x21,0x45,0x21,0x45,0x21,0x45,0x21,0x45,0x21,0x45,0x21,0x45,0x21,0x45,0x21,0x45,0x29,0x66,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xef,0x7d,0xad,0x96,0xa5,0x55,0xa5,0x76,0xa5,0x76,0xa5,0x76,0xa5,0x76,0xa5,0x76,0xa5,0x55,0x63,0x4d,0x29,0x66,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xff,0xff,0xfe,0xf9,0xfe,0xd8,0xfe,0xd8,0xfe,0xd8,0xfe,0xd8,0xfe,0xd8,0xfe,0xd8,0xff,0x1a,0xff,0xff,0x73,0xcf,0x29,0x65,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xfd,0x30,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0x81,0xfe,0x77,0xc6,0x7a,0x29,0x65,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x6c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0x82,0xfd,0xf3,0xc6,0x9a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x8c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xa2,0xfd,0xf4,0xc6,0x7a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x8c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xa2,0xfd,0xf4,0xc6,0x7a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x8c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xa2,0xfd,0xf4,0xc6,0x7a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x8c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xa2,0xfd,0xf4,0xc6,0x7a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x8c,0xf2,0xc3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xe3,0xf2,0xa2,0xfd,0xf4,0xc6,0x7a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xf4,0x6c,0xf2,0x81,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0xa2,0xf2,0x60,0xfd,0xf4,0xc6,0x7a,0x21,0x24,0x29,0x65,0x29,0x65,0x29,0x65,0x29,0x65,0x29,0x65,0x29,0x65,0x29,0x65,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xfe,0x98,0xf4,0x4b,0xf4,0x2a,0xf4,0x2b,0xf4,0x2b,0xf4,0x2b,0xf4,0x2b,0xf4,0x2a,0xf4,0x4b,0xff,0x3b,0xf7,0xbe,0x7b,0xef,0x63,0x4d,0x6b,0x6d,0x6b,0x6d,0x6b,0x6d,0x6b,0x6d,0x6b,0x6d,0x6b,0x6d,0x52,0xaa,0x29,0x66,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0x7b,0xf0,0x29,0x65,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0xcf,0x79,0x7e,0xcf,0x76,0xcf,0x76,0xcf,0x76,0xcf,0x76,0xcf,0x76,0xcf,0x76,0xcf,0x76,0xcf,0xe7,0xdb,0xef,0x7f,0x64,0x1f,0x53,0xbf,0x53,0xbf,0x53,0xbf,0x53,0xbf,0x53,0xbf,0x53,0xbf,0x4b,0x9f,0xad,0xff,0xf7,0x9d,0x3a,0x08,0x31,0xa6,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x97,0x12,0x5e,0x8b,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x56,0x6b,0xc7,0x97,0xce,0x9f,0x2a,0xde,0x33,0x1e,0x33,0x1e,0x33,0x1e,0x33,0x1e,0x33,0x1e,0x33,0x1e,0x2a,0xde,0x6c,0x5f,0xff,0xde,0x4a,0x8a,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x97,0x13,0x5e,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x56,0x6b,0xc7,0x97,0xd6,0xbf,0x32,0xfe,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x32,0xfe,0x74,0x9f,0xff,0xde,0x4a,0x69,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x97,0x13,0x5e,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x56,0x6b,0xc7,0x97,0xd6,0xbf,0x32,0xfe,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x32,0xfe,0x74,0x9f,0xff,0xde,0x4a,0x69,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x97,0x13,0x5e,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x56,0x6b,0xc7,0x97,0xd6,0xbf,0x32,0xfe,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x32,0xfe,0x74,0x9f,0xff,0xde,0x4a,0x69,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x42,0x28, + 0x97,0x12,0x5e,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x56,0x6b,0xc7,0x97,0xd6,0xbf,0x32,0xfe,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x32,0xfe,0x74,0x9f,0xff,0xde,0x4a,0x69,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa6,0x3a,0x28, + 0xb7,0x56,0x5e,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x66,0x8c,0x56,0x6b,0xc7,0x97,0xd6,0xbf,0x32,0xfe,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x3b,0x3e,0x32,0xfe,0x74,0x9f,0xff,0xde,0x4a,0x69,0x29,0x86,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x31,0xa7,0x29,0x86,0x4a,0x69, + 0xef,0xdd,0x7e,0xcf,0x56,0x6b,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x5e,0x8c,0x56,0x6b,0xc7,0x97,0xce,0xbf,0x32,0xde,0x3b,0x1e,0x3b,0x1e,0x3b,0x1e,0x3b,0x1e,0x3b,0x1e,0x3b,0x1e,0x2a,0xde,0x6c,0x7f,0xff,0xde,0x42,0x49,0x29,0x86,0x31,0xa6,0x31,0xa6,0x31,0xa6,0x31,0xa6,0x29,0x86,0x21,0x45,0x9d,0x14, + 0xff,0xff,0xe7,0xdd,0x8e,0xf2,0x6e,0xae,0x6e,0xae,0x6e,0xae,0x6e,0xae,0x6e,0xad,0x6e,0xae,0xdf,0xdb,0xef,0x5f,0x53,0xdf,0x43,0x7f,0x4b,0x7f,0x4b,0x7f,0x4b,0x7f,0x4b,0x7f,0x4b,0x7f,0x43,0x5f,0x9d,0x7f,0xff,0xff,0x73,0xae,0x39,0xe7,0x42,0x28,0x42,0x28,0x42,0x28,0x3a,0x08,0x4a,0x69,0x9c,0xf3,0xff,0xff, + +}; + +const lv_image_dsc_t img_render_lvgl_logo_rgb565_swapped = { + .header.magic = LV_IMAGE_HEADER_MAGIC, + .header.cf = LV_COLOR_FORMAT_RGB565_SWAPPED, + .header.flags = 0, + .header.w = 30, + .header.h = 30, + .header.stride = 60, + .header.reserved_2 = 0, + .data_size = sizeof(img_render_lvgl_logo_rgb565_swapped_map), + .data = img_render_lvgl_logo_rgb565_swapped_map, + .reserved = NULL, +}; + diff --git a/demos/render/lv_demo_render.c b/demos/render/lv_demo_render.c index d954bc476c..30c2ca72c8 100644 --- a/demos/render/lv_demo_render.c +++ b/demos/render/lv_demo_render.c @@ -327,17 +327,19 @@ static lv_obj_t * image_obj_create(lv_obj_t * parent, int32_t col, int32_t row, return obj; } +#include static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) { LV_IMAGE_DECLARE(img_render_lvgl_logo_xrgb8888); LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb888); LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565); - LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565a8); + LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565_swapped); LV_IMAGE_DECLARE(img_render_lvgl_logo_argb8888); LV_IMAGE_DECLARE(img_render_lvgl_logo_argb8888_premultiplied); LV_IMAGE_DECLARE(img_render_lvgl_logo_l8); LV_IMAGE_DECLARE(img_render_lvgl_logo_i1); + LV_IMAGE_DECLARE(img_render_lvgl_logo_rgb565a8); const void * srcs[] = { &img_render_lvgl_logo_argb8888, @@ -345,8 +347,10 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) &img_render_lvgl_logo_xrgb8888, &img_render_lvgl_logo_rgb888, &img_render_lvgl_logo_rgb565, - &img_render_lvgl_logo_rgb565a8, + &img_render_lvgl_logo_rgb565_swapped, &img_render_lvgl_logo_l8, + NULL, + &img_render_lvgl_logo_rgb565a8, &img_render_lvgl_logo_i1, }; @@ -356,8 +360,11 @@ static void image_core_cb(lv_obj_t * parent, bool recolor, uint32_t startAt) "XRGB\n8888", "RGB\n888", "RGB\n565", - "RGB\n565A8", + "RGB\n565\nSWAP", "L8", + "", /*Make sure that RGB565A8 and I1 are on the same page. + Both are disabled in VGLite as they are not supported*/ + "RGB\n565A8", "I1", }; @@ -428,6 +435,16 @@ static void image_recolored_2_cb(lv_obj_t * parent) image_core_cb(parent, true, 4); } +static void image_normal_3_cb(lv_obj_t * parent) +{ + image_core_cb(parent, false, 8); +} + +static void image_recolored_3_cb(lv_obj_t * parent) +{ + image_core_cb(parent, true, 8); +} + static lv_obj_t * line_obj_create(lv_obj_t * parent, int32_t col, int32_t row, lv_point_precise_t p[]) { lv_obj_t * obj = lv_line_create(parent); @@ -1105,6 +1122,8 @@ static scene_dsc_t scenes[] = { {.name = "image_recolor_1", .create_cb = image_recolored_1_cb}, {.name = "image_normal_2", .create_cb = image_normal_2_cb}, {.name = "image_recolor_2", .create_cb = image_recolored_2_cb}, + {.name = "image_normal_3", .create_cb = image_normal_3_cb}, + {.name = "image_recolor_3", .create_cb = image_recolored_3_cb}, {.name = "line", .create_cb = line_cb}, {.name = "arc_normal", .create_cb = arc_normal_cb}, {.name = "arc_image", .create_cb = arc_image_cb}, diff --git a/demos/render/lv_demo_render.h b/demos/render/lv_demo_render.h index fb06fe4c9b..63b54c539c 100644 --- a/demos/render/lv_demo_render.h +++ b/demos/render/lv_demo_render.h @@ -37,6 +37,8 @@ typedef enum { LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_1, LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_2, LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_2, + LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3, + LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3, LV_DEMO_RENDER_SCENE_LINE, LV_DEMO_RENDER_SCENE_ARC_NORMAL, LV_DEMO_RENDER_SCENE_ARC_IMAGE, diff --git a/lv_conf_template.h b/lv_conf_template.h index 83b63d2a72..006dfd0f2e 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -174,6 +174,7 @@ * - bitmaps with transparency may use ARGB8888 */ #define LV_DRAW_SW_SUPPORT_RGB565 1 + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 1 #define LV_DRAW_SW_SUPPORT_RGB565A8 1 #define LV_DRAW_SW_SUPPORT_RGB888 1 #define LV_DRAW_SW_SUPPORT_XRGB8888 1 diff --git a/scripts/LVGLImage.py b/scripts/LVGLImage.py index 0a07420775..bc631a1e68 100755 --- a/scripts/LVGLImage.py +++ b/scripts/LVGLImage.py @@ -26,6 +26,8 @@ def uint8_t(val) -> bytes: def uint16_t(val) -> bytes: return val.to_bytes(2, byteorder='little') +def swap_uint16_t(val) -> bytes: + return val.to_bytes(2, byteorder='big') def uint24_t(val) -> bytes: return val.to_bytes(3, byteorder='little') @@ -118,6 +120,7 @@ class ColorFormat(Enum): ARGB8888 = 0x10 XRGB8888 = 0x11 RGB565 = 0x12 + RGB565_SWAPPED = 0x1B ARGB8565 = 0x13 RGB565A8 = 0x14 RGB888 = 0x0F @@ -141,6 +144,7 @@ class ColorFormat(Enum): ColorFormat.ARGB8888: 32, ColorFormat.XRGB8888: 32, ColorFormat.RGB565: 16, + ColorFormat.RGB565_SWAPPED: 16, ColorFormat.RGB565A8: 16, # 16bpp + a8 map ColorFormat.ARGB8565: 24, ColorFormat.RGB888: 24, @@ -189,6 +193,7 @@ class ColorFormat(Enum): return self in (ColorFormat.ARGB8888, ColorFormat.RGB888, ColorFormat.XRGB8888, ColorFormat.RGB565A8, ColorFormat.ARGB8565, ColorFormat.RGB565, + ColorFormat.RGB565_SWAPPED, ColorFormat.ARGB8888_PREMULTIPLIED) @property @@ -255,14 +260,23 @@ def unpack_colors(data: bytes, cf: ColorFormat, w) -> List: if len(ret) % w == 0: break elif bpp == 16: - # This is RGB565 - pixels = [(data[2 * i + 1] << 8) | data[2 * i] - for i in range(len(data) // 2)] - - for p in pixels: - ret.append(bit_extend((p >> 11) & 0x1f, 5)) # R - ret.append(bit_extend((p >> 5) & 0x3f, 6)) # G - ret.append(bit_extend((p >> 0) & 0x1f, 5)) # B + if cf == ColorFormat.RGB565: + # This is RGB565 + pixels = [(data[2 * i + 1] << 8) | data[2 * i] + for i in range(len(data) // 2)] + for p in pixels: + ret.append(bit_extend((p >> 11) & 0x1f, 5)) # R + ret.append(bit_extend((p >> 5) & 0x3f, 6)) # G + ret.append(bit_extend((p >> 0) & 0x1f, 5)) # B + elif cf == ColorFormat.RGB565_SWAPPED: + # This is RGB565_SWAPPED + pixels = [(data[2 * i] << 8) | data[2 * i + 1] + for i in range(len(data) // 2)] + for p in pixels: + ret.append(bit_extend((p >> 11) & 0x1f, 5)) # R + ret.append(bit_extend((p >> 5) & 0x3f, 6)) # G + ret.append(bit_extend((p >> 0) & 0x1f, 5)) # B + elif bpp == 24: if cf == ColorFormat.RGB888: B = data[0::3] @@ -1030,6 +1044,14 @@ class LVGLImage: color |= (g >> 2) << 5 color |= (b >> 3) << 0 return uint16_t(color) + elif cf == ColorFormat.RGB565_SWAPPED: + + def pack(r, g, b, a): + r, g, b, a = color_pre_multiply(r, g, b, a, self.background) + color = (r >> 3) << 11 + color |= (g >> 2) << 5 + color |= (b >> 3) << 0 + return swap_uint16_t(color) elif cf == ColorFormat.RGB565A8: @@ -1063,7 +1085,7 @@ class LVGLImage: if ( self.rgb565_dither and - cf in (ColorFormat.RGB565, ColorFormat.RGB565A8, ColorFormat.ARGB8565) + cf in (ColorFormat.RGB565, ColorFormat.RGB565_SWAPPED, ColorFormat.RGB565A8, ColorFormat.ARGB8565) ): treshold_id = ((y & 7) << 3) + (x & 7) @@ -1366,7 +1388,7 @@ def main(): default="I8", choices=[ "L8", "I1", "I2", "I4", "I8", "A1", "A2", "A4", "A8", "ARGB8888", - "XRGB8888", "RGB565", "RGB565A8", "ARGB8565", "RGB888", "AUTO", + "XRGB8888", "RGB565", "RGB565_SWAPPED", "RGB565A8", "ARGB8565", "RGB888", "AUTO", "RAW", "RAW_ALPHA", "ARGB8888_PREMULTIPLIED" ]) diff --git a/src/draw/sw/blend/lv_draw_sw_blend.c b/src/draw/sw/blend/lv_draw_sw_blend.c index 87881c291f..19e630815d 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend.c +++ b/src/draw/sw/blend/lv_draw_sw_blend.c @@ -19,6 +19,9 @@ #if LV_DRAW_SW_SUPPORT_RGB565 #include "lv_draw_sw_blend_to_rgb565.h" #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #include "lv_draw_sw_blend_to_rgb565_swapped.h" +#endif #if LV_DRAW_SW_SUPPORT_ARGB8888 #include "lv_draw_sw_blend_to_argb8888.h" #endif @@ -177,6 +180,11 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color(lv_color_format_ lv_draw_sw_blend_color_to_rgb565(fill_dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + lv_draw_sw_blend_color_to_rgb565_swapped(fill_dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_ARGB8888 case LV_COLOR_FORMAT_ARGB8888: lv_draw_sw_blend_color_to_argb8888(fill_dsc); @@ -227,6 +235,11 @@ static inline void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image(lv_color_format_ lv_draw_sw_blend_image_to_rgb565(image_dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + lv_draw_sw_blend_image_to_rgb565_swapped(image_dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_ARGB8888 case LV_COLOR_FORMAT_ARGB8888: lv_draw_sw_blend_image_to_argb8888(image_dsc); 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 6cbf6602d0..dc56243a62 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 @@ -647,6 +647,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ if(mask_buf == NULL && opa >= LV_OPA_MAX) { if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_AL88(dsc)) { for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { dest_buf_al88[x].lumi = lv_color16_luminance(src_buf_c16[x]); dest_buf_al88[x].alpha = 255; 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 40ced9f6f3..9c813ba1bd 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 @@ -64,6 +64,10 @@ typedef struct { static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); @@ -87,6 +91,8 @@ static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color32 static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); +static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); + /********************** * STATIC VARIABLES **********************/ @@ -342,6 +348,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(lv_draw_sw_blend_i rgb565_image_blend(dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB888 case LV_COLOR_FORMAT_RGB888: rgb888_image_blend(dsc, 3); @@ -682,6 +693,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ lv_color_mix_alpha_cache_t cache; lv_color_mix_with_alpha_cache_init(&cache); + int32_t x; int32_t y; @@ -763,6 +775,116 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_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 uint16_t * src_buf_u16 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + lv_color32_t color_argb; + lv_color_mix_alpha_cache_t cache; + lv_color_mix_with_alpha_cache_init(&cache); + + int32_t x; + int32_t y; + + LV_UNUSED(color_argb); + + uint16_t raw; + lv_color16_t px; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL) { + lv_result_t accelerated; + if(opa >= LV_OPA_MAX) { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc); + } + else { + accelerated = LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc); + } + if(LV_RESULT_INVALID == accelerated) { + color_argb.alpha = opa; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = mask_buf[x]; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + color_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + color_argb.red = (px.red * 2106) >> 8; /*To make it rounded*/ + color_argb.green = (px.green * 1037) >> 8; + color_argb.blue = (px.blue * 2106) >> 8; + dest_buf_c32[x] = lv_color_32_32_mix(color_argb, dest_buf_c32[x], &cache); + } + dest_buf_c32 = drawbuf_next_row(dest_buf_c32, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + lv_color32_t src_argb; + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.blue * 2106) >> 8; + if(mask_buf == NULL) src_argb.alpha = opa; + else src_argb.alpha = LV_OPA_MIX2(mask_buf[x], opa); + blend_non_normal_pixel(&dest_buf_c32[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_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } +} + +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) @@ -1228,6 +1350,15 @@ static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, ui return (void *)((uint8_t *)buf + stride); } +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} + #endif /* LV_DRAW_SW_SUPPORT_ARGB8888 */ #endif /* LV_USE_DRAW_SW */ 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 index 88b66849e0..eaeccfab7b 100644 --- a/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_i1.c @@ -50,6 +50,10 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ i1_image_blend(lv_draw_sw_blend_image_ds static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); @@ -74,6 +78,8 @@ static inline uint8_t /* LV_ATTRIBUTE_FAST_MEM */ get_bit(const uint8_t * buf, i static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); +static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); + /********************** * STATIC VARIABLES **********************/ @@ -132,6 +138,22 @@ static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * b #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_I1_MIX_MASK_OPA(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1 + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_MASK + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_I1_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_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 @@ -314,6 +336,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_i1(lv_draw_sw_blend_image_d rgb565_image_blend(dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB888 case LV_COLOR_FORMAT_RGB888: rgb888_image_blend(dsc, 3); @@ -828,9 +855,9 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_ 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) { @@ -954,6 +981,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ 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) { @@ -1050,6 +1078,132 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ } #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_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 uint16_t * src_buf_u16 = 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; + lv_color16_t px; + + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_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++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + 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_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_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++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + 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_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_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++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + 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_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_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++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + uint8_t src = lv_color16_luminance(px); + 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_u16 = drawbuf_next_row(src_buf_u16, 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++) { + px = lv_color16_from_u16(lv_color_swap_16(src_buf_u16[src_x])); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.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_u16 = drawbuf_next_row(src_buf_u16, 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) { @@ -1117,4 +1271,13 @@ static inline uint8_t LV_ATTRIBUTE_FAST_MEM get_bit(const uint8_t * buf, int32_t return (buf[bit_idx / 8] >> (7 - (bit_idx % 8))) & 1; } +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} + #endif 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 c24ddfe5a3..91bb1162a0 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 @@ -54,6 +54,10 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ l8_image_blend(lv_draw_sw_blend_image_ds static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend_swapped(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); @@ -70,6 +74,8 @@ static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); +static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); + /********************** * STATIC VARIABLES **********************/ @@ -288,6 +294,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_l8(lv_draw_sw_blend_image_d rgb565_image_blend(dsc); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_image_blend_swapped(dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB888 case LV_COLOR_FORMAT_RGB888: rgb888_image_blend(dsc, 3); @@ -596,6 +607,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ const lv_opa_t * mask_buf = dsc->mask_buf; int32_t mask_stride = dsc->mask_stride; + int32_t src_x; int32_t dest_x; int32_t y; @@ -668,6 +680,104 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend_swapped(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 uint16_t * src_buf_u16 = 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; + int32_t dest_x; + int32_t y; + + uint16_t raw; + lv_color16_t px; + + 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_L8(dsc)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + dest_buf_u8[dest_x] = lv_color16_luminance(px); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], opa); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_WITH_MASK(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], mask_buf[src_x]); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_L8_MIX_MASK_OPA(dsc, dest_px_size)) { + for(y = 0; y < h; y++) { + for(src_x = 0, dest_x = 0; src_x < w; dest_x++, src_x++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + lv_color_8_8_mix(lv_color16_luminance(px), &dest_buf_u8[dest_x], LV_OPA_MIX2(opa, mask_buf[src_x])); + } + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, 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++) { + raw = lv_color_swap_16(src_buf_u16[src_x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + src_argb.red = (px.red * 2106) >> 8; + src_argb.green = (px.green * 1037) >> 8; + src_argb.blue = (px.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], src_argb, dsc->blend_mode); + } + if(mask_buf) mask_buf += mask_stride; + dest_buf_u8 += dest_stride; + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } +} + +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, @@ -748,6 +858,7 @@ static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_ 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; @@ -856,7 +967,6 @@ 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) @@ -895,6 +1005,15 @@ static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, ui return (void *)((uint8_t *)buf + stride); } +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} + #endif #endif 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 e17bdc8524..bca595caab 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 @@ -54,6 +54,10 @@ static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size); @@ -75,6 +79,8 @@ static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); +static inline lv_color16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color16_from_u16(uint16_t raw); + /********************** * STATIC VARIABLES **********************/ @@ -382,6 +388,11 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(lv_draw_sw_blend_ima case LV_COLOR_FORMAT_RGB565: rgb565_image_blend(dsc); break; +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB888 case LV_COLOR_FORMAT_RGB888: rgb888_image_blend(dsc, 3); @@ -902,6 +913,128 @@ static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(lv_draw_sw_blend_image_dsc_ } } +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_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 uint16_t * src_buf_u16 = 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; + + 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_RGB565(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], opa); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], mask_buf[x]); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + + for(x = 0; x < w; x++) { + uint16_t raw; + lv_color16_t px; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + px = lv_color16_from_u16(raw); + + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + res = (LV_MIN(dest_buf_c16[x].red + px.red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + px.green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + px.blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + res = (LV_MAX(dest_buf_c16[x].red - px.red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - px.green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - px.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + res = ((dest_buf_c16[x].red * px.red) >> 5) << 11; + res += ((dest_buf_c16[x].green * px.green) >> 6) << 5; + res += (dest_buf_c16[x].blue * px.blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[x].red - px.red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - px.green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - px.blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], opa); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x]); + else dest_buf_u16[x] = lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa)); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + #if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size) @@ -1364,6 +1497,15 @@ static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, ui return (void *)((uint8_t *)buf + stride); } +static inline lv_color16_t LV_ATTRIBUTE_FAST_MEM lv_color16_from_u16(uint16_t raw) +{ + lv_color16_t c; + c.red = (raw >> 11) & 0x1F; + c.green = (raw >> 5) & 0x3F; + c.blue = raw & 0x1F; + return c; +} + #endif /*LV_DRAW_SW_SUPPORT_RGB565*/ #endif /*LV_USE_DRAW_SW*/ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c new file mode 100644 index 0000000000..88845845c5 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.c @@ -0,0 +1,1560 @@ +/** + * @file lv_draw_sw_blend_to_rgb565_swapped.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_sw_blend_to_rgb565_swapped.h" +#if LV_USE_DRAW_SW + +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +#include "lv_draw_sw_blend_private.h" +#include "../../../misc/lv_math.h" +#include "../../../display/lv_display.h" +#include "../../../core/lv_refr.h" +#include "../../../misc/lv_color.h" +#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 + **********************/ + +#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_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 + +#if LV_DRAW_SW_SUPPORT_RGB565 + static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_swapped_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 +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 + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc); +#endif + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ l8_to_rgb565(const uint8_t c1); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix); + +static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix); + +static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_AL88_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(...) LV_RESULT_INVALID +#endif + +#ifndef LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA + #define LV_DRAW_SW_I1_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(...) LV_RESULT_INVALID +#endif + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Fill an area with a color. + * Supports normal fill, fill with opacity, fill with mask, and fill with mask and opacity. + * dest_buf and color have native color depth. (RGB565, RGB888, XRGB8888) + * The background (dest_buf) cannot have alpha channel + * @param dest_buf + * @param dest_area + * @param dest_stride + * @param color + * @param opa + * @param mask + * @param mask_stride + */ +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565_swapped(lv_draw_sw_blend_fill_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + uint16_t color16 = lv_color_to_u16(dsc->color); /* Normal color */ + uint16_t color16_swapped = lv_color_swap_16(color16); /* Swapped color, use directly if no mixing is needed */ + lv_opa_t opa = dsc->opa; + const lv_opa_t * mask = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + + int32_t x; + int32_t y; + + LV_UNUSED(w); + LV_UNUSED(h); + LV_UNUSED(x); + LV_UNUSED(y); + LV_UNUSED(opa); + LV_UNUSED(mask); + LV_UNUSED(color16); + LV_UNUSED(color16_swapped); + LV_UNUSED(mask_stride); + LV_UNUSED(dest_stride); + LV_UNUSED(dest_buf_u16); + + /*Simple fill*/ + if(mask == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + uint16_t * dest_end_final = dest_buf_u16 + w; + uint32_t * dest_end_mid = (uint32_t *)((uint16_t *) dest_buf_u16 + ((w - 1) & ~(0xF))); + + if((lv_uintptr_t)&dest_buf_u16[0] & 0x3) { + dest_buf_u16[0] = color16_swapped; + dest_buf_u16++; + } + + uint32_t c32 = (uint32_t)color16_swapped + ((uint32_t)color16_swapped << 16); + uint32_t * dest32 = (uint32_t *)dest_buf_u16; + while(dest32 < dest_end_mid) { + dest32[0] = c32; + dest32[1] = c32; + dest32[2] = c32; + dest32[3] = c32; + dest32[4] = c32; + dest32[5] = c32; + dest32[6] = c32; + dest32[7] = c32; + dest32 += 8; + } + + dest_buf_u16 = (uint16_t *)dest32; + + while(dest_buf_u16 < dest_end_final) { + *dest_buf_u16 = color16_swapped; + dest_buf_u16++; + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + dest_buf_u16 -= w; + } + } + + } + /*Opacity only*/ + else if(mask == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + /*Make sure the last dest_color doesn't match the first one so that it will be calculated*/ + uint16_t last_dest_color = dest_buf_u16[0] - 1; + uint16_t last_res_color = 0; + for(x = 0; x < w; x++) { + if(last_dest_color != dest_buf_u16[x]) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); /* Swap destination so it becomes unswapped now */ + last_res_color = lv_color_16_16_mix(color16, px, opa); /* Color mix of unswapped colors */ + last_res_color = lv_color_swap_16(last_res_color); + last_dest_color = dest_buf_u16[x]; + } + + dest_buf_u16[x] = last_res_color; + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + } + } + } + /*Masked with full opacity*/ + else if(mask && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + x = 0; + if((lv_uintptr_t)(mask) & 0x1) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + px = lv_color_16_16_mix(color16, px, mask[x]); /* Color mix */ + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + x++; + } + + for(; x <= w - 2; x += 2) { + uint16_t mask16 = *((uint16_t *)&mask[x]); + if(mask16 == 0xFFFF) { + dest_buf_u16[x + 0] = color16_swapped; + dest_buf_u16[x + 1] = color16_swapped; + } + else if(mask16 != 0) { + uint16_t px0 = lv_color_swap_16(dest_buf_u16[x + 0]); /* Swap destination */ + uint16_t px1 = lv_color_swap_16(dest_buf_u16[x + 1]); /* Swap destination */ + + px0 = lv_color_16_16_mix(color16, px0, mask[x + 0]); /* Color mix */ + px1 = lv_color_16_16_mix(color16, px1, mask[x + 1]); /* Color mix */ + + dest_buf_u16[x + 0] = lv_color_swap_16(px0); /* Write back swapped */ + dest_buf_u16[x + 1] = lv_color_swap_16(px1); /* Write back swapped */ + + } + } + + for(; x < w ; x++) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + px = lv_color_16_16_mix(color16, px, mask[x]); /* Color mix */ + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } + /*Masked with opacity*/ + else if(mask && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = dest_buf_u16[x]; + px = lv_color_swap_16(px); /* Swap destination */ + + uint8_t mix_opa = LV_OPA_MIX2(mask[x], opa); + px = lv_color_16_16_mix(color16, px, mix_opa); /* Color mix */ + + dest_buf_u16[x] = lv_color_swap_16(px); /* Write back swapped */ + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + mask += mask_stride; + } + } + } +} + +void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565_swapped(lv_draw_sw_blend_image_dsc_t * dsc) +{ + switch(dsc->src_color_format) { + case LV_COLOR_FORMAT_RGB565_SWAPPED: + rgb565_swapped_image_blend(dsc); + break; +#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_ARGB8888_PREMULTIPLIED + case LV_COLOR_FORMAT_ARGB8888_PREMULTIPLIED: + argb8888_premultiplied_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_L8 + case LV_COLOR_FORMAT_L8: + l8_image_blend(dsc); + break; +#endif +#if LV_DRAW_SW_SUPPORT_AL88 + 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"); + break; + } +} + +/********************** + * 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; + 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_SWAPPED(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_swap_16(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_SWAPPED_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_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(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_SWAPPED_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_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(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_SWAPPED_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_swap_16(lv_color_8_16_mix(chan_val, lv_color_swap_16(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: + res = (LV_MIN(lv_color_swap_16(dest_buf_u16[dest_x]) + l8_to_rgb565(chan_val), 0xFFFF)); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(lv_color_swap_16(dest_buf_u16[dest_x]) - l8_to_rgb565(chan_val), 0)); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((((lv_color_swap_16(dest_buf_u16[dest_x]) >> 11) * (l8_to_rgb565(chan_val) >> 3)) & 0x1F) << 11) | + ((((lv_color_swap_16(dest_buf_u16[dest_x]) >> 5) & 0x3F) * ((l8_to_rgb565(chan_val) >> 2) & 0x3F) >> 6) << 5) | + (((lv_color_swap_16(dest_buf_u16[dest_x]) & 0x1F) * (l8_to_rgb565(chan_val) & 0x1F)) >> 5); + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(lv_color_swap_16(dest_buf_u16[dest_x]) - l8_to_rgb565(chan_val))); + 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] = lv_color_swap_16(res); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(dest_buf_u16[dest_x]), opa)); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + else + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, lv_color_swap_16(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; + 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 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; + + 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_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), src_buf_al88[src_x].alpha)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, 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_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_al88[src_x].alpha, opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, 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_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_al88[src_x].alpha, mask_buf[dest_x]))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, 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_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_al88[src_x].lumi, + lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_al88[src_x].alpha, mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_al88[src_x].lumi >> 3; + uint8_t g = src_buf_al88[src_x].lumi >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + 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] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_al88[src_x].alpha)); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_al88[src_x].alpha))); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], + opa, + src_buf_al88[src_x].alpha))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_al88 = drawbuf_next_row(src_buf_al88, src_stride); + if(mask_buf) mask_buf += mask_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; + 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_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 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_L8_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(l8_to_rgb565(src_buf_l8[src_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + 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_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_l8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_L8_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + 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_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x++) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_8_16_mix(src_buf_l8[src_x], lv_color_swap_16(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_l8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *)dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + uint8_t rb = src_buf_l8[src_x] >> 3; + uint8_t g = src_buf_l8[src_x] >> 2; + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + rb, 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + g, 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + rb, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - rb, 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - g, 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - rb, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * rb) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * g) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * rb) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - rb)) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - g)) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - rb); + 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_swap_16(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_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(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_l8 += src_stride; + if(mask_buf) mask_buf += mask_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; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint16_t * src_buf_u16 = 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; + + 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_RGB565_SWAPPED(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), mask_buf[x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(src_buf_u16[x], lv_color_swap_16(dest_buf_u16[x]), + LV_OPA_MIX2(mask_buf[x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_color16_t * src_buf_c16 = (lv_color16_t *) src_buf_u16; + for(x = 0; x < w; x++) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MIN(dest_buf_c16[x].red + src_buf_c16[x].red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_buf_c16[x].green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_buf_c16[x].blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MAX(dest_buf_c16[x].red - src_buf_c16[x].red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_buf_c16[x].green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_buf_c16[x].blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = ((dest_buf_c16[x].red * src_buf_c16[x].red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_buf_c16[x].green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_buf_c16[x].blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_ABS(dest_buf_c16[x].red - src_buf_c16[x].red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - src_buf_c16[x].green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - src_buf_c16[x].blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x])); + else dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} +#endif + +static void LV_ATTRIBUTE_FAST_MEM rgb565_swapped_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 uint16_t * src_buf_u16 = 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; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + uint32_t line_in_bytes = w * 2; + for(y = 0; y < h; y++) { + lv_memcpy(dest_buf_u16, src_buf_u16, line_in_bytes); + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, opa); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, mask_buf[x]); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + else { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(x = 0; x < w; x++) { + uint16_t px = lv_color_swap_16(dest_buf_u16[x]); + px = lv_color_16_16_mix(lv_color_swap_16(src_buf_u16[x]), px, LV_OPA_MIX2(mask_buf[x], opa)); + dest_buf_u16[x] = lv_color_swap_16(px); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + for(x = 0; x < w; x++) { + uint16_t raw; + lv_color16_t src_px; + raw = lv_color_swap_16(src_buf_u16[x]); /* swap byte order */ + lv_memcpy(&src_px, &raw, sizeof(src_px)); + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not add pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MIN(dest_buf_c16[x].red + src_px.red, 31)) << 11; + res += (LV_MIN(dest_buf_c16[x].green + src_px.green, 63)) << 5; + res += LV_MIN(dest_buf_c16[x].blue + src_px.blue, 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + if(src_buf_u16[x] == 0x0000) continue; /*Do not subtract pure black*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_MAX(dest_buf_c16[x].red - src_px.red, 0)) << 11; + res += (LV_MAX(dest_buf_c16[x].green - src_px.green, 0)) << 5; + res += LV_MAX(dest_buf_c16[x].blue - src_px.blue, 0); + break; + case LV_BLEND_MODE_MULTIPLY: + if(src_buf_u16[x] == 0xffff) continue; /*Do not multiply with pure white (considered as 1)*/ + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = ((dest_buf_c16[x].red * src_px.red) >> 5) << 11; + res += ((dest_buf_c16[x].green * src_px.green) >> 6) << 5; + res += (dest_buf_c16[x].blue * src_px.blue) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + dest_buf_u16[x] = lv_color_swap_16(dest_buf_u16[x]); + res = (LV_ABS(dest_buf_c16[x].red - src_px.red)) << 11; + res += (LV_ABS(dest_buf_c16[x].green - src_px.green)) << 5; + res += LV_ABS(dest_buf_c16[x].blue - src_px.blue); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], opa)); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], mask_buf[x])); + else dest_buf_u16[x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[x], LV_OPA_MIX2(mask_buf[x], opa))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u16 = drawbuf_next_row(src_buf_u16, src_stride); + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#if LV_DRAW_SW_SUPPORT_RGB888 || LV_DRAW_SW_SUPPORT_XRGB8888 + +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; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(((src_buf_u8[src_x + 2] & 0xF8) << 8) + + ((src_buf_u8[src_x + 1] & 0xFC) << 3) + + ((src_buf_u8[src_x + 0] & 0xF8) >> 3)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + opa)); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + mask_buf[dest_x])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc, src_px_size)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(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_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += src_px_size) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL) { + dest_buf_u16[dest_x] = lv_color_swap_16(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_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(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_u8 += src_stride; + if(mask_buf) mask_buf += mask_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; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + src_buf_u8[src_x + 3])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], + opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x]))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(&src_buf_u8[src_x], lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa))); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3])); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_u8[src_x + 3]))); + } + else { + if(opa >= LV_OPA_MAX) dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], + mask_buf[dest_x])); + else dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], + opa, + src_buf_u8[src_x + 3]))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +#if LV_DRAW_SW_SUPPORT_ARGB8888_PREMULTIPLIED + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix_premult(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + uint8_t r = (c1[2] >> 3) + ((((c2 >> 11) & 0x1F) * mix_inv) >> 8); + uint8_t g = (c1[1] >> 2) + ((((c2 >> 5) & 0x3F) * mix_inv) >> 8); + uint8_t b = (c1[0] >> 3) + ((((c2 >> 0) & 0x1F) * mix_inv) >> 8); + + return (r << 11) + (g << 5) + (b); + } +} + +static void LV_ATTRIBUTE_FAST_MEM argb8888_premultiplied_image_blend(lv_draw_sw_blend_image_dsc_t * dsc) +{ + int32_t w = dsc->dest_w; + int32_t h = dsc->dest_h; + lv_opa_t opa = dsc->opa; + uint16_t * dest_buf_u16 = dsc->dest_buf; + int32_t dest_stride = dsc->dest_stride; + const uint8_t * src_buf_u8 = dsc->src_buf; + int32_t src_stride = dsc->src_stride; + const lv_opa_t * mask_buf = dsc->mask_buf; + int32_t mask_stride = dsc->mask_stride; + + int32_t dest_x; + int32_t src_x; + int32_t y; + + if(dsc->blend_mode == LV_BLEND_MODE_NORMAL) { + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + /*For the trivial case use the premultipled image as it is. + *For the other cases unpremultiply as another alpha also needs to be applied.*/ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix_premult(&src_buf_u8[src_x], + lv_color_swap_16(dest_buf_u16[dest_x]), src_buf_u8[src_x + 3])); + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], opa))); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + } + } + } + else if(mask_buf && opa >= LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_WITH_MASK(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX2(src_buf_u8[src_x + 3], mask_buf[dest_x]))); + } + + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + else if(mask_buf && opa < LV_OPA_MAX) { + if(LV_RESULT_INVALID == LV_DRAW_SW_ARGB8888_PREMULTIPLIED_BLEND_NORMAL_TO_RGB565_SWAPPED_MIX_MASK_OPA(dsc)) { + for(y = 0; y < h; y++) { + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + if(src_buf_u8[src_x + 3] > 0) { + uint8_t src_buf_u8_unpremult[3]; + uint16_t reciprocal = (255 * 256) / src_buf_u8[src_x + 3]; + src_buf_u8_unpremult[0] = (src_buf_u8[src_x + 0] * reciprocal) >> 8; + src_buf_u8_unpremult[1] = (src_buf_u8[src_x + 1] * reciprocal) >> 8; + src_buf_u8_unpremult[2] = (src_buf_u8[src_x + 2] * reciprocal) >> 8; + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_24_16_mix(src_buf_u8_unpremult, lv_color_swap_16(dest_buf_u16[dest_x]), + LV_OPA_MIX3(src_buf_u8[src_x + 3], mask_buf[dest_x], opa))); + } + } + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + mask_buf += mask_stride; + } + } + } + } + else { + uint16_t res = 0; + for(y = 0; y < h; y++) { + lv_color16_t * dest_buf_c16 = (lv_color16_t *) dest_buf_u16; + lv_draw_sw_rgb565_swap((uint8_t *) dest_buf_u16, w); + for(dest_x = 0, src_x = 0; dest_x < w; dest_x++, src_x += 4) { + switch(dsc->blend_mode) { + case LV_BLEND_MODE_ADDITIVE: + res = (LV_MIN(dest_buf_c16[dest_x].red + (src_buf_u8[src_x + 2] >> 3), 31)) << 11; + res += (LV_MIN(dest_buf_c16[dest_x].green + (src_buf_u8[src_x + 1] >> 2), 63)) << 5; + res += LV_MIN(dest_buf_c16[dest_x].blue + (src_buf_u8[src_x + 0] >> 3), 31); + break; + case LV_BLEND_MODE_SUBTRACTIVE: + res = (LV_MAX(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3), 0)) << 11; + res += (LV_MAX(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2), 0)) << 5; + res += LV_MAX(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3), 0); + break; + case LV_BLEND_MODE_MULTIPLY: + res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11; + res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5; + res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5; + break; + case LV_BLEND_MODE_DIFFERENCE: + res = (LV_ABS(dest_buf_c16[dest_x].red - (src_buf_u8[src_x + 2] >> 3))) << 11; + res += (LV_ABS(dest_buf_c16[dest_x].green - (src_buf_u8[src_x + 1] >> 2))) << 5; + res += LV_ABS(dest_buf_c16[dest_x].blue - (src_buf_u8[src_x + 0] >> 3)); + break; + default: + LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode); + return; + } + + if(mask_buf == NULL && opa >= LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and full opacity */ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], src_buf_u8[src_x + 3])); + } + else if(mask_buf == NULL && opa < LV_OPA_MAX) { + /* Blending premultiplied ARGB8888 to RGB565 with no mask and partial opacity */ + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX2(opa, + src_buf_u8[src_x + 3]))); + } + else { + if(opa >= LV_OPA_MAX) + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], mask_buf[dest_x])); + else + dest_buf_u16[dest_x] = lv_color_swap_16(lv_color_16_16_mix(res, dest_buf_u16[dest_x], LV_OPA_MIX3(mask_buf[dest_x], opa, + src_buf_u8[src_x + 3]))); + } + } + + dest_buf_u16 = drawbuf_next_row(dest_buf_u16, dest_stride); + src_buf_u8 += src_stride; + if(mask_buf) mask_buf += mask_stride; + } + } +} + +#endif + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM l8_to_rgb565(const uint8_t c1) +{ + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_8_16_mix(const uint8_t c1, uint16_t c2, uint8_t mix) +{ + + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1 & 0xF8) << 8) + ((c1 & 0xFC) << 3) + ((c1 & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1 >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1 >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1 >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix) +{ + if(mix == 0) { + return c2; + } + else if(mix == 255) { + return ((c1[2] & 0xF8) << 8) + ((c1[1] & 0xFC) << 3) + ((c1[0] & 0xF8) >> 3); + } + else { + lv_opa_t mix_inv = 255 - mix; + + return ((((c1[2] >> 3) * mix + ((c2 >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + ((((c1[1] >> 2) * mix + ((c2 >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + (((c1[0] >> 3) * mix + (c2 & 0x1F) * mix_inv) >> 8); + } +} + +#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); +} + +#endif /*LV_DRAW_SW_SUPPORT_RGB565_SWAPPED*/ + +#endif /*LV_USE_DRAW_SW*/ diff --git a/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h new file mode 100644 index 0000000000..475b765d23 --- /dev/null +++ b/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565_swapped.h @@ -0,0 +1,45 @@ +/** + * @file lv_draw_sw_blend_to_rgb565_swapped.h + * + */ + +#ifndef LV_DRAW_SW_BLEND_TO_RGB565_SWAPPED_H +#define LV_DRAW_SW_BLEND_TO_RGB565_SWAPPED_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_rgb565_swapped(lv_draw_sw_blend_fill_dsc_t * dsc); + +void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565_swapped(lv_draw_sw_blend_image_dsc_t * dsc); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_DRAW_SW*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif /*LV_DRAW_SW_BLEND_TO_RGB565_H*/ diff --git a/src/draw/sw/lv_draw_sw_img.c b/src/draw/sw/lv_draw_sw_img.c index 7012819a5b..a81042d615 100644 --- a/src/draw/sw/lv_draw_sw_img.c +++ b/src/draw/sw/lv_draw_sw_img.c @@ -43,6 +43,10 @@ #define LV_DRAW_SW_RGB565_RECOLOR(...) LV_RESULT_INVALID #endif +#ifndef LV_DRAW_SW_RGB565_SWAPPED_RECOLOR + #define LV_DRAW_SW_RGB565_SWAPPED_RECOLOR(...) LV_RESULT_INVALID +#endif + #ifndef LV_DRAW_SW_RGB888_RECOLOR #define LV_DRAW_SW_RGB888_RECOLOR(...) LV_RESULT_INVALID #endif @@ -59,6 +63,7 @@ * STATIC PROTOTYPES **********************/ + static void img_draw_core(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, const lv_area_t * img_coords, const lv_area_t * clipped_img_area); @@ -78,7 +83,6 @@ static void transform_and_recolor(lv_draw_task_t * t, const lv_draw_image_dsc_t const lv_image_decoder_dsc_t * decoder_dsc, lv_draw_image_sup_t * sup, const lv_area_t * img_coords, const lv_area_t * clipped_img_area); - static void recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_buf, int32_t src_stride, lv_color_format_t cf, const lv_draw_image_dsc_t * draw_dsc); @@ -311,11 +315,11 @@ static void radius_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc uint32_t img_stride = decoded->header.stride; lv_color_format_t cf = decoded->header.cf; lv_color_format_t cf_ori = cf; + if(cf == LV_COLOR_FORMAT_RGB565A8) { cf = LV_COLOR_FORMAT_RGB565; } - lv_draw_sw_blend_dsc_t blend_dsc; lv_memzero(&blend_dsc, sizeof(lv_draw_sw_blend_dsc_t)); blend_dsc.opa = draw_dsc->opa; @@ -438,11 +442,11 @@ static void recolor_only(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_ds if(blend_area.y2 > y_last) { blend_area.y2 = y_last; } + } lv_free(tmp_buf); - } static void transform_and_recolor(lv_draw_task_t * t, const lv_draw_image_dsc_t * draw_dsc, @@ -474,7 +478,8 @@ static void transform_and_recolor(lv_draw_task_t * t, const lv_draw_image_dsc_t lv_color_format_t cf_final = cf; if(cf_final == LV_COLOR_FORMAT_RGB888 || cf_final == LV_COLOR_FORMAT_XRGB8888) cf_final = LV_COLOR_FORMAT_ARGB8888; - else if(cf_final == LV_COLOR_FORMAT_RGB565) cf_final = LV_COLOR_FORMAT_RGB565A8; + else if(cf_final == LV_COLOR_FORMAT_RGB565 || + cf_final == LV_COLOR_FORMAT_RGB565_SWAPPED) cf_final = LV_COLOR_FORMAT_RGB565A8; else if(cf_final == LV_COLOR_FORMAT_L8) cf_final = LV_COLOR_FORMAT_AL88; uint8_t * transformed_buf; @@ -602,6 +607,46 @@ static void recolor(lv_area_t relative_area, uint8_t * src_buf, uint8_t * dest_b } } } + else if(cf == LV_COLOR_FORMAT_RGB565_SWAPPED) { + if(LV_RESULT_INVALID == LV_DRAW_SW_RGB565_SWAPPED_RECOLOR(dest_buf, blend_area, color, mix)) { + const uint8_t * src_buf_tmp = src_buf + src_stride * relative_area.y1 + relative_area.x1 * 2; + int32_t img_stride_px = src_stride / 2; + + uint16_t * buf16_src = (uint16_t *)src_buf_tmp; + uint16_t * buf16_dest = (uint16_t *)dest_buf; + uint16_t color16 = lv_color_to_u16(color); + if(mix >= LV_OPA_MAX) { + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = color16; + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + else { + uint16_t c_mult[3]; + c_mult[0] = (color.blue >> 3) * mix; + c_mult[1] = (color.green >> 2) * mix; + c_mult[2] = (color.red >> 3) * mix; + + int32_t y; + for(y = 0; y < h; y++) { + int32_t x; + for(x = 0; x < w; x++) { + *buf16_dest = lv_color_swap_16((((c_mult[2] + ((lv_color_swap_16(buf16_src[x]) >> 11) & 0x1F) * mix_inv) << 3) & 0xF800) + + + (((c_mult[1] + ((lv_color_swap_16(buf16_src[x]) >> 5) & 0x3F) * mix_inv) >> 3) & 0x07E0) + + ((c_mult[0] + (lv_color_swap_16(buf16_src[x]) & 0x1F) * mix_inv) >> 8)); + buf16_dest++; + } + buf16_src += img_stride_px; + } + } + } + } else if(cf == LV_COLOR_FORMAT_RGB888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_ARGB8888) { if(LV_RESULT_INVALID == LV_DRAW_SW_RGB888_RECOLOR(dest_buf, blend_area, color, mix, cf_final)) { uint32_t px_size = lv_color_format_get_size(cf); diff --git a/src/draw/sw/lv_draw_sw_transform.c b/src/draw/sw/lv_draw_sw_transform.c index 4d25961535..30db0620be 100644 --- a/src/draw/sw/lv_draw_sw_transform.c +++ b/src/draw/sw/lv_draw_sw_transform.c @@ -75,6 +75,12 @@ static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED +static void transform_rgb565a8_swapped(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa); +#endif + #if LV_DRAW_SW_SUPPORT_A8 static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, @@ -146,7 +152,7 @@ void lv_draw_sw_transform(const lv_area_t * dest_area, const void * src_buf, } uint8_t * alpha_buf; - if(src_cf == LV_COLOR_FORMAT_RGB565 || src_cf == LV_COLOR_FORMAT_RGB565A8) { + if(src_cf == LV_COLOR_FORMAT_RGB565 || src_cf == LV_COLOR_FORMAT_RGB565_SWAPPED || src_cf == LV_COLOR_FORMAT_RGB565A8) { alpha_buf = dest_buf; alpha_buf += dest_stride * dest_h; } @@ -268,6 +274,12 @@ void lv_draw_sw_transform(const lv_area_t * dest_area, const void * src_buf, alpha_buf, false, aa); break; #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + case LV_COLOR_FORMAT_RGB565_SWAPPED: + transform_rgb565a8_swapped(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, + dest_buf, alpha_buf, false, aa); + break; +#endif #if LV_DRAW_SW_SUPPORT_RGB565A8 case LV_COLOR_FORMAT_RGB565A8: transform_rgb565a8(src_buf, src_w, src_h, src_stride, xs_ups, ys_ups, xs_step_256, ys_step_256, dest_w, @@ -738,6 +750,122 @@ static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h #endif +#if LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + +static void transform_rgb565a8_swapped(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, + int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step, + int32_t x_end, uint16_t * cbuf, uint8_t * abuf, bool src_has_a8, bool aa) +{ + int32_t xs_ups_start = xs_ups; + int32_t ys_ups_start = ys_ups; + + const lv_opa_t * src_alpha = src + src_stride * src_h; + + /*Must be signed type, because we would use negative array index calculated from stride*/ + int32_t alpha_stride = src_stride / 2; /*alpha map stride is always half of RGB map stride*/ + + int32_t x; + for(x = 0; x < x_end; x++) { + xs_ups = xs_ups_start + ((xs_step * x) >> 8); + ys_ups = ys_ups_start + ((ys_step * x) >> 8); + + int32_t xs_int = xs_ups >> 8; + int32_t ys_int = ys_ups >> 8; + + /*Fully out of the image*/ + if(xs_int < 0 || xs_int >= src_w || ys_int < 0 || ys_int >= src_h) { + abuf[x] = 0x00; + continue; + } + + /*Get the direction the hor and ver neighbor + *`fract` will be in range of 0x00..0xFF and `next` (+/-1) indicates the direction*/ + int32_t xs_fract = xs_ups & 0xFF; + int32_t ys_fract = ys_ups & 0xFF; + + int32_t x_next; + int32_t y_next; + if(xs_fract < 0x80) { + x_next = -1; + xs_fract = (0x7F - xs_fract) * 2; + } + else { + x_next = 1; + xs_fract = (xs_fract - 0x80) * 2; + } + if(ys_fract < 0x80) { + y_next = -1; + ys_fract = (0x7F - ys_fract) * 2; + } + else { + y_next = 1; + ys_fract = (ys_fract - 0x80) * 2; + } + + const uint16_t * src_tmp_u16 = (const uint16_t *)(src + (ys_int * src_stride) + xs_int * 2); + cbuf[x] = lv_color_swap_16(src_tmp_u16[0]); /* swap the src pixels */ + + if(aa && + xs_int + x_next >= 0 && + xs_int + x_next <= src_w - 1 && + ys_int + y_next >= 0 && + ys_int + y_next <= src_h - 1) { + + /* swap the src pixels */ + uint16_t px_hor = lv_color_swap_16(src_tmp_u16[x_next]); + uint16_t px_ver = lv_color_swap_16(*(const uint16_t *)((uint8_t *)src_tmp_u16 + (y_next * src_stride))); + + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + abuf[x] = src_alpha_tmp[0]; + + lv_opa_t a_hor = src_alpha_tmp[x_next]; + lv_opa_t a_ver = src_alpha_tmp[y_next * alpha_stride]; + + if(a_ver != abuf[x]) a_ver = ((a_ver * ys_fract) + (abuf[x] * (0x100 - ys_fract))) >> 8; + if(a_hor != abuf[x]) a_hor = ((a_hor * xs_fract) + (abuf[x] * (0x100 - xs_fract))) >> 8; + abuf[x] = (a_ver + a_hor) >> 1; + + if(abuf[x] == 0x00) continue; + } + else { + abuf[x] = 0xff; + } + + if(cbuf[x] != px_ver || cbuf[x] != px_hor) { + uint16_t v = lv_color_16_16_mix(px_ver, cbuf[x], ys_fract); + uint16_t h = lv_color_16_16_mix(px_hor, cbuf[x], xs_fract); + cbuf[x] = lv_color_16_16_mix(h, v, LV_OPA_50); + } + } + /*Partially out of the image*/ + else { + lv_opa_t a; + if(src_has_a8) { + const lv_opa_t * src_alpha_tmp = src_alpha; + src_alpha_tmp += (ys_int * alpha_stride) + xs_int; + a = src_alpha_tmp[0]; + } + else { + a = 0xff; + } + + if((xs_int == 0 && x_next < 0) || (xs_int == src_w - 1 && x_next > 0)) { + abuf[x] = (a * (0xFF - xs_fract)) >> 8; + } + else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) { + abuf[x] = (a * (0xFF - ys_fract)) >> 8; + } + else { + abuf[x] = a; + } + } + } +} + +#endif + #if LV_DRAW_SW_SUPPORT_A8 static void transform_a8(const uint8_t * src, int32_t src_w, int32_t src_h, int32_t src_stride, diff --git a/src/draw/sw/lv_draw_sw_utils.c b/src/draw/sw/lv_draw_sw_utils.c index b568a61171..0f2635a653 100644 --- a/src/draw/sw/lv_draw_sw_utils.c +++ b/src/draw/sw/lv_draw_sw_utils.c @@ -150,9 +150,17 @@ void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) { if(LV_DRAW_SW_RGB565_SWAP(buf, buf_size_px) == LV_RESULT_OK) return; - uint32_t u32_cnt = buf_size_px / 2; uint16_t * buf16 = buf; - uint32_t * buf32 = buf; + + /*2 pixels will be processed later, so handle 1 pixel alignment*/ + if((lv_uintptr_t)buf16 & 0x2) { + buf16[0] = ((buf16[0] & 0xff00) >> 8) | ((buf16[0] & 0x00ff) << 8); + buf16++; + buf_size_px--; + } + + uint32_t * buf32 = (uint32_t *)buf16; + uint32_t u32_cnt = buf_size_px / 2; while(u32_cnt >= 8) { buf32[0] = ((buf32[0] & 0xff00ff00) >> 8) | ((buf32[0] & 0x00ff00ff) << 8); @@ -173,6 +181,7 @@ void lv_draw_sw_rgb565_swap(void * buf, uint32_t buf_size_px) u32_cnt--; } + /*Process the last pixel if needed*/ if(buf_size_px & 0x1) { uint32_t e = buf_size_px - 1; buf16[e] = ((buf16[e] & 0xff00) >> 8) | ((buf16[e] & 0x00ff) << 8); diff --git a/src/draw/vg_lite/lv_vg_lite_utils.c b/src/draw/vg_lite/lv_vg_lite_utils.c index dece291c48..56c2da4d1f 100644 --- a/src/draw/vg_lite/lv_vg_lite_utils.c +++ b/src/draw/vg_lite/lv_vg_lite_utils.c @@ -570,6 +570,9 @@ vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf) case LV_COLOR_FORMAT_RGB565: return VG_LITE_BGR565; + case LV_COLOR_FORMAT_RGB565_SWAPPED: + return VG_LITE_RGB565; + case LV_COLOR_FORMAT_ARGB8565: return VG_LITE_BGRA5658; diff --git a/src/drivers/sdl/lv_sdl_window.c b/src/drivers/sdl/lv_sdl_window.c index ebc0c20ef1..4429c943e7 100644 --- a/src/drivers/sdl/lv_sdl_window.c +++ b/src/drivers/sdl/lv_sdl_window.c @@ -235,6 +235,12 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_m uint32_t * argb_px_map = NULL; if(sdl_render_mode() == LV_DISPLAY_RENDER_MODE_PARTIAL) { + + if(cf == LV_COLOR_FORMAT_RGB565_SWAPPED) { + uint32_t width = lv_area_get_width(area); + uint32_t height = lv_area_get_height(area); + lv_draw_sw_rgb565_swap(px_map, width * height); + } /*Update values in a special OLED I1 --> ARGB8888 case We render everything in I1, but display it in ARGB8888*/ if(cf == LV_COLOR_FORMAT_I1) { diff --git a/src/libs/bin_decoder/lv_bin_decoder.c b/src/libs/bin_decoder/lv_bin_decoder.c index afda36b526..7015558dc8 100644 --- a/src/libs/bin_decoder/lv_bin_decoder.c +++ b/src/libs/bin_decoder/lv_bin_decoder.c @@ -240,6 +240,7 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d || cf == LV_COLOR_FORMAT_XRGB8888 \ || cf == LV_COLOR_FORMAT_RGB888 \ || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_RGB565_SWAPPED \ || cf == LV_COLOR_FORMAT_RGB565A8 \ || cf == LV_COLOR_FORMAT_ARGB8565) { res = decode_rgb(decoder, dsc); @@ -399,6 +400,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod || cf == LV_COLOR_FORMAT_XRGB8888 \ || cf == LV_COLOR_FORMAT_RGB888 \ || cf == LV_COLOR_FORMAT_RGB565 \ + || cf == LV_COLOR_FORMAT_RGB565_SWAPPED \ || cf == LV_COLOR_FORMAT_ARGB8565 \ || cf == LV_COLOR_FORMAT_RGB565A8; if(!supported) { @@ -484,7 +486,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod } if(cf == LV_COLOR_FORMAT_ARGB8888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_RGB888 - || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_ARGB8565) { + || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_RGB565_SWAPPED || cf == LV_COLOR_FORMAT_ARGB8565) { uint32_t len = (w_px * bpp) / 8; offset += decoded_area->y1 * dsc->header.stride; offset += decoded_area->x1 * bpp / 8; /*Move to x1*/ diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index f606d1e47a..4d95eb5c01 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -421,6 +421,17 @@ #define LV_DRAW_SW_SUPPORT_RGB565 1 #endif #endif + #ifndef LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #ifdef LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED CONFIG_LV_DRAW_SW_SUPPORT_RGB565_SWAPPED + #else + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 0 + #endif + #else + #define LV_DRAW_SW_SUPPORT_RGB565_SWAPPED 1 + #endif + #endif #ifndef LV_DRAW_SW_SUPPORT_RGB565A8 #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8 diff --git a/src/misc/lv_color.c b/src/misc/lv_color.c index 4142cd3428..fa8d3e7264 100644 --- a/src/misc/lv_color.c +++ b/src/misc/lv_color.c @@ -67,6 +67,7 @@ uint8_t lv_color_format_get_bpp(lv_color_format_t cf) return 12; case LV_COLOR_FORMAT_RGB565A8: case LV_COLOR_FORMAT_RGB565: + case LV_COLOR_FORMAT_RGB565_SWAPPED: case LV_COLOR_FORMAT_YUY2: case LV_COLOR_FORMAT_AL88: case LV_COLOR_FORMAT_ARGB1555: @@ -394,6 +395,7 @@ uint8_t lv_color32_luminance(lv_color32_t c) return (uint8_t)((uint16_t)(77u * c.red + 151u * c.green + 28u * c.blue) >> 8); } + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/misc/lv_color.h b/src/misc/lv_color.h index 92f455ad1f..0116de1e19 100644 --- a/src/misc/lv_color.h +++ b/src/misc/lv_color.h @@ -81,6 +81,7 @@ enum { (cf) == LV_COLOR_FORMAT_NEMA_TSC12A ? 12 : \ (cf) == LV_COLOR_FORMAT_AL88 ? 16 : \ (cf) == LV_COLOR_FORMAT_RGB565 ? 16 : \ + (cf) == LV_COLOR_FORMAT_RGB565_SWAPPED ? 16 : \ (cf) == LV_COLOR_FORMAT_RGB565A8 ? 16 : \ (cf) == LV_COLOR_FORMAT_YUY2 ? 16 : \ (cf) == LV_COLOR_FORMAT_ARGB1555 ? 16 : \ @@ -154,6 +155,7 @@ typedef enum { LV_COLOR_FORMAT_ARGB8565 = 0x13, /**< Not supported by sw renderer yet. */ LV_COLOR_FORMAT_RGB565A8 = 0x14, /**< Color array followed by Alpha array*/ LV_COLOR_FORMAT_AL88 = 0x15, /**< L8 with alpha >*/ + LV_COLOR_FORMAT_RGB565_SWAPPED = 0x1B, /*3 byte (+alpha) formats*/ LV_COLOR_FORMAT_RGB888 = 0x0F, @@ -438,6 +440,17 @@ uint8_t lv_color24_luminance(const uint8_t * c); */ uint8_t lv_color32_luminance(lv_color32_t c); + +/** + * Swap the endianness of an rgb565 color + * @param c a color + * @return the swapped color + */ +static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_swap_16(uint16_t c) +{ + return (c >> 8) | (c << 8); +} + /********************** * MACROS **********************/ diff --git a/src/others/test/lv_test_screenshot_compare.c b/src/others/test/lv_test_screenshot_compare.c index 0327e0196d..db73d18a19 100644 --- a/src/others/test/lv_test_screenshot_compare.c +++ b/src/others/test/lv_test_screenshot_compare.c @@ -189,7 +189,10 @@ static void buf_to_xrgb8888(const lv_draw_buf_t * draw_buf, uint8_t * buf_out) lv_color_format_t cf_in = draw_buf->header.cf; const uint8_t * buf_in = draw_buf->data; - if(cf_in == LV_COLOR_FORMAT_RGB565) { + if(cf_in == LV_COLOR_FORMAT_RGB565 || cf_in == LV_COLOR_FORMAT_RGB565_SWAPPED) { + if(cf_in == LV_COLOR_FORMAT_RGB565_SWAPPED) { + lv_draw_sw_rgb565_swap(draw_buf->data, draw_buf->header.w * draw_buf->header.h); + } uint32_t y; for(y = 0; y < draw_buf->header.h; y++) { 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 33785baee7..36d3787e50 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 04ceee40ee..6b610b6e89 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..f85025069b Binary files /dev/null and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..6c682f7a5a Binary files /dev/null and b/tests/ref_imgs/draw/render/al88/demo_render_image_normal_3_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 dcb7132cda..a39a258ae5 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 02fd7eed46..5d11926512 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/al88/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..74fbdab113 Binary files /dev/null and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..fbf300675e Binary files /dev/null and b/tests/ref_imgs/draw/render/al88/demo_render_image_recolor_3_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 0dffe87c78..28b265229d 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 2de0d2d2c4..f1c7ae185f 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..f47f3711b0 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..cb2bf3ffea Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_normal_3_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 fa2d998441..dc35b0a8a3 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 f3f0cd0ceb..20bbe3e5be 100644 Binary files a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..740e09350c Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..4406c4eb80 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png index 882cdf243a..09a9eddd6c 100644 Binary files a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png index 493650b6a6..09a9eddd6c 100644 Binary files a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..dfbca1065b Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..7b712123d4 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png index 1a247f81e6..09a9eddd6c 100644 Binary files a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png index 0fede053bc..09a9eddd6c 100644 Binary files a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..bbb525354b Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..42848d8d31 Binary files /dev/null and b/tests/ref_imgs/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png index f2aff493da..3081848121 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png index 48871afd2f..2c994d94fb 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_192.png new file mode 100644 index 0000000000..d980922a75 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..bd43826a3f Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png index 747a59fe34..edfcce5ca9 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png index d3b58f9736..68199711a8 100644 Binary files a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_opa_192.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_opa_192.png new file mode 100644 index 0000000000..dcea5e32f4 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_opa_192.png differ diff --git a/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..5b89ad2228 Binary files /dev/null and b/tests/ref_imgs/draw/render/i1/demo_render_image_recolor_3_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 9c262b75b8..706142b859 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 eae7583eae..571257bc77 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..ada7adfbc9 Binary files /dev/null and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..ea5075334d Binary files /dev/null and b/tests/ref_imgs/draw/render/l8/demo_render_image_normal_3_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 42bd9fcbeb..aa529e44cd 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 e8f5451be7..5060f2117f 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/l8/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..0f2ee47413 Binary files /dev/null and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..8cca8ed4d9 Binary files /dev/null and b/tests/ref_imgs/draw/render/l8/demo_render_image_recolor_3_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 9deb26d674..6e4189e193 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 44e842330c..d97c7ab566 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..ab85d2f59a Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..92be3775da Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_normal_3_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 4e465192a2..6b39b0530e 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 89b432eafb..845b061788 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/rgb565/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..3566b5845f Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..560f253bfb Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png new file mode 100644 index 0000000000..fed784f402 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000..63ce8fd7e3 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png new file mode 100644 index 0000000000..2b59bf77c8 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png new file mode 100644 index 0000000000..a764f98210 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png new file mode 100644 index 0000000000..07e496c033 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png new file mode 100644 index 0000000000..de78fa96db Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_128.png new file mode 100644 index 0000000000..4b79e19edd Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_255.png new file mode 100644 index 0000000000..eb9ef2c478 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_border_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png new file mode 100644 index 0000000000..547f4723e1 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png new file mode 100644 index 0000000000..d8f004a41a Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png new file mode 100644 index 0000000000..273075cea7 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000..687734d3c0 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_128.png new file mode 100644 index 0000000000..458a308bfe Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_255.png new file mode 100644 index 0000000000..9860df14d9 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_fill_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png new file mode 100644 index 0000000000..5a96ab9250 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png new file mode 100644 index 0000000000..8d51de995b Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000..6e4189e193 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png new file mode 100644 index 0000000000..d97c7ab566 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..ab85d2f59a Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..92be3775da Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000..d9c3d5abe6 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png new file mode 100644 index 0000000000..cad3b946d1 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000..6b39b0530e Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png new file mode 100644 index 0000000000..845b061788 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..3566b5845f Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..560f253bfb Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png new file mode 100644 index 0000000000..65bee8def7 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png new file mode 100644 index 0000000000..ed3af4ce76 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_128.png new file mode 100644 index 0000000000..93d194aed3 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_255.png new file mode 100644 index 0000000000..1e90e5eca0 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_line_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png new file mode 100644 index 0000000000..5545cdc7dd Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000..fbedf327f6 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png new file mode 100644 index 0000000000..3d425eb1cf Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000..dd0475638a Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_128.png new file mode 100644 index 0000000000..86e8721732 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_255.png new file mode 100644 index 0000000000..e4fd50f8fb Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_text_opa_255.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png new file mode 100644 index 0000000000..b431f80148 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_opa_255.png b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000..de2a3b2cbc Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb565_swapped/demo_render_triangle_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 68a4b49f4b..d83e4e8e44 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 b3568a8ecc..768a02094d 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..6f788a8902 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..47ab8c4cbc Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_normal_3_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 e62c7f28f2..e6e0373323 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 ce3170b353..e9f7a16858 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/rgb888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..36c6f8b085 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..011f7bf8d0 Binary files /dev/null and b/tests/ref_imgs/draw/render/rgb888/demo_render_image_recolor_3_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 68a4b49f4b..d83e4e8e44 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 b3568a8ecc..768a02094d 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_normal_3_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..6f788a8902 Binary files /dev/null and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..47ab8c4cbc Binary files /dev/null and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_normal_3_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 e62c7f28f2..e6e0373323 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 ce3170b353..e9f7a16858 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/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..36c6f8b085 Binary files /dev/null and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..011f7bf8d0 Binary files /dev/null and b/tests/ref_imgs/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png index 3fffdacf18..f428e13987 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png index 21f0dcea19..c000f2214e 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..f0b879f5b9 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..a7e215195f Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png index c6d0e5d194..42070b706d 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png index bce37878da..7e17a58bd4 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..7c7909caf4 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..d4d89be2e6 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb1555/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png index dc55af9cf2..0b175f3294 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png index 1ce000f1c2..04e9112054 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..30e1c27009 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..7269ed69f4 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png index 4ed59aae63..e7a0972efa 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png index 99158c1fd2..5282db1755 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..d7cb651c10 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..94b73b8130 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb2222/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png index b8355e71f3..0584cbf40a 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png index d401ab226b..d90bb7be07 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..4daf197c87 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..7d3cff8743 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png index 7f8beb7ce1..fb4af980ce 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png index 81280bf1dd..0c4ca6acda 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..9227a2dc98 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..2e1d1bbd73 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb4444/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_2_opa_128.png index 703b61541f..3e78f33e92 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 e64541ecb3..1996e66015 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_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..3f1c58a988 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..320a701cca Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_normal_3_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 eb59a6ba0a..74b5e06b8e 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 dca8011bfc..3602b8f929 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..3de0ac996b Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..da1275171c Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png index 0509fd69ec..09a9eddd6c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png index 0509fd69ec..09a9eddd6c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..b23c9e07ea Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..b23c9e07ea Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png index 0509fd69ec..09a9eddd6c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png index 0509fd69ec..09a9eddd6c 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..b23c9e07ea Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..b23c9e07ea Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/argb8888_premultiplied/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png index 30e6841ad2..cb295f0f98 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png index ecb662e05e..fe68fa4ddd 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..01d3adf701 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..4c23e0dae8 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png index ab7d197c99..14a8fc3b19 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png index db3643c7a8..ed3d7a5f60 100644 Binary files a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..49b61ce5c2 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..85df17f24d Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/l8/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_2_opa_128.png index 6a82aa7758..92c65ad498 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 72c5cdcf08..b676adcc41 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_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..33c5ee8b4a Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..5cc1958c2e Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_normal_3_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 7183fbe13c..f5ef548340 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 a652aac645..c0cf3b662e 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/rgb565/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..7e4985802f Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..cee850e222 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png new file mode 100644 index 0000000000..fed784f402 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png new file mode 100644 index 0000000000..63ce8fd7e3 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_image_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png new file mode 100644 index 0000000000..2b59bf77c8 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png new file mode 100644 index 0000000000..a764f98210 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_arc_normal_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png new file mode 100644 index 0000000000..b5380241d4 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png new file mode 100644 index 0000000000..fbbc0cd13a Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_blend_mode_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_128.png new file mode 100644 index 0000000000..4b79e19edd Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_255.png new file mode 100644 index 0000000000..eb9ef2c478 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_border_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png new file mode 100644 index 0000000000..547f4723e1 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png new file mode 100644 index 0000000000..d8f004a41a Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_box_shadow_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png new file mode 100644 index 0000000000..273075cea7 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png new file mode 100644 index 0000000000..687734d3c0 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_conical_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_128.png new file mode 100644 index 0000000000..458a308bfe Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_255.png new file mode 100644 index 0000000000..9860df14d9 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_fill_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png new file mode 100644 index 0000000000..5a96ab9250 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png new file mode 100644 index 0000000000..8d51de995b Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png new file mode 100644 index 0000000000..6e4189e193 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png new file mode 100644 index 0000000000..d97c7ab566 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..868db5c5e3 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..772930f568 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_normal_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png new file mode 100644 index 0000000000..d9c3d5abe6 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png new file mode 100644 index 0000000000..cad3b946d1 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_1_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png new file mode 100644 index 0000000000..6b39b0530e Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png new file mode 100644 index 0000000000..845b061788 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_2_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..bc70180f7a Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..6a52967345 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_image_recolor_3_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png new file mode 100644 index 0000000000..13c66c3699 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png new file mode 100644 index 0000000000..0b4b9bc333 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_layer_normal_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_128.png new file mode 100644 index 0000000000..93d194aed3 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_255.png new file mode 100644 index 0000000000..1e90e5eca0 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_line_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png new file mode 100644 index 0000000000..5545cdc7dd Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png new file mode 100644 index 0000000000..fbedf327f6 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_linear_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png new file mode 100644 index 0000000000..3d425eb1cf Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png new file mode 100644 index 0000000000..dd0475638a Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_radial_gradient_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_128.png new file mode 100644 index 0000000000..86e8721732 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_255.png new file mode 100644 index 0000000000..e4fd50f8fb Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_text_opa_255.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png new file mode 100644 index 0000000000..b431f80148 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_opa_255.png new file mode 100644 index 0000000000..de2a3b2cbc Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb565_swapped/demo_render_triangle_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 01b5151f37..59e04626c6 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 4e15bed284..c4a0dbe0c7 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_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..5a2ee35eb4 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..737dbd86a5 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_normal_3_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 27f5549574..fa9f828f21 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 f7f792cb5a..b5dd3ff4b2 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/rgb888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..bda5f35e91 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..ea05da6f04 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/rgb888/demo_render_image_recolor_3_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 aeb7089c6f..fb2c87f3b3 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 fd44af79fd..80b1297334 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_normal_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_3_opa_128.png new file mode 100644 index 0000000000..dccafdaeb0 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_3_opa_255.png new file mode 100644 index 0000000000..fc9ea69a75 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_normal_3_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 d1632e4cec..3af4fa05d1 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 8e05d9d255..38ff644a4e 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/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png new file mode 100644 index 0000000000..33cb39ae6b Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_128.png differ diff --git a/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png new file mode 100644 index 0000000000..10da620fe1 Binary files /dev/null and b/tests/ref_imgs_vg_lite/draw/render/xrgb8888/demo_render_image_recolor_3_opa_255.png differ 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 c65194471e..9bf511c850 100644 --- a/tests/src/test_cases/draw/test_render_to_al88.c +++ b/tests/src/test_cases/draw/test_render_to_al88.c @@ -31,8 +31,8 @@ void test_render_to_al88(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); diff --git a/tests/src/test_cases/draw/test_render_to_argb1555.c b/tests/src/test_cases/draw/test_render_to_argb1555.c index fb2078aeed..2d2384478c 100644 --- a/tests/src/test_cases/draw/test_render_to_argb1555.c +++ b/tests/src/test_cases/draw/test_render_to_argb1555.c @@ -32,8 +32,8 @@ void test_render_to_argb1555(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); lv_draw_buf_t * draw_buf = lv_snapshot_take(lv_screen_active(), LV_COLOR_FORMAT_ARGB1555); diff --git a/tests/src/test_cases/draw/test_render_to_argb2222.c b/tests/src/test_cases/draw/test_render_to_argb2222.c index b62e63d650..7d7c574e08 100644 --- a/tests/src/test_cases/draw/test_render_to_argb2222.c +++ b/tests/src/test_cases/draw/test_render_to_argb2222.c @@ -32,8 +32,8 @@ void test_render_to_argb2222(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); lv_draw_buf_t * draw_buf = lv_snapshot_take(lv_screen_active(), LV_COLOR_FORMAT_ARGB2222); diff --git a/tests/src/test_cases/draw/test_render_to_argb4444.c b/tests/src/test_cases/draw/test_render_to_argb4444.c index a7535ae925..dbb0de3396 100644 --- a/tests/src/test_cases/draw/test_render_to_argb4444.c +++ b/tests/src/test_cases/draw/test_render_to_argb4444.c @@ -32,8 +32,8 @@ void test_render_to_argb4444(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); lv_draw_buf_t * draw_buf = lv_snapshot_take(lv_screen_active(), LV_COLOR_FORMAT_ARGB4444); 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 695fed29f3..81c640f823 100644 --- a/tests/src/test_cases/draw/test_render_to_argb8888.c +++ b/tests/src/test_cases/draw/test_render_to_argb8888.c @@ -28,8 +28,8 @@ void test_render_to_argb8888(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); diff --git a/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c b/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c index 382bce0d26..93fdcf0ad0 100644 --- a/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c +++ b/tests/src/test_cases/draw/test_render_to_argb8888_premultiplied.c @@ -28,8 +28,8 @@ void test_render_to_argb8888_premultiplied(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); 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 bbc2e751d4..aa5f1f4080 100644 --- a/tests/src/test_cases/draw/test_render_to_l8.c +++ b/tests/src/test_cases/draw/test_render_to_l8.c @@ -29,8 +29,8 @@ void test_render_to_l8(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; char buf[128]; lv_snprintf(buf, sizeof(buf), "draw/render/l8/demo_render_%s_opa_%d.png", 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 52d8559446..6026d179b5 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb565.c +++ b/tests/src/test_cases/draw/test_render_to_rgb565.c @@ -28,8 +28,8 @@ void test_render_to_rgb565(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); diff --git a/tests/src/test_cases/draw/test_render_to_rgb565_swapped.c b/tests/src/test_cases/draw/test_render_to_rgb565_swapped.c new file mode 100644 index 0000000000..3b4a340496 --- /dev/null +++ b/tests/src/test_cases/draw/test_render_to_rgb565_swapped.c @@ -0,0 +1,44 @@ +#if LV_BUILD_TEST +#include "../lvgl.h" +#include "../../lvgl_private.h" +#include "../demos/lv_demos.h" + +#include "unity/unity.h" + +void setUp(void) +{ + /* Function run before every test */ +} + +void tearDown(void) +{ + /* Function run after every test */ + lv_display_set_color_format(NULL, LV_COLOR_FORMAT_XRGB8888); +} + +void test_render_to_rgb565_swapped(void) +{ + lv_display_set_color_format(NULL, LV_COLOR_FORMAT_RGB565_SWAPPED); + + lv_opa_t opa_values[2] = {0xff, 0x80}; + uint32_t opa; + for(opa = 0; opa < 2; opa++) { + uint32_t i; + for(i = 0; i < LV_DEMO_RENDER_SCENE_NUM; i++) { + + /*Skip test with transformed indexed images if they are not loaded to RAM*/ + if(LV_BIN_DECODER_RAM_LOAD == 0 && + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; + + lv_demo_render(i, opa_values[opa]); + + char buf[128]; + lv_snprintf(buf, sizeof(buf), "draw/render/rgb565_swapped/demo_render_%s_opa_%d.png", + lv_demo_render_get_scene_name(i), opa_values[opa]); + TEST_ASSERT_EQUAL_SCREENSHOT(buf); + } + } +} + +#endif 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 12e72a2bd0..791dfdd41a 100644 --- a/tests/src/test_cases/draw/test_render_to_rgb888.c +++ b/tests/src/test_cases/draw/test_render_to_rgb888.c @@ -28,8 +28,8 @@ void test_render_to_rgb888(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]); 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 e21addf2c6..ddaac7b797 100644 --- a/tests/src/test_cases/draw/test_render_to_xrgb8888.c +++ b/tests/src/test_cases/draw/test_render_to_xrgb8888.c @@ -28,8 +28,8 @@ void test_render_to_xrgb8888(void) /*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; + (i == LV_DEMO_RENDER_SCENE_IMAGE_NORMAL_3 || + i == LV_DEMO_RENDER_SCENE_IMAGE_RECOLOR_3)) continue; lv_demo_render(i, opa_values[opa]);