1 #if LV_BUILD_TEST
2 #include "../lvgl.h"
3 #include "../../lvgl_private.h"
4 
5 #include "unity/unity.h"
6 #include <stdio.h>
7 
8 static const char * color_formats[] = {
9     "I1", /*7 I1*/
10     "I2", /*8 I2*/
11     "I4", /*9 I4*/
12     "I8", /*10 I8*/
13     "A1", /*11 A1*/
14     "A2", /*12 A2*/
15     "A4", /*13 A4*/
16     "A8", /*14 A8*/
17     "RGB565A8", /*20 RGB565A8*/
18     "RGB565", /*18 RGB565*/
19     "RGB888", /*15 RGB888*/
20     "XRGB8888", /*17 XRGB8888*/
21     "ARGB8888", /*16 ARGB8888*/
22 };
23 
24 static const char * compressions[] = {
25     "UNCOMPRESSED",
26 #if LV_BIN_DECODER_RAM_LOAD == 1
27     "RLE",
28     "LZ4"
29 #endif
30 };
31 
32 static const char * modes[] = {
33     "simple",
34     "recolor",
35     "rotate",
36     "rotate_recolor",
37 };
38 
39 static const int stride_align[] = {
40     1,
41     64,
42 };
43 
44 LV_IMAGE_DECLARE(test_I1_NONE_align1);
45 LV_IMAGE_DECLARE(test_I2_NONE_align1);
46 LV_IMAGE_DECLARE(test_I4_NONE_align1);
47 LV_IMAGE_DECLARE(test_I8_NONE_align1);
48 LV_IMAGE_DECLARE(test_A1_NONE_align1);
49 LV_IMAGE_DECLARE(test_A2_NONE_align1);
50 LV_IMAGE_DECLARE(test_A4_NONE_align1);
51 LV_IMAGE_DECLARE(test_A8_NONE_align1);
52 LV_IMAGE_DECLARE(test_RGB565A8_NONE_align1);
53 LV_IMAGE_DECLARE(test_RGB565_NONE_align1);
54 LV_IMAGE_DECLARE(test_RGB888_NONE_align1);
55 LV_IMAGE_DECLARE(test_XRGB8888_NONE_align1);
56 LV_IMAGE_DECLARE(test_ARGB8888_NONE_align1);
57 LV_IMAGE_DECLARE(test_I1_RLE_align1);
58 LV_IMAGE_DECLARE(test_I2_RLE_align1);
59 LV_IMAGE_DECLARE(test_I4_RLE_align1);
60 LV_IMAGE_DECLARE(test_I8_RLE_align1);
61 LV_IMAGE_DECLARE(test_A1_RLE_align1);
62 LV_IMAGE_DECLARE(test_A2_RLE_align1);
63 LV_IMAGE_DECLARE(test_A4_RLE_align1);
64 LV_IMAGE_DECLARE(test_A8_RLE_align1);
65 LV_IMAGE_DECLARE(test_RGB565A8_RLE_align1);
66 LV_IMAGE_DECLARE(test_RGB565_RLE_align1);
67 LV_IMAGE_DECLARE(test_RGB888_RLE_align1);
68 LV_IMAGE_DECLARE(test_XRGB8888_RLE_align1);
69 LV_IMAGE_DECLARE(test_ARGB8888_RLE_align1);
70 
71 LV_IMAGE_DECLARE(test_I1_LZ4_align1);
72 LV_IMAGE_DECLARE(test_I2_LZ4_align1);
73 LV_IMAGE_DECLARE(test_I4_LZ4_align1);
74 LV_IMAGE_DECLARE(test_I8_LZ4_align1);
75 LV_IMAGE_DECLARE(test_A1_LZ4_align1);
76 LV_IMAGE_DECLARE(test_A2_LZ4_align1);
77 LV_IMAGE_DECLARE(test_A4_LZ4_align1);
78 LV_IMAGE_DECLARE(test_A8_LZ4_align1);
79 LV_IMAGE_DECLARE(test_RGB565A8_LZ4_align1);
80 LV_IMAGE_DECLARE(test_RGB565_LZ4_align1);
81 LV_IMAGE_DECLARE(test_RGB888_LZ4_align1);
82 LV_IMAGE_DECLARE(test_XRGB8888_LZ4_align1);
83 LV_IMAGE_DECLARE(test_ARGB8888_LZ4_align1);
84 
85 LV_IMAGE_DECLARE(test_I1_NONE_align64);
86 LV_IMAGE_DECLARE(test_I2_NONE_align64);
87 LV_IMAGE_DECLARE(test_I4_NONE_align64);
88 LV_IMAGE_DECLARE(test_I8_NONE_align64);
89 LV_IMAGE_DECLARE(test_A1_NONE_align64);
90 LV_IMAGE_DECLARE(test_A2_NONE_align64);
91 LV_IMAGE_DECLARE(test_A4_NONE_align64);
92 LV_IMAGE_DECLARE(test_A8_NONE_align64);
93 LV_IMAGE_DECLARE(test_RGB565A8_NONE_align64);
94 LV_IMAGE_DECLARE(test_RGB565_NONE_align64);
95 LV_IMAGE_DECLARE(test_RGB888_NONE_align64);
96 LV_IMAGE_DECLARE(test_XRGB8888_NONE_align64);
97 LV_IMAGE_DECLARE(test_ARGB8888_NONE_align64);
98 
99 LV_IMAGE_DECLARE(test_I1_RLE_align64);
100 LV_IMAGE_DECLARE(test_I2_RLE_align64);
101 LV_IMAGE_DECLARE(test_I4_RLE_align64);
102 LV_IMAGE_DECLARE(test_I8_RLE_align64);
103 LV_IMAGE_DECLARE(test_A1_RLE_align64);
104 LV_IMAGE_DECLARE(test_A2_RLE_align64);
105 LV_IMAGE_DECLARE(test_A4_RLE_align64);
106 LV_IMAGE_DECLARE(test_A8_RLE_align64);
107 LV_IMAGE_DECLARE(test_RGB565A8_RLE_align64);
108 LV_IMAGE_DECLARE(test_RGB565_RLE_align64);
109 LV_IMAGE_DECLARE(test_RGB888_RLE_align64);
110 LV_IMAGE_DECLARE(test_XRGB8888_RLE_align64);
111 LV_IMAGE_DECLARE(test_ARGB8888_RLE_align64);
112 
113 LV_IMAGE_DECLARE(test_I1_LZ4_align64);
114 LV_IMAGE_DECLARE(test_I2_LZ4_align64);
115 LV_IMAGE_DECLARE(test_I4_LZ4_align64);
116 LV_IMAGE_DECLARE(test_I8_LZ4_align64);
117 LV_IMAGE_DECLARE(test_A1_LZ4_align64);
118 LV_IMAGE_DECLARE(test_A2_LZ4_align64);
119 LV_IMAGE_DECLARE(test_A4_LZ4_align64);
120 LV_IMAGE_DECLARE(test_A8_LZ4_align64);
121 LV_IMAGE_DECLARE(test_RGB565A8_LZ4_align64);
122 LV_IMAGE_DECLARE(test_RGB565_LZ4_align64);
123 LV_IMAGE_DECLARE(test_RGB888_LZ4_align64);
124 LV_IMAGE_DECLARE(test_XRGB8888_LZ4_align64);
125 LV_IMAGE_DECLARE(test_ARGB8888_LZ4_align64);
126 
127 static const void * c_array_images[sizeof(stride_align)][sizeof(compressions)][sizeof(color_formats)] = {
128     {
129         {
130             &test_I1_NONE_align1,
131             &test_I2_NONE_align1,
132             &test_I4_NONE_align1,
133             &test_I8_NONE_align1,
134             &test_A1_NONE_align1,
135             &test_A2_NONE_align1,
136             &test_A4_NONE_align1,
137             &test_A8_NONE_align1,
138             &test_RGB565A8_NONE_align1,
139             &test_RGB565_NONE_align1,
140             &test_RGB888_NONE_align1,
141             &test_XRGB8888_NONE_align1,
142             &test_ARGB8888_NONE_align1,
143         },
144         {
145             &test_I1_RLE_align1,
146             &test_I2_RLE_align1,
147             &test_I4_RLE_align1,
148             &test_I8_RLE_align1,
149             &test_A1_RLE_align1,
150             &test_A2_RLE_align1,
151             &test_A4_RLE_align1,
152             &test_A8_RLE_align1,
153             &test_RGB565A8_RLE_align1,
154             &test_RGB565_RLE_align1,
155             &test_RGB888_RLE_align1,
156             &test_XRGB8888_RLE_align1,
157             &test_ARGB8888_RLE_align1,
158         },
159         {
160             &test_I1_LZ4_align1,
161             &test_I2_LZ4_align1,
162             &test_I4_LZ4_align1,
163             &test_I8_LZ4_align1,
164             &test_A1_LZ4_align1,
165             &test_A2_LZ4_align1,
166             &test_A4_LZ4_align1,
167             &test_A8_LZ4_align1,
168             &test_RGB565A8_LZ4_align1,
169             &test_RGB565_LZ4_align1,
170             &test_RGB888_LZ4_align1,
171             &test_XRGB8888_LZ4_align1,
172             &test_ARGB8888_LZ4_align1,
173         }
174     },
175     {
176         {
177             &test_I1_NONE_align64,
178             &test_I2_NONE_align64,
179             &test_I4_NONE_align64,
180             &test_I8_NONE_align64,
181             &test_A1_NONE_align64,
182             &test_A2_NONE_align64,
183             &test_A4_NONE_align64,
184             &test_A8_NONE_align64,
185             &test_RGB565A8_NONE_align64,
186             &test_RGB565_NONE_align64,
187             &test_RGB888_NONE_align64,
188             &test_XRGB8888_NONE_align64,
189             &test_ARGB8888_NONE_align64,
190         },
191         {
192             &test_I1_RLE_align64,
193             &test_I2_RLE_align64,
194             &test_I4_RLE_align64,
195             &test_I8_RLE_align64,
196             &test_A1_RLE_align64,
197             &test_A2_RLE_align64,
198             &test_A4_RLE_align64,
199             &test_A8_RLE_align64,
200             &test_RGB565A8_RLE_align64,
201             &test_RGB565_RLE_align64,
202             &test_RGB888_RLE_align64,
203             &test_XRGB8888_RLE_align64,
204             &test_ARGB8888_RLE_align64,
205         },
206         {
207             &test_I1_LZ4_align64,
208             &test_I2_LZ4_align64,
209             &test_I4_LZ4_align64,
210             &test_I8_LZ4_align64,
211             &test_A1_LZ4_align64,
212             &test_A2_LZ4_align64,
213             &test_A4_LZ4_align64,
214             &test_A8_LZ4_align64,
215             &test_RGB565A8_LZ4_align64,
216             &test_RGB565_LZ4_align64,
217             &test_RGB888_LZ4_align64,
218             &test_XRGB8888_LZ4_align64,
219             &test_ARGB8888_LZ4_align64,
220         }
221     }
222 };
223 
setUp(void)224 void setUp(void)
225 {
226     /* Function run before every test */
227     lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_ROW_WRAP);
228     lv_obj_set_flex_align(lv_screen_active(), LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_EVENLY);
229 
230     lv_obj_clean(lv_screen_active());
231 
232 }
233 
tearDown(void)234 void tearDown(void)
235 {
236     /* Function run after every test */
237 }
238 
img_create(const char * name,const void * img_src,bool rotate,bool recolor)239 static void img_create(const char * name, const void * img_src, bool rotate, bool recolor)
240 {
241     lv_obj_t * cont = lv_obj_create(lv_screen_active());
242     lv_obj_set_size(cont, 120, LV_SIZE_CONTENT);
243     lv_obj_set_style_bg_color(cont, lv_palette_main(LV_PALETTE_LIGHT_BLUE), 0);
244     lv_obj_set_style_pad_all(cont, 5, 0);
245 
246     lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);
247 
248     lv_obj_t * img = lv_image_create(cont);
249     lv_image_set_src(img, img_src);
250     lv_obj_set_style_image_recolor(img, lv_palette_main(LV_PALETTE_RED), 0);   /*For A8*/
251     if(recolor) lv_obj_set_style_image_recolor_opa(img, LV_OPA_70, 0);
252     if(rotate) lv_image_set_rotation(img, 450);
253 
254     lv_obj_t * label = lv_label_create(cont);
255     lv_label_set_text(label, name);
256 }
257 
bin_image_create(bool rotate,bool recolor,int align,int compress)258 static void bin_image_create(bool rotate, bool recolor, int align, int compress)
259 {
260     char name[32];
261     char path[256];
262     int stride = stride_align[align];
263     for(unsigned i = 0; i < sizeof(color_formats) / sizeof(color_formats[0]); i++) {
264         lv_snprintf(name, sizeof(name), "bin%s", color_formats[i]);
265         lv_snprintf(path, sizeof(path), "A:test_images/stride_align%d/%s/test_%s.bin", stride, compressions[compress],
266                     color_formats[i]);
267         img_create(name, path, rotate, recolor);
268     }
269 }
270 
c_array_image_create(bool rotate,bool recolor,int align,int compress)271 static void c_array_image_create(bool rotate, bool recolor, int align, int compress)
272 {
273     char name[32];
274     for(unsigned i = 0; i < sizeof(color_formats) / sizeof(color_formats[0]); i++) {
275         lv_snprintf(name, sizeof(name), "%s%s", compressions[compress], color_formats[i]);
276         const void * src = c_array_images[align][compress][i];
277         img_create(name, src, rotate, recolor);
278     }
279 }
280 
test_image_formats(void)281 void test_image_formats(void)
282 {
283     for(unsigned align = 0; align <= 1; align++) {
284         int stride = stride_align[align];
285         for(unsigned mode = 0; mode <= 3; mode++) {
286             bool rotate = mode & 0x02;
287             bool recolor = mode & 0x01;
288 #if LV_BIN_DECODER_RAM_LOAD == 0
289             if(rotate) continue;  /* Transform relies on LV_BIN_DECODER_RAM_LOAD to be enabled */
290 #endif
291             /*Loop compressions array and do test.*/
292             for(unsigned i = 0; i < sizeof(compressions) / sizeof(compressions[0]); i++) {
293                 char reference[256];
294                 bin_image_create(rotate, recolor, align, i);
295                 lv_snprintf(reference, sizeof(reference), "draw/bin_image_stride%d_%s_%s.png", stride, compressions[i], modes[mode]);
296                 TEST_ASSERT_EQUAL_SCREENSHOT(reference);
297                 lv_obj_clean(lv_screen_active());
298 
299                 c_array_image_create(rotate, recolor, align, i);
300                 lv_snprintf(reference, sizeof(reference), "draw/c_array_image_stride%d_%s_%s.png", stride, compressions[i],
301                             modes[mode]);
302                 TEST_ASSERT_EQUAL_SCREENSHOT(reference);
303                 lv_obj_clean(lv_screen_active());
304             }
305         }
306     }
307 }
308 
309 #endif
310