1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 #include "lv_test_helpers.h"
5 
6 #include "unity/unity.h"
7 
setUp(void)8 void setUp(void)
9 {
10     /* Function run before every test */
11     lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_ROW_WRAP);
12     lv_obj_set_flex_align(lv_screen_active(), LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_EVENLY);
13 
14 }
15 
tearDown(void)16 void tearDown(void)
17 {
18     /* Function run after every test */
19 }
20 
canvas_basic_render(uint8_t * canvas_buf,lv_color_format_t render_cf,const char * name_main,const char * name_sub)21 static void canvas_basic_render(uint8_t * canvas_buf, lv_color_format_t render_cf, const char * name_main,
22                                 const char * name_sub)
23 {
24     lv_obj_t * canvas = lv_canvas_create(lv_screen_active());
25     lv_canvas_set_buffer(canvas, canvas_buf, 180, 180, render_cf);
26 
27     lv_canvas_fill_bg(canvas, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), LV_OPA_COVER);
28 
29     lv_layer_t layer;
30     lv_canvas_init_layer(canvas, &layer);
31 
32     lv_area_t area;
33     char txt[64];
34     lv_snprintf(txt, sizeof(txt), "%s_to_%s", name_main, name_sub);
35     lv_draw_label_dsc_t label_dsc;
36     lv_draw_label_dsc_init(&label_dsc);
37     label_dsc.text = txt;
38 
39     area.x1 = 3;
40     area.x2 = 180;
41     area.y1 = 5;
42     area.y2 = 25;
43     lv_draw_label(&layer, &label_dsc, &area);
44 
45     lv_draw_rect_dsc_t rect_dsc;
46     lv_draw_rect_dsc_init(&rect_dsc);
47     rect_dsc.radius = 10;
48     rect_dsc.bg_color = lv_palette_main(LV_PALETTE_RED);
49     rect_dsc.bg_opa = LV_OPA_COVER;
50     rect_dsc.outline_color = lv_palette_main(LV_PALETTE_INDIGO);
51     rect_dsc.outline_width = 10;
52     rect_dsc.outline_pad = -5;
53     rect_dsc.outline_opa = LV_OPA_60;
54     rect_dsc.shadow_color = lv_palette_main(LV_PALETTE_ORANGE);
55     rect_dsc.shadow_width = 10;
56     rect_dsc.shadow_offset_x = 5;
57     rect_dsc.shadow_offset_y = 10;
58 
59     area.x1 = 10;
60     area.x2 = 170;
61     area.y1 = 30;
62     area.y2 = 60;
63 
64     lv_draw_rect(&layer, &rect_dsc, &area);
65 
66     area.y1 = 80;
67     area.y2 = 110;
68 
69     rect_dsc.bg_grad.dir = LV_GRAD_DIR_HOR;
70     rect_dsc.bg_grad.stops_count = 2;
71     rect_dsc.bg_grad.stops[0].color = lv_palette_main(LV_PALETTE_RED);
72     rect_dsc.bg_grad.stops[0].opa = LV_OPA_COVER;
73     rect_dsc.bg_grad.stops[0].frac = 0;
74     rect_dsc.bg_grad.stops[1].color = lv_palette_main(LV_PALETTE_GREEN);
75     rect_dsc.bg_grad.stops[1].opa = LV_OPA_COVER;
76     rect_dsc.bg_grad.stops[1].frac = 255;
77 
78     lv_draw_rect(&layer, &rect_dsc, &area);
79 
80     area.y1 = 130;
81     area.y2 = 160;
82     rect_dsc.bg_grad.stops[0].opa = LV_OPA_30;
83 
84     lv_draw_rect(&layer, &rect_dsc, &area);
85 
86     lv_canvas_finish_layer(canvas, &layer);
87 
88     lv_obj_delete(canvas);
89 }
90 
canvas_blend_test(lv_obj_t * canvas_large,lv_draw_image_dsc_t * img_dsc,const char * name_main,const char * name_sub,lv_color_format_t small_render_cf,uint32_t idx)91 void canvas_blend_test(lv_obj_t  * canvas_large, lv_draw_image_dsc_t * img_dsc, const char * name_main,
92                        const char * name_sub, lv_color_format_t small_render_cf, uint32_t idx)
93 {
94     lv_draw_buf_t * img = (lv_draw_buf_t *)img_dsc->src;
95     img->header.cf = small_render_cf;
96     img->header.stride = lv_draw_buf_width_to_stride(180, small_render_cf);
97     canvas_basic_render((uint8_t *)img->data, small_render_cf, name_main, name_sub);
98 
99     lv_area_t area;
100     area.x1 = (idx % 2) * 380 + 10;
101     area.x2 = area.x1 + 179;
102     area.y1 = (idx / 2) * 190 + 10;
103     area.y2 = area.y1 + 179;
104 
105     lv_layer_t layer;
106 
107     img_dsc->opa = LV_OPA_COVER;
108     lv_canvas_init_layer(canvas_large, &layer);
109     lv_draw_image(&layer, img_dsc, &area);
110     lv_canvas_finish_layer(canvas_large, &layer);
111 
112     lv_area_move(&area, 190, 0);
113 
114     img_dsc->opa = LV_OPA_50;
115     lv_canvas_init_layer(canvas_large, &layer);
116     lv_draw_image(&layer, img_dsc, &area);
117     lv_canvas_finish_layer(canvas_large, &layer);
118 
119     lv_image_cache_drop(img);
120 }
121 
canvas_draw(const char * name,lv_color_format_t large_render_cf)122 static void canvas_draw(const char * name, lv_color_format_t large_render_cf)
123 {
124     lv_obj_clean(lv_screen_active());
125 
126     static LV_ATTRIBUTE_MEM_ALIGN uint8_t canvas_buf[CANVAS_WIDTH_TO_STRIDE(180, 4) * 180 + LV_DRAW_BUF_ALIGN];
127 
128     static uint8_t canvas2_buf[CANVAS_WIDTH_TO_STRIDE(768, 4) * 390 + LV_DRAW_BUF_ALIGN];
129     lv_obj_t * canvas2 = lv_canvas_create(lv_screen_active());
130     lv_canvas_set_buffer(canvas2, lv_draw_buf_align(canvas2_buf, large_render_cf), 768, 390, large_render_cf);
131     lv_canvas_fill_bg(canvas2, lv_palette_lighten(LV_PALETTE_BLUE_GREY, 2), LV_OPA_COVER);
132 
133     lv_draw_buf_t img;
134     lv_draw_buf_init(&img, 180, 180, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, canvas_buf, sizeof(canvas_buf));
135 
136     lv_draw_image_dsc_t img_dsc;
137     lv_draw_image_dsc_init(&img_dsc);
138     img_dsc.src = &img;
139 
140     canvas_blend_test(canvas2, &img_dsc, "rgb565", name, LV_COLOR_FORMAT_RGB565, 0);
141     canvas_blend_test(canvas2, &img_dsc, "rgb888", name, LV_COLOR_FORMAT_RGB888, 1);
142     canvas_blend_test(canvas2, &img_dsc, "xrgb8888", name, LV_COLOR_FORMAT_XRGB8888, 2);
143     canvas_blend_test(canvas2, &img_dsc, "argb8888", name, LV_COLOR_FORMAT_ARGB8888, 3);
144 
145     char fn_buf[64];
146     lv_snprintf(fn_buf, sizeof(fn_buf), "draw/blend_to_%s.png", name);
147     TEST_ASSERT_EQUAL_SCREENSHOT(fn_buf);
148 }
149 
test_xrgb8888(void)150 void test_xrgb8888(void)
151 {
152     canvas_draw("xrgb8888", LV_COLOR_FORMAT_XRGB8888);
153 }
154 
test_argb8888(void)155 void test_argb8888(void)
156 {
157     canvas_draw("argb8888", LV_COLOR_FORMAT_ARGB8888);
158 }
159 
test_rgb888(void)160 void test_rgb888(void)
161 {
162     canvas_draw("rgb888", LV_COLOR_FORMAT_RGB888);
163 }
164 
test_rgb565(void)165 void test_rgb565(void)
166 {
167     canvas_draw("rgb565", LV_COLOR_FORMAT_RGB565);
168 }
169 
170 #endif
171