Expedite: Proxy tests: Add some proxy tests.
[framework/uifw/expedite.git] / src / bin / ui.c
1 #include "main.h"
2
3 #define PROTO
4 #include "tests.h"
5 #undef PROTO
6
7 static double start = 0.0;
8
9 static double t_start = 0.0;
10 static double t_loop = 0.0;
11 static int    f_start = 0;
12 static int    f_loop = 0;
13 static char   data_dir[4096];
14
15 typedef struct _Menu_Item Menu_Item;
16
17 struct _Menu_Item
18 {
19    Evas_Object *o_icon;
20    char *icon;
21    char *text;
22    void (*func) (void);
23 };
24
25 static Evas_Object *o_bg = NULL;
26 static Evas_Object *o_wallpaper = NULL;
27 static Evas_Object *o_title = NULL;
28 static Evas_Object *o_byline = NULL;
29 static Evas_Object *o_menu_logo = NULL;
30 static Evas_Object *o_menu_icon = NULL;
31 static Evas_Object *o_menu_icon_sel = NULL;
32 static Evas_Object *o_menu_icon_sel2 = NULL;
33 static Evas_Object *o_menu_text_sel = NULL;
34 static Evas_Object *o_menu_title = NULL;
35 static Eina_List   *menu = NULL;
36 static int          menu_sel = 0;
37 static int          menu_active = 0;
38 static double       menu_anim = 0.0;
39 static double       menu_anim_sel = 0.0;
40
41 static double       p_fps = 0.0;
42
43 static void (*key_func) (char *key) = NULL;
44 static void (*loop_func) (double t, int f) = NULL;
45
46 static int run_all = 0;
47 static int run_test = 0;
48 static int list_test = 0;
49 static int exit_after_test = 0;
50
51 static double weights[] =
52 {
53    0.0, // no test 0
54      
55      50.4851, // test 1
56      97.3703, // test 2
57      10.0000, // test 3
58      87.3703, // ...
59      10.0000, 
60    
61      150.0000, // test 6
62      10.0000,
63      150.0000,
64      10.0000,
65      150.0000,
66    
67      10.0000, // test 11
68      150.0000,
69      10.0000,
70      10.6493, 
71      38.4818,
72    
73      40.7314, // test 16
74      32.0866,
75      21.3337,
76      21.2167,
77      71.6141,
78    
79      64.8893, // test 21
80      95.0880,
81      121.0438,
82      41.2646,
83      162.7149,
84    
85      89.1650, // test 26
86      105.3571,
87      40.9657,
88      98.4671,
89      28.4322,
90    
91      60.000, // test 31
92      75.5507,
93      51.6601,
94      135.4753,
95      38.2705,
96    
97      35.9915, // test 36
98      31.9500,
99      22.6752,
100      38.2702,
101      37.4459,
102    
103      37.2009, // test 41
104      34.5459,
105      38.5043,
106      50.0000,
107      37.0282,
108    
109      55.8886, // test 46
110      17.2535,
111      23.1457,
112      36.9874,
113      37.9336,
114    
115      17.1830, // test 51
116      20.7521,
117      29.0141,
118      131.6784,
119      13.6851,
120    
121      23.4462, // test 56
122      14.7573,
123      36.5261,
124       5.0000,
125       5.0000,
126    
127      24.3482, // test 61
128      10.4611,
129      86.0290,
130      82.0735,
131      18.6459,
132    
133      37.4608, // test 66
134      32.4417,
135      11.5449,
136       5.0000,
137      11.4172,
138    
139      13.3682, // test 71
140      10.0324,
141      10.0584,
142      10.0170,
143      5.4029,
144    
145      10.6349, // test 76
146      21.7728,
147      12.7933,
148      19.4177,
149      34.4192,
150    
151      23.9110, // test 81
152      22.8287,
153      41.2399,
154      30.1383,
155      22.0342,
156    
157      38.2952, // test 86
158      5.5560,
159      0.5000,
160      10.000, // Proxy tests
161      10.000,
162      10.000,
163    
164      0.0, // no final test - add a 0 at the end anyway to pad
165      0.0,
166      0.0,
167      0.0
168 };
169
170 static void
171 _ui_exit(void)
172 {
173    Menu_Item *mi;
174
175    EINA_LIST_FREE(menu, mi)
176      {
177         free(mi->icon);
178         free(mi->text);
179         free(mi);
180      }
181    engine_abort();
182 }
183
184 extern const char *profile;
185 extern int win_w, win_h;
186 extern const char *engine;
187 extern int loops;
188 extern int fullscreen;
189
190 static void
191 _ui_all(void)
192 {
193    Eina_List *l;
194    double fps = 0.0;
195    double wfps = 0.0;
196    int t_count = 0;
197    int i;
198    double avgw = 0.0;
199
200    evas_object_hide(o_menu_logo);
201    evas_object_hide(o_menu_title);
202    evas_object_hide(o_menu_icon);
203    evas_object_hide(o_menu_icon_sel);
204    evas_object_hide(o_menu_icon_sel2);
205    evas_object_hide(o_menu_text_sel);
206    evas_object_hide(o_title);
207    evas_object_hide(o_byline);
208    for (l = menu; l; l = l->next)
209      {
210         Menu_Item *mi;
211
212         mi = l->data;
213         if ((mi->func == about_start) ||
214             (mi->func == _ui_exit) ||
215             (mi->func == _ui_all))
216           continue;
217         if (mi->func) mi->func();
218         evas_object_hide(o_title);
219         evas_object_hide(o_byline);
220         while (p_fps == 0.0)
221           {
222              engine_loop();
223              ui_loop();
224              evas_render(evas);
225           }
226         /* This give time to delete the objects of the previous test and make
227            the result of next test more accurate. Draw back, some time is not
228            counted at all. */
229         evas_render(evas);
230         t_count++;
231         fps += p_fps;
232         wfps += (p_fps * weights[t_count]);
233         key_func("Escape");
234      }
235    for (i = 1; 
236         (i < ((sizeof(weights) / sizeof(double)) - 1)) &&
237         (weights[i] > 0.0);
238         i++)
239      avgw += weights[i];
240    avgw /= (i - 1);
241    if (t_count > 0)
242      {
243         char datestr[1024];
244         struct tm *tim;
245         time_t now;
246         
247         now = time(NULL);
248         tim = localtime(&now);
249         if (tim) strftime(datestr, sizeof(datestr), "%F %T", tim);
250         else snprintf(datestr, sizeof(datestr), "unknown");
251 //        printf("%5.2f , EVAS SPEED\n", fps / t_count);
252         printf("%5.2f , EVAS SPEED (WEIGHTED), "
253                "tn, %i , "
254                "t, %s , "
255                "ev , %i.%i.%i.%i , "
256                "p , %s , "
257                "sz , %i , %i , "
258                "c , %i , "
259                "e , %s , "
260                "fs , %i\n"
261                ,
262                wfps / (t_count * avgw),
263 //               fps / t_count,
264                t_count,
265                datestr,
266                evas_version->major, evas_version->minor, evas_version->micro, evas_version->revision,
267                profile,
268                win_w, win_h,
269                loops,
270                engine,
271                fullscreen
272               );
273      }
274 }
275
276
277 static void
278 _ui_num(int n)
279 {
280    double fps = 0.0;
281    double wfps = 0.0;
282    int t_count = 0;
283    Menu_Item *mi;
284    int i;
285    double avgw = 0.0;
286
287    evas_object_hide(o_menu_logo);
288    evas_object_hide(o_menu_title);
289    evas_object_hide(o_menu_icon);
290    evas_object_hide(o_menu_icon_sel);
291    evas_object_hide(o_menu_icon_sel2);
292    evas_object_hide(o_menu_text_sel);
293    evas_object_hide(o_title);
294    evas_object_hide(o_byline);
295    mi = eina_list_nth(menu, n);
296    if (mi)
297      {
298         if ((mi->func == about_start) ||
299             (mi->func == _ui_exit) ||
300             (mi->func == _ui_all))
301           goto done;
302         if (mi->func) mi->func();
303         evas_object_hide(o_title);
304         evas_object_hide(o_byline);
305         while (p_fps == 0.0)
306           {
307              ui_loop();
308              engine_loop();
309              evas_render(evas);
310           }
311         /* This give time to delete the objects of the previous test and make
312            the result of next test more accurate. Draw back, some time is not
313            counted at all. */
314         evas_render(evas);
315         t_count++;
316         fps += p_fps;
317         wfps += (p_fps * weights[n]);
318         key_func("Escape");
319      }
320    done:
321    for (i = 1; i < ((sizeof(weights) / sizeof(double)) - 1); i++)
322      avgw += weights[i];
323    avgw /= (i - 1);   
324    if (t_count > 0)
325      {
326 //        printf("%5.2f , EVAS SPEED\n", fps / t_count);
327         printf("%5.2f , EVAS SPEED (WEIGHTED)\n", wfps / (t_count * avgw));
328      }
329 }
330
331 static void
332 _ui_select(void)
333 {
334    Eina_List *l;
335    int i;
336    void (*func) (void) = NULL;
337
338    evas_object_hide(o_menu_logo);
339    evas_object_hide(o_menu_title);
340    evas_object_hide(o_menu_icon);
341    evas_object_hide(o_menu_icon_sel);
342    evas_object_hide(o_menu_icon_sel2);
343    evas_object_hide(o_menu_text_sel);
344    evas_object_hide(o_title);
345    evas_object_hide(o_byline);
346    for (i = 0, l = menu; l; l = l->next, i++)
347      {
348         Menu_Item *mi;
349
350         mi = l->data;
351         evas_object_hide(mi->o_icon);
352         if (i == menu_sel)
353           func = mi->func;
354      }
355    menu_active = 0;
356    if (func) func();
357    evas_object_hide(o_title);
358    evas_object_hide(o_byline);
359 }
360
361 static void
362 _ui_key(void *data, Evas *e, Evas_Object *obj, void *event_info)
363 {
364    Evas_Event_Key_Down *ev;
365
366    ev = event_info;
367    if (key_func)
368      {
369         key_func(ev->keyname);
370         return;
371      }
372    if ((!strcmp(ev->keyname, "Escape")) ||
373        (!strcmp(ev->keyname, "q")) ||
374        (!strcmp(ev->keyname, "Q")))
375      {
376         _ui_exit();
377      }
378    if (menu_active)
379      {
380         if (!strcmp(ev->keyname, "Left")) menu_sel++;
381         if (!strcmp(ev->keyname, "Right")) menu_sel--;
382         if (menu_sel < 0) menu_sel = 0;
383         else if (menu_sel >= eina_list_count(menu)) menu_sel = eina_list_count(menu) - 1;
384         menu_anim_sel = menu_sel;
385         if (!strcmp(ev->keyname, "Return")) _ui_select();
386      }
387 }
388
389 static Evas_Coord down_x, down_y;
390 static int down = 0;
391 static int down_menu_sel = 0;
392
393 static void
394 _ui_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
395 {
396    Evas_Event_Mouse_Down *ev;
397
398    ev = event_info;
399    if (ev->button != 1) return;
400    if (menu_active)
401      {
402         down_x = ev->canvas.x;
403         down_y = ev->canvas.y;
404         down++;
405         down_menu_sel = menu_sel;
406      }
407    else
408      {
409      }
410 }
411
412 static void
413 _ui_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
414 {
415    Evas_Event_Mouse_Up *ev;
416
417    ev = event_info;
418    if (ev->button != 1) return;
419    if (menu_active)
420      {
421         Evas_Coord dx, dy;
422
423         dx = ev->canvas.x - down_x;
424         dy = ev->canvas.y - down_y;
425         if ((((dx * dx) + (dy * dy)) < (20 * 20)) &&
426             (menu_sel == down_menu_sel))
427           _ui_select();
428         down--;
429      }
430    else
431      {
432         evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
433         evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
434      }
435 }
436
437 static void
438 _ui_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
439 {
440    Evas_Event_Mouse_Move *ev;
441
442    ev = event_info;
443    if (!down) return;
444    if (menu_active)
445      {
446         menu_sel = down_menu_sel + ((ev->cur.canvas.x - down_x) / 25);
447         /* scroll */
448         if (menu_sel < 0) menu_sel = 0;
449         else if (menu_sel >= eina_list_count(menu)) menu_sel = eina_list_count(menu) - 1;
450         menu_anim_sel = menu_sel;
451      }
452    else
453      {
454      }
455 }
456
457 static void
458 _ui_menu_item_add(char *icon, char *text, void (*func) (void))
459 {
460    Menu_Item *mi;
461
462    mi = malloc(sizeof(Menu_Item));
463    mi->o_icon = evas_object_image_add(evas);
464    evas_object_image_file_set(mi->o_icon, build_path(icon), NULL);
465    evas_object_resize(mi->o_icon, 32, 32);
466    evas_object_image_fill_set(mi->o_icon, 0, 0, 32, 32);
467    mi->icon = strdup(icon);
468    mi->text = strdup(text);
469    mi->func = func;
470    menu = eina_list_append(menu, mi);
471    evas_object_raise(o_menu_icon_sel2);
472 }
473
474 static void
475 _ui_setup(void)
476 {
477    Evas_Object *o;
478    Evas_Coord x, y, w, h;
479    time_t t0, t;
480
481    o = evas_object_rectangle_add(evas);
482    evas_object_move(o, 0, 0);
483    evas_object_resize(o, win_w, win_h);
484    evas_object_color_set(o, 0, 0, 0, 0);
485    evas_object_layer_set(o, 1000);
486    evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _ui_key, NULL);
487    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _ui_mouse_down, NULL);
488    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _ui_mouse_up, NULL);
489    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _ui_mouse_move, NULL);
490    evas_object_focus_set(o, 1);
491    evas_object_show(o);
492    o_bg = o;
493
494    o = evas_object_rectangle_add(evas);
495    evas_object_move(o, 0, 0);
496    evas_object_resize(o, win_w, win_h);
497    evas_object_color_set(o, 255, 255, 255, 255);
498    evas_object_layer_set(o, -99);
499    evas_object_show(o);
500    o_wallpaper = o;
501
502    o = evas_object_text_add(evas);
503    evas_object_text_font_set(o, "Vera-Bold", 10);
504    evas_object_text_text_set(o, "EXPEDITE");
505    evas_object_layer_set(o, 100);
506    evas_object_color_set(o, 0, 0, 0, 100);
507    evas_object_pass_events_set(o, 1);
508    evas_object_geometry_get(o, NULL, NULL, &w, &h);
509    x = (win_w - w) / 2;
510    y = 0;
511    evas_object_move(o, x, y);
512    evas_object_show(o);
513    o_title = o;
514
515    o = evas_object_text_add(evas);
516    evas_object_text_font_set(o, "Vera", 9);
517    evas_object_text_text_set(o, "LEFT/RIGHT - select, ENTER - select, ESCAPE - exit.");
518    evas_object_layer_set(o, 100);
519    evas_object_color_set(o, 0, 0, 0, 60);
520    evas_object_pass_events_set(o, 1);
521    evas_object_geometry_get(o, NULL, NULL, &w, NULL);
522    x = (win_w - w) / 2;
523    y = h + 2;
524    evas_object_move(o, x, y);
525    evas_object_show(o);
526    o_byline = o;
527
528    o = evas_object_image_add(evas);
529    evas_object_move(o, (win_w - 120) / 2, ((win_h - 160) / 2));
530    evas_object_image_file_set(o, build_path("e-logo.png"), NULL);
531    evas_object_image_fill_set(o, 0, 0, 120, 160);
532    evas_object_resize(o, 120, 160);
533    evas_object_layer_set(o, -98);
534    evas_object_color_set(o, 255, 255, 255, 255);
535    evas_object_show(o);
536    o_menu_logo = o;
537
538    o = evas_object_image_add(evas);
539    evas_object_move(o, win_w - 128, - 128);
540    evas_object_image_fill_set(o, 0, 0, 256, 256);
541    evas_object_resize(o, 256, 256);
542    evas_object_show(o);
543    o_menu_icon = o;
544
545    o = evas_object_image_add(evas);
546    evas_object_move(o, 0, 0);
547    evas_object_image_file_set(o, build_path("icon_sel.png"), NULL);
548    evas_object_resize(o, 48, 48);
549    evas_object_image_fill_set(o, 0, 0, 48, 48);
550    o_menu_icon_sel = o;
551
552    o = evas_object_image_add(evas);
553    evas_object_move(o, 0, 0);
554    evas_object_image_file_set(o, build_path("text_sel.png"), NULL);
555    evas_object_resize(o, 96, 32);
556    evas_object_image_fill_set(o, 0, 0, 96, 32);
557    evas_object_image_border_set(o, 7, 7, 7, 7);
558    o_menu_text_sel = o;
559
560    o = evas_object_text_add(evas);
561    evas_object_text_font_set(o, "Vera", 10);
562    evas_object_text_text_set(o, "");
563    evas_object_color_set(o, 0, 0, 0, 100);
564    evas_object_pass_events_set(o, 1);
565    evas_object_geometry_get(o, NULL, NULL, &w, &h);
566    x = (win_w - w) / 2;
567    y = (win_h - h) / 2;
568    evas_object_move(o, x, y);
569    o_menu_title = o;
570
571    _ui_menu_item_add("e.png", "About", about_start);
572    _ui_menu_item_add("e.png", "All Tests", _ui_all);
573 #define UI
574 #include "tests.h"
575 #undef UI
576    _ui_menu_item_add("exit.png", "Exit", _ui_exit);
577
578 #ifndef _WIN32
579    /* make sure disk io isn't going to turn up unexpectedly */
580    sync();
581    sync();
582    sync();
583 #endif
584    /* warm up the cpu with some spinning */
585    t0 = time(NULL);
586    for (;;)
587      {
588         t = time(NULL);
589         if (t - t0 > 2) break;
590      }
591
592    if (run_all)
593      {
594         _ui_all();
595      }
596    else if (run_test > 0)
597      {
598         _ui_num(run_test);
599      }
600    else if (list_test > 0)
601      {
602         Eina_List *l;
603         int i;
604
605         for (l = menu, i = -1; l; l = l->next, i++)
606           {
607              Menu_Item *mi;
608
609              mi = l->data;
610              if (i > 0)
611                printf("%3i - %s (Weight %0.2lf)\n", i, mi->text, weights[i]);
612           }
613      }
614    else
615      {
616         menu_active = 1;
617      }
618
619    if (exit_after_test)
620     _ui_exit();
621
622 }
623
624 void
625 ui_args(int argc, char **argv)
626 {
627    int i;
628
629    for (i = 1; i < argc; i++)
630      {
631         if (!strcmp(argv[i], "-a"))
632           {
633              run_all = 1;
634              exit_after_test = 1;
635           }
636         else if ((!strcmp(argv[i], "-t")) && (i < (argc - 1)))
637           {
638              run_test = atoi(argv[i + 1]) + 1;
639              exit_after_test = 1;
640              if (run_test < 2) run_test = 2;
641           }
642         else if (!strcmp(argv[i], "-l"))
643           {
644              list_test = 1;
645           }
646      }
647    _ui_setup();
648    start = get_time();
649 }
650
651 void
652 ui_loop(void)
653 {
654    static int first = 1;
655    static double pt = 0.0;
656    double t, t2;
657
658    evas_object_resize(o_bg, win_w, win_h);
659    evas_object_resize(o_wallpaper, win_w, win_h);
660    if (loop_func)
661      {
662         t = get_time();
663         f_loop++;
664         f_start++;
665         if ((t - t_loop) >= 1.0)
666           {
667 //           ui_fps((double)f_loop / (t - t_loop));
668              t_loop = t;
669              f_loop = 0;
670           }
671         loop_func(t - t_start, f_start);
672         return;
673      }
674    t2 = get_time();
675    if (first)
676      {
677         t = 0.1;
678         pt = t2;
679      }
680    else
681      {
682         t = t2 - pt;
683         pt = t2;
684      }
685    first = 0;
686
687    /* menu layout */
688    if (menu_active)
689      {
690         Eina_List *l;
691         int i;
692         static double tr = 0.0;
693         double tt;
694
695         tt = t;
696         tt += tr;
697         while (tt > 0.001)
698           {
699              menu_anim = (menu_anim * 0.995) + (menu_anim_sel * 0.005);
700              tt -= 0.001;
701           }
702         tr = tt;
703         for (i = 0, l = menu; l; l = l->next, i++)
704           {
705              char buf[4096];
706              Menu_Item *mi;
707              Evas_Coord x, y, w, h, tw, th;
708              Evas_Coord len;
709              double a;
710              Evas_Object *o;
711
712              mi = l->data;
713              o = mi->o_icon;
714              evas_object_geometry_get(o_menu_logo, NULL, NULL, &w, &h);
715              len = ((w * 3) + 10) / 4;
716              evas_object_geometry_get(o, NULL, NULL, &w, &h);
717              x = (win_w / 2)
718                + (sin((menu_anim - (double)i) * 0.33) * len)
719                  - (w / 2);
720              y = (win_h / 2)
721                + (cos((menu_anim - (double)i) * 0.33) * len)
722                  - (h / 2);
723              evas_object_move(o, x, y);
724              a = menu_anim - (double)i;
725              if (a < 0) a = -a;
726              a = 255 - (30 * a);
727              evas_object_color_set(o, a, a, a, a);
728              evas_object_show(o);
729
730              if (i == menu_sel)
731                {
732                   a = menu_anim - (double)i;
733                   if (a < 0) a = -a;
734                   a = 255 - (255 * a);
735
736                   o = o_menu_icon_sel;
737                   evas_object_move(o, x - ((48 - w) / 2), y - ((48 - h) / 2));
738                   evas_object_color_set(o, a, a, a, a);
739
740                   o = o_menu_title;
741                   evas_object_color_set(o, a, a, a, a);
742                   evas_object_text_text_set(o, mi->text);
743                   evas_object_geometry_get(o, NULL, NULL, &tw, &th);
744                   x = (win_w - tw) / 2;
745                   y = (win_h / 2) + len + 48;
746                   evas_object_move(o, x, y);
747
748                                  
749                   o = o_menu_text_sel;
750                   w = tw + 24;
751                   h = 28;
752                   x = x - 12;
753                   y = y + ((th - h) / 2);
754                   evas_object_move(o, x, y);
755                   evas_object_resize(o, w, h);
756                   evas_object_image_fill_set(o, 0, 0, w, h);
757                   evas_object_color_set(o, a, a, a, a);
758
759                   o = o_menu_icon;
760                   snprintf(buf, 4096, "%s%s", data_dir, mi->icon);
761                   evas_object_image_file_set(o, buf, NULL);
762                   evas_object_color_set(o, a / 2, a / 2, a / 2, a / 2);
763                }
764           }
765         evas_object_move(o_menu_logo, (win_w - 120) / 2, ((win_h - 160) / 2));
766         evas_object_show(o_menu_logo);
767         evas_object_show(o_menu_title);
768         evas_object_show(o_menu_icon);
769         evas_object_show(o_menu_icon_sel);
770         evas_object_show(o_menu_icon_sel2);
771         evas_object_show(o_menu_text_sel);
772      }
773    else
774      {
775      }
776 }
777
778 void
779 ui_menu(void)
780 {
781    evas_object_show(o_title);
782    evas_object_show(o_byline);
783    evas_object_text_text_set
784      (o_byline, "LEFT/RIGHT - select, ENTER - select, ESCAPE - exit.");
785    menu_active = 1;
786    key_func = NULL;
787    loop_func = NULL;
788 }
789
790 void
791 ui_func_set(void (*kfunc) (char *key), void (*lfunc) (double t, int f))
792 {
793    key_func = kfunc;
794    loop_func = lfunc;
795    t_loop = t_start = get_time();
796    f_loop = f_start = 0;
797    ui_fps(0.0);
798 }
799
800
801 void
802 ui_fps(double fps)
803 {
804    /*
805    char buf[256];
806
807    snprintf(buf, sizeof(buf), "ESCAPE - exit, FPS: %4.3f", fps);
808    evas_object_text_text_set(o_byline, buf);
809     */
810    p_fps = fps;
811 }