1 
2 #include "common_code.h"
3 
4 #define QUOTIENT 0x04c11db7
5 #define MEMORY_POOL_SIZE (640 * 480 * 4)
6 
7 #define SYSTEM_CLOCK 6000000
8 #define SYSTICK_CYCLES ((SYSTEM_CLOCK / 100) -1)
9 #define ONE_MILLION 1000000
10 
11 static GX_BOOL generate = GX_FALSE;
12 static GX_BOOL test = GX_FALSE;
13 static GX_BOOL screenshot = GX_FALSE;
14 static UINT *golden_results = GX_NULL;
15 static UINT  golden_results_size = 0;
16 static UINT  test_count = 0;
17 static UINT  failed_count = 0;
18 static UINT  crc_table[256];
19 static FILE *canvas_fp = GX_NULL;
20 static FILE *golden_fp = GX_NULL;
21 static FILE *output_fp = GX_NULL;
22 static TX_BYTE_POOL memory_pool;
23 static GX_UBYTE memory_pool_buffer[MEMORY_POOL_SIZE];
24 
25 extern int stdout_init (void);
26 
27 /******************************************************************************************/
28 /* Define memory allocator function.                                                     */
29 /******************************************************************************************/
memory_allocate(ULONG size)30 VOID *memory_allocate(ULONG size)
31 {
32     VOID *memptr;
33 
34     if (tx_byte_allocate(&memory_pool, &memptr, size, TX_NO_WAIT) == TX_SUCCESS)
35     {
36         return memptr;
37     }
38     return NULL;
39 }
40 
41 /******************************************************************************************/
42 /* Define memory de-allocator function.                                                   */
43 /******************************************************************************************/
memory_free(VOID * mem)44 void memory_free(VOID *mem)
45 {
46     tx_byte_release(mem);
47 }
48 
memory_pool_create()49 VOID memory_pool_create()
50 {
51 	    /* create byte pool for decode to use */
52     tx_byte_pool_create(&memory_pool, "scratchpad", memory_pool_buffer, MEMORY_POOL_SIZE);
53 
54     /* install our memory allocator and de-allocator */
55     gx_system_memory_allocator_set(memory_allocate, memory_free);
56 }
57 
display_buffer_toggle(GX_CANVAS * canvas,GX_RECTANGLE * dirty)58 VOID display_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
59 {
60 
61 }
62 
graphics_driver_8bit_palette_set(GX_DISPLAY * display,GX_COLOR * palette,INT count)63 VOID graphics_driver_8bit_palette_set(GX_DISPLAY *display, GX_COLOR *palette, INT count)
64 {
65     display -> gx_display_palette = palette;
66     display -> gx_display_palette_size = count;
67 }
68 
graphics_driver_565rgb_setup(GX_DISPLAY * display)69 UINT graphics_driver_565rgb_setup(GX_DISPLAY *display)
70 {
71     _gx_display_driver_565rgb_setup(display, GX_NULL, display_buffer_toggle);
72 
73     return GX_SUCCESS;
74 }
75 
graphics_driver_1555xrgb_setup(GX_DISPLAY * display)76 UINT graphics_driver_1555xrgb_setup(GX_DISPLAY *display)
77 {
78     _gx_display_driver_1555xrgb_setup(display, GX_NULL, display_buffer_toggle);
79 
80     return GX_SUCCESS;
81 }
82 
graphics_driver_24xrgb_setup(GX_DISPLAY * display)83 UINT graphics_driver_24xrgb_setup(GX_DISPLAY *display)
84 {
85     _gx_display_driver_24xrgb_setup(display, GX_NULL, display_buffer_toggle);
86 
87     return GX_SUCCESS;
88 }
89 
graphics_driver_8bit_palette_setup(GX_DISPLAY * display)90 UINT graphics_driver_8bit_palette_setup(GX_DISPLAY *display)
91 {
92     _gx_display_driver_8bit_palette_setup(display, GX_NULL, display_buffer_toggle);
93     display -> gx_display_driver_palette_set = graphics_driver_8bit_palette_set;
94 
95     return GX_SUCCESS;
96 }
97 
graphics_driver_565rgb_rotated_setup(GX_DISPLAY * display)98 UINT graphics_driver_565rgb_rotated_setup(GX_DISPLAY *display)
99 {
100     _gx_display_driver_565rgb_rotated_setup(display, GX_NULL, display_buffer_toggle);
101 
102     return GX_SUCCESS;
103 }
104 
graphics_driver_24xrgb_rotated_setup(GX_DISPLAY * display)105 UINT graphics_driver_24xrgb_rotated_setup(GX_DISPLAY *display)
106 {
107     _gx_display_driver_24xrgb_rotated_setup(display, GX_NULL, display_buffer_toggle);
108 
109     return GX_SUCCESS;
110 }
111 
graphics_driver_8bit_palette_rotated_setup(GX_DISPLAY * display)112 UINT graphics_driver_8bit_palette_rotated_setup(GX_DISPLAY *display)
113 {
114     _gx_display_driver_8bit_palette_rotated_setup(display, GX_NULL, display_buffer_toggle);
115     display -> gx_display_driver_palette_set = graphics_driver_8bit_palette_set;
116 
117     return GX_SUCCESS;
118 }
119 
write_data_callback(GX_UBYTE * byte_data,UINT data_count)120 UINT write_data_callback(GX_UBYTE *byte_data, UINT data_count)
121 {
122     if(canvas_fp)
123     {
124         fwrite(byte_data, 1, data_count, canvas_fp);
125     }
126 
127     return GX_SUCCESS;
128 }
129 
test_start(GX_BOOL g,GX_BOOL t,GX_BOOL s,UINT * results,UINT size)130 VOID test_start(GX_BOOL g, GX_BOOL t, GX_BOOL s, UINT *results, UINT size)
131 {
132     generate = g;
133     test = t;
134     screenshot = s;
135     golden_results = results;
136     golden_results_size = size;
137 
138 	  stdout_init();
139 }
140 
test_string_length_get(GX_CONST GX_CHAR * input_string,UINT max_string_length)141 static UINT test_string_length_get(GX_CONST GX_CHAR* input_string, UINT max_string_length)
142 {
143     UINT length = 0;
144 
145     if (input_string)
146     {
147         /* Traverse the string.  */
148         for (length = 0; input_string[length]; length++)
149         {
150             /* Check if the string length is bigger than the max string length.  */
151             if (length >= max_string_length)
152             {
153                 break;
154             }
155         }
156     }
157 
158     return length;
159 }
160 
test_verify_canvas(GX_CANVAS * canvas,INT frame_id)161 VOID test_verify_canvas(GX_CANVAS *canvas, INT frame_id)
162 {
163 UINT new_crc;
164 GX_RECTANGLE size;
165 GX_CHAR string[50];
166 
167     if(screenshot)
168     {
169         sprintf(string, "frame_%d.bmp", frame_id);
170         canvas_fp  = fopen (string, "w+");
171         gx_utility_rectangle_define(&size, 0, 0, canvas->gx_canvas_x_resolution - 1, canvas->gx_canvas_y_resolution - 1);
172         gx_utility_canvas_to_bmp(canvas, &size, write_data_callback);
173         fclose(canvas_fp);
174         canvas_fp = GX_NULL;
175     }
176 
177     new_crc = crc_calculate((UCHAR *)canvas->gx_canvas_memory, canvas->gx_canvas_memory_size);
178 
179     if(test)
180     {
181         if(!golden_results)
182         {
183            printf("golden results is missing!\r\n");
184            failed_count++;
185         }
186         else if(frame_id <= golden_results_size)
187         {
188            if(new_crc != golden_results[frame_id - 1])
189            {
190                printf("frame %d: failed\r\n", frame_id);
191                failed_count++;
192            }
193            else
194            {
195                printf("frame %d: passed\r\n", frame_id);
196            }
197         }
198         else
199         {
200           printf("frame %d: failed\r\n", frame_id);
201           failed_count++;
202         }
203 
204         test_count++;
205     }
206 
207     if(generate || test)
208     {
209         if(frame_id == 1)
210         {
211           if(generate)
212           {
213               golden_fp = fopen("golden_results.c", "w+");
214           }
215           if(test)
216           {
217               output_fp = fopen("output_results.c", "w+");
218           }
219           sprintf(string, "UINT golden_results[] ={\r\n    0x%x", new_crc);
220         }
221         else
222         {
223           sprintf(string, ",\r\n    0x%x", new_crc);
224         }
225 
226         if(golden_fp)
227         {
228             fwrite(string, 1, test_string_length_get(string, 256), golden_fp);
229         }
230 
231         if(output_fp)
232         {
233             fwrite(string, 1, test_string_length_get(string, 256), output_fp);
234         }
235     }
236 }
237 
test_end()238 UINT test_end()
239 {
240     if(golden_fp)
241     {
242        fwrite("\r\n};", 1, 3, golden_fp);
243        fclose(golden_fp);
244        golden_fp = GX_NULL;
245     }
246 
247     if(output_fp)
248     {
249        fwrite("\r\n};", 1, 3, output_fp);
250        fclose(output_fp);
251        output_fp = GX_NULL;
252     }
253 
254     if(test)
255     {
256         printf("\r\nTests Passed: %d\r\n", test_count - failed_count);
257         printf("Tests Failed: %d\r\n", failed_count);
258 
259         return failed_count;
260     }
261 
262     return 0;
263 }
264 
265 ///////////////////////////////////////////////////////////////////////////////
crc32_init(UINT * crc_table,INT size)266 void crc32_init(UINT *crc_table, INT size)
267 {
268 INT  i;
269 INT  j;
270 UINT crc;
271 
272     for (i = 0; i < size; i++)
273     {
274         crc = i << 24;
275         for (j = 0; j < 8; j++)
276         {
277             if (crc & 0x80000000)
278                 crc = (crc << 1) ^ QUOTIENT;
279             else
280                 crc = crc << 1;
281         }
282         crc_table[i] = crc;
283     }
284 }
285 
286 ///////////////////////////////////////////////////////////////////////////////
crc_calculate(UCHAR * data,INT len)287 UINT crc_calculate(UCHAR *data, INT len)
288 {
289 UINT result;
290 INT  i;
291 
292     crc32_init(crc_table, sizeof(crc_table)/sizeof(UINT));
293 
294     result = *data++ << 24;
295     result |= *data++ << 16;
296     result |= *data++ << 8;
297     result |= *data++;
298     result = ~ result;
299     len -=4;
300 
301     for (i=0; i<len; i++)
302     {
303         result = (result << 8 | *data++) ^ crc_table[result >> 24];
304     }
305 
306     return ~result;
307 }
308 
test_jpeg_to_canvas_draw(GX_CANVAS * canvas,GX_WINDOW * window,MAP_INFO * test,INT frame_id)309 VOID test_jpeg_to_canvas_draw(GX_CANVAS *canvas, GX_WINDOW *window, MAP_INFO *test, INT frame_id)
310 {
311 GX_PIXELMAP *map;
312 ULONG start_time;
313 ULONG ticks;
314 
315   /* Test decode JPEG to canvas. */
316 
317   gx_window_background_draw(window);
318   while(test->map_id)
319   {
320       gx_context_pixelmap_get(test->map_id, &map);
321       start_time = tx_time_get();
322       gx_canvas_pixelmap_draw(test->xpos, test->ypos, map);
323       ticks = tx_time_get() - start_time;
324       printf("JPEG to canvas. ID Name: %s, Dimension: %dx%d, cycle count = %ld.%ld(Million Cycles)\r\n\r\n", test->name, map->gx_pixelmap_width, map->gx_pixelmap_height, ticks * SYSTICK_CYCLES / ONE_MILLION, ticks * SYSTICK_CYCLES % ONE_MILLION);
325       test++;
326   }
327   test_verify_canvas(canvas, frame_id);
328 }
329 
test_jpeg_to_pixelmap_draw(GX_CANVAS * canvas,GX_WINDOW * window,MAP_INFO * test,GX_UBYTE outformat,GX_UBYTE flags,INT frame_id)330 VOID test_jpeg_to_pixelmap_draw(GX_CANVAS *canvas, GX_WINDOW *window, MAP_INFO *test, GX_UBYTE outformat, GX_UBYTE flags, INT frame_id)
331 {
332 GX_PIXELMAP *map;
333 GX_IMAGE_READER image_reader;
334 GX_PIXELMAP outmap;
335 ULONG start_time;
336 ULONG ticks;
337 
338   /* Test decode JPEG to pixelmap. */
339 
340   gx_window_background_draw(window);
341   while(test->map_id)
342   {
343 
344       gx_context_pixelmap_get(test->map_id, &map);
345 
346       gx_image_reader_create(&image_reader, map->gx_pixelmap_data, map->gx_pixelmap_data_size, outformat, flags);
347 
348       if(outformat == GX_COLOR_FORMAT_8BIT_PALETTE)
349       {
350           gx_image_reader_palette_set(&image_reader, canvas->gx_canvas_display->gx_display_palette, canvas->gx_canvas_display->gx_display_palette_size);
351       }
352 
353       start_time = tx_time_get();
354       if(gx_image_reader_start(&image_reader, &outmap) == GX_SUCCESS)
355       {
356           ticks = tx_time_get() - start_time;
357           printf("JPGE to pixelmap. ID Name: %s, Dimension: %dx%d, cycle count = %ld.%ld(Million Cycles)\r\n\r\n", test->name, map->gx_pixelmap_width, map->gx_pixelmap_height, ticks * SYSTICK_CYCLES / ONE_MILLION, ticks * SYSTICK_CYCLES % ONE_MILLION);
358 
359           gx_canvas_pixelmap_draw(test->xpos, test->ypos, &outmap);
360           memory_free((void *)outmap.gx_pixelmap_data);
361       }
362       else
363       {
364           printf("JPEG decode failure!\r\n");
365       }
366       test++;
367   }
368   test_verify_canvas(canvas, frame_id);
369 }