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