From 18a02a137c0a9e192978aaa4f8f39141d00674e0 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Fri, 22 Sep 2000 01:12:52 +0000 Subject: [PATCH] new test program started work on (old test is evas_test_old) SVN revision: 3536 --- legacy/evas/src/evas_events.c | 55 +- legacy/evas/test/Makefile.am | 10 +- legacy/evas/test/evas_test.c | 667 ++++++++---------- legacy/evas/test/evas_test_old.c | 403 +++++++++++ legacy/evas/test/img/evas_test_control_bg.png | Bin 0 -> 144941 bytes legacy/evas/test/img/evas_test_view_bg.png | Bin 0 -> 87872 bytes legacy/evas/test/img/evas_test_view_logo.png | Bin 0 -> 33115 bytes .../test/img/evas_test_view_logo_shadow.png | Bin 0 -> 18012 bytes 8 files changed, 751 insertions(+), 384 deletions(-) create mode 100644 legacy/evas/test/evas_test_old.c create mode 100644 legacy/evas/test/img/evas_test_control_bg.png create mode 100644 legacy/evas/test/img/evas_test_view_bg.png create mode 100644 legacy/evas/test/img/evas_test_view_logo.png create mode 100644 legacy/evas/test/img/evas_test_view_logo_shadow.png diff --git a/legacy/evas/src/evas_events.c b/legacy/evas/src/evas_events.c index c1140633a8..b40c74dd87 100644 --- a/legacy/evas/src/evas_events.c +++ b/legacy/evas/src/evas_events.c @@ -100,7 +100,13 @@ evas_event_button_up(Evas e, int x, int y, int b) if (e->mouse.button_object) _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_UP, b, x, y); - if (!e->mouse.buttons) e->mouse.button_object = NULL; + if (!e->mouse.buttons) + { + if (e->mouse.object != e->mouse.button_object) + _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_OUT, + e->mouse.buttons, e->mouse.x, e->mouse.y); + e->mouse.button_object = NULL; + } } void @@ -108,41 +114,34 @@ evas_event_move(Evas e, int x, int y) { Evas_Object o; - if (!e->mouse.button_object) + o = _evas_highest_object_at_point(e, e->mouse.x, e->mouse.y); + if (o != e->mouse.object) { - o = _evas_highest_object_at_point(e, e->mouse.x, e->mouse.y); - if (o != e->mouse.object) + if (e->mouse.object) { - if (e->mouse.object) - { - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, - e->mouse.buttons, e->mouse.x, e->mouse.y); - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_OUT, - e->mouse.buttons, e->mouse.x, e->mouse.y); - } - e->mouse.x = x; - e->mouse.y = y; - e->mouse.object = o; - if (e->mouse.object) - { - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_IN, - e->mouse.buttons, e->mouse.x, e->mouse.y); - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, - e->mouse.buttons, e->mouse.x, e->mouse.y); - } - return; - } + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); + if (!e->mouse.button_object) + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_OUT, + e->mouse.buttons, e->mouse.x, e->mouse.y); + } e->mouse.x = x; e->mouse.y = y; + e->mouse.object = o; if (e->mouse.object) - _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, - e->mouse.buttons, e->mouse.x, e->mouse.y); + { + if (!e->mouse.button_object) + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_IN, + e->mouse.buttons, e->mouse.x, e->mouse.y); + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, + e->mouse.buttons, e->mouse.x, e->mouse.y); + } return; - } + } e->mouse.x = x; e->mouse.y = y; - if (e->mouse.button_object) - _evas_callback_call(e, e->mouse.button_object, CALLBACK_MOUSE_MOVE, + if (e->mouse.object) + _evas_callback_call(e, e->mouse.object, CALLBACK_MOUSE_MOVE, e->mouse.buttons, e->mouse.x, e->mouse.y); } diff --git a/legacy/evas/test/Makefile.am b/legacy/evas/test/Makefile.am index 6cc2439c63..40378992de 100644 --- a/legacy/evas/test/Makefile.am +++ b/legacy/evas/test/Makefile.am @@ -5,7 +5,7 @@ CFLGAS_ALL = $(CFLAGS_X) $(CFLAGS_EXTRA) INCLUDES = $(CFLGAS_ALL) -noinst_PROGRAMS = evas_test +noinst_PROGRAMS = evas_test evas_test_old evas_test_DEPENDENCIES = $(top_srcdir)/src/libevas.la @@ -14,3 +14,11 @@ evas_test_SOURCES = evas_test.c evas_test_LDFLAGS = -static evas_test_LDADD = $(top_builddir)/src/libevas.la + +evas_test_old_DEPENDENCIES = $(top_srcdir)/src/libevas.la + +evas_test_old_SOURCES = evas_test_old.c + +evas_test_old_LDFLAGS = -static + +evas_test_old_LDADD = $(top_builddir)/src/libevas.la diff --git a/legacy/evas/test/evas_test.c b/legacy/evas/test/evas_test.c index 8718a9c45f..d5c49243c7 100644 --- a/legacy/evas/test/evas_test.c +++ b/legacy/evas/test/evas_test.c @@ -5,8 +5,36 @@ #include #include -double get_time(void); +/* defines */ +#define IMGDIR "./img/" +#define FNTDIR "./fnt" +/* global variables */ +Display *display = NULL; +Window win_base = 0, win_control = 0, win_view = 0; +Visual *vis_control = NULL, *vis_view = NULL; +Colormap cmap_control = 0, cmap_view = 0; +Evas evas_control = NULL, evas_view = NULL; +int wait_for_events = 1; + +Evas_Object o_logo, o_logo_shadow, o_software, o_hardware, o_x11; +int mouse_x, mouse_y; + +/* prototypes */ +double get_time (void); +void setup (void); +void setup_controls (void); +void setup_view (Evas_Render_Method method); +void animate (double val); +void handle_events (void); + +void mouse_down (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); +void mouse_up (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); +void mouse_move (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); +void mouse_in (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); +void mouse_out (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); + +/* functions */ double get_time(void) { @@ -16,388 +44,317 @@ get_time(void) return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); } +void +setup(void) +{ + XSetWindowAttributes att; + + display = XOpenDisplay(NULL); + + evas_control = evas_new(); + evas_set_output_method(evas_control, RENDER_METHOD_ALPHA_SOFTWARE); + evas_set_output_colors(evas_control, 216); + vis_control = evas_get_optimal_visual(evas_control, display); + cmap_control = evas_get_optimal_colormap(evas_control, display); + + att.background_pixel = 0; + att.colormap = cmap_control; + att.border_pixel = 0; + att.event_mask = 0; + win_base = XCreateWindow(display, + RootWindow(display, DefaultScreen(display)), + 0, 0, 1024, 768, 0, + imlib_get_visual_depth(display, vis_control), + InputOutput, + vis_control, + CWColormap | CWBorderPixel | CWEventMask | CWBackPixel, + &att); + att.background_pixmap = None; + att.colormap = cmap_control; + att.border_pixel = 0; + att.event_mask = 0; + win_control = XCreateWindow(display, + win_base, + 0, 0, 128, 768, 0, + imlib_get_visual_depth(display, vis_control), + InputOutput, + vis_control, + CWColormap | CWBorderPixel | CWEventMask | CWBackPixmap, + &att); + XSelectInput(display, win_control, ButtonPressMask | + ButtonReleaseMask | PointerMotionMask | ExposureMask); + evas_font_add_path(evas_control, FNTDIR); + evas_set_output(evas_control, display, win_control, vis_control, cmap_control); + evas_set_output_size(evas_control, 128, 768); + evas_set_output_viewport(evas_control, 0, 0, 128, 768); + evas_set_font_cache(evas_control, 1 * 1024 * 1024); + evas_set_image_cache(evas_control, 8 * 1024 * 1024); -/* callbacks for logo object */ + XMapWindow(display, win_control); + XMapWindow(display, win_base); + + setup_controls(); + setup_view(RENDER_METHOD_ALPHA_SOFTWARE); +} +void +setup_controls(void) +{ + Evas_Object o; + Evas e; + double ascent, descent; + + e = evas_control; + o = evas_add_image_from_file(e, IMGDIR"evas_test_control_bg.png"); + evas_move(e, o, 0, 0); + evas_resize(e, o, 128, 768); + evas_set_image_fill(e, o, 0, 0, 128, 768); + evas_set_layer(e, o, -999); + evas_show(e, o); + + o = evas_add_text(e, "notepad", 16, "Software"); + evas_set_color(e, o, 255, 255, 255, 160); + evas_move(e, o, 4, 4); + evas_show(e, o); + evas_text_get_max_ascent_descent(e, o, &ascent, &descent); + evas_callback_add(e, o, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_OUT, mouse_out, NULL); + o_software = o; + + o = evas_add_text(e, "notepad", 16, "Hardware"); + evas_set_color(e, o, 255, 255, 255, 160); + evas_move(e, o, 4, 4 + (ascent - descent)); + evas_show(e, o); + evas_text_get_max_ascent_descent(e, o, &ascent, &descent); + evas_callback_add(e, o, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_OUT, mouse_out, NULL); + o_hardware = o; + + o = evas_add_text(e, "notepad", 16, "Basic X11"); + evas_set_color(e, o, 255, 255, 255, 160); + evas_move(e, o, 4, 4 + ((ascent - descent) * 2)); + evas_show(e, o); + evas_text_get_max_ascent_descent(e, o, &ascent, &descent); + evas_callback_add(e, o, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o, CALLBACK_MOUSE_OUT, mouse_out, NULL); + o_x11 = o; + +} + +void +setup_view(Evas_Render_Method method) +{ + XSetWindowAttributes att; + Evas_Object o; + Evas e; + int w, h; + double x, y; + + if (win_view) XDestroyWindow(display, win_view); + evas_view = evas_new(); + evas_set_output_method(evas_view, method); + if (method == RENDER_METHOD_BASIC_HARDWARE) + evas_set_scale_smoothness(evas_view, 0); + evas_set_output_colors(evas_view, 216); + vis_view = evas_get_optimal_visual(evas_view, display); + cmap_view = evas_get_optimal_colormap(evas_view, display); + + att.background_pixmap = None; + att.colormap = cmap_view; + att.border_pixel = 0; + att.event_mask = 0; + win_view = XCreateWindow(display, + win_base, + 128, 0, 1024 - 128, 768, 0, + imlib_get_visual_depth(display, vis_view), + InputOutput, + vis_view, + CWColormap | CWBorderPixel | CWEventMask | CWBackPixmap, + &att); + XMapWindow(display, win_view); + + XSelectInput(display, win_view, ButtonPressMask | + ButtonReleaseMask | PointerMotionMask | ExposureMask); + + evas_font_add_path(evas_view, FNTDIR); + evas_set_output(evas_view, display, win_view, vis_view, cmap_view); + evas_set_output_size(evas_view, 1024 - 128, 768); + evas_set_output_viewport(evas_view, 0, 0, 1024 - 128, 768); + evas_set_font_cache(evas_view, 1 * 1024 * 1024); + evas_set_image_cache(evas_view, 8 * 1024 * 1024); + + e = evas_view; + o = evas_add_image_from_file(e, IMGDIR"evas_test_view_bg.png"); + evas_move(e, o, 0, 0); + evas_resize(e, o, 1024 - 128, 768); + evas_set_layer(e, o, -999); + evas_show(e, o); + + o = evas_add_image_from_file(e, IMGDIR"evas_test_view_logo.png"); + evas_get_image_size(e, o, &w, &h); + x = (1024 - 128 - w) / 2; y = (768 - h) / 2; + evas_move(e, o, x, y); + evas_set_layer(e, o, 101); + evas_show(e, o); + o_logo = o; + + o = evas_add_image_from_file(e, IMGDIR"evas_test_view_logo_shadow.png"); + evas_get_image_size(e, o, &w, &h); + x += 10; y += 10; + evas_move(e, o, x, y); + evas_set_layer(e, o, 100); + evas_show(e, o); + o_logo_shadow = o; +} + +void +animate(double val) +{ + double x, y; + int w, h; + + evas_get_image_size(evas_view, o_logo, &w, &h); + x = ((1024 - 128) / 2) + (256 * cos((val * 3.141592654 * 2 / 100) * 27)); + y = (768 / 2) + (256 * sin((val * 3.141592654 * 2 / 100) * 16)); + evas_move(evas_view, o_logo, x - (w / 2), y - (h / 2)); + evas_move(evas_view, o_logo_shadow, + x - (w / 2) - ((mouse_x - x) / 16), + y - (h / 2) - ((mouse_y - y) / 16)); +} + +void +handle_events(void) +{ + double val, t1, t2; + + val = 0.0; + t1 = get_time(); + wait_for_events = 0; + for (;;) + { + XEvent ev; + Evas e = NULL; + + /* input events */ + do + { + int event_ok; + + event_ok = 0; + if (wait_for_events) + { + XNextEvent(display, &ev); + event_ok = 1; + } + else + { + if (XPending(display)) + { + XNextEvent(display, &ev); + event_ok = 1; + } + } + if (event_ok) + { + if (ev.xany.window == win_control) e = evas_control; + else if (ev.xany.window == win_view) e = evas_view; + if (e) + { + switch(ev.type) + { + case ButtonPress: + evas_event_button_down(e, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button); + break; + case ButtonRelease: + evas_event_button_up(e, ev.xbutton.x, ev.xbutton.y, ev.xbutton.button); + break; + case MotionNotify: + if (e == evas_view) + { + mouse_x = ev.xmotion.x; + mouse_y = ev.xmotion.y; + } + evas_event_move(e, ev.xmotion.x, ev.xmotion.y); + break; + case Expose: + evas_update_rect(e, ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height); + break; + default: + break; + } + } + } + } + while (XPending(display)); + /* stuff to do outside events */ + animate(val); + /* display any changes */ + evas_render(evas_control); + evas_render(evas_view); + /* caluclate time taken since the last render */ + t2 = get_time(); + val += t2 - t1; + t1 = t2; + if (val >= 100.0) val -= 100.0; + } +} + +/* callbacks */ void mouse_down (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { - evas_put_data(_e, _o, "clicked", (void *)1); - evas_put_data(_e, _o, "x", (void *)_x); - evas_put_data(_e, _o, "y", (void *)_y); - evas_set_layer(_e, _o, 200); + if ((_e == evas_control) && + ((_o == o_software) || (_o == o_hardware) || (_o == o_x11))) + evas_set_color(_e, _o, 255, 255, 0, 255); } void mouse_up (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { - evas_remove_data(_e, _o, "clicked"); - evas_set_layer(_e, _o, 50); + if ((_e == evas_control) && + ((_o == o_software) || (_o == o_hardware) || (_o == o_x11))) + { + evas_set_color(_e, _o, 255, 255, 255, 255); + if (_o == o_software) + setup_view(RENDER_METHOD_ALPHA_SOFTWARE); + else if (_o == o_hardware) + setup_view(RENDER_METHOD_3D_HARDWARE); + else if (_o == o_x11) + setup_view(RENDER_METHOD_BASIC_HARDWARE); + } } void mouse_move (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { - if (evas_get_data(_e, _o, "clicked")) - { - double ox, oy; - int x, y; - - evas_get_geometry(_e, _o, &ox, &oy, NULL, NULL); - x = evas_get_data(_e, _o, "x"); - y = evas_get_data(_e, _o, "y"); - evas_put_data(_e, _o, "x", (void *)_x); - evas_put_data(_e, _o, "y", (void *)_y); - evas_move(_e, _o, ox + _x - x, oy + _y - y); - } } void mouse_in (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { + if ((_e == evas_control) && + ((_o == o_software) || (_o == o_hardware) || (_o == o_x11))) + evas_set_color(_e, _o, 255, 255, 255, 255); } void mouse_out (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { + if ((_e == evas_control) && + ((_o == o_software) || (_o == o_hardware) || (_o == o_x11))) + evas_set_color(_e, _o, 255, 255, 255, 160); } -/* done with callbacks */ - - +/* Mr. main */ int main(int argc, char **argv) { - Imlib_Image buffer = NULL; - Display *d; - Visual *vis; - Colormap cmap; - Window win; - int win_w, win_h; - int i, a, w, h, m; - Evas e; - Evas_Object o[128], o_rect, o_line, o_grad, o_fps, o_text; - Evas_Gradient grad; - int down; - double t1, t2; - char *imgs[8] = - { - "img/mush.png", - "img/book.png", - "img/bulb.png", - "img/term.png", - "img/calc.png", - "img/worlds.png", - "img/spider.png", - "img/mouse.png" - }; - - win_w = 640; win_h = 480; - e = evas_new(); - for (i = 1; i < argc; i++) - { - if ((!strcmp(argv[i], "-x")) && (i < (argc - 1))) - { - i++; - win_w = atoi(argv[i]); - } - else if ((!strcmp(argv[i], "-y")) && (i < (argc - 1))) - { - i++; - win_h = atoi(argv[i]); - } - else if ((!strcmp(argv[i], "-m")) && (i < (argc - 1))) - { - i++; - if (!strcmp(argv[i], "x11")) - evas_set_output_method(e, RENDER_METHOD_BASIC_HARDWARE); - else if (!strcmp(argv[i], "soft")) - evas_set_output_method(e, RENDER_METHOD_ALPHA_SOFTWARE); - else if (!strcmp(argv[i], "hard")) - evas_set_output_method(e, RENDER_METHOD_3D_HARDWARE); - else if (!strcmp(argv[i], "buf")) - { - DATA32 *data; - - buffer = imlib_create_image(win_w, win_h); - imlib_context_set_image(buffer); - evas_set_output_method(e, RENDER_METHOD_IMAGE); - evas_set_output_image(e, buffer); - } - } - else if ((!strcmp(argv[i], "-c")) && (i < (argc - 1))) - { - i++; - evas_set_output_colors(e, atoi(argv[i])); - } - else if ((!strcmp(argv[i], "-s")) && (i < (argc - 1))) - { - i++; - evas_set_scale_smoothness(e, atoi(argv[i])); - } - else - { - printf("Usage:\n"); - printf(" %s [options]\n", argv[0]); - printf("Where options is one or more of:\n"); - printf(" -x width - width of window in pixels\n"); - printf(" -y height - height of window in pixels\n"); - printf(" -m [x11 | soft | hard | buf] - rendering mode\n"); - printf(" -c colors - maximum colors allocated\n"); - printf(" -s [1 | 0] - smooth scaling / rendering\n"); - printf("\n"); - printf("Examples:\n"); - printf(" %s -x 640 -y 480 -m soft - run test in 640x480 in software mode\n", argv[0]); - printf(" %s -x 800 -y 600 -m x11 - run test in 800x600 in X11 mode\n", argv[0]); - printf(" %s -x 1024 -y 768 -m hard - run test in 1024x768 in OpenGL mode\n", argv[0]); - printf(" %s -x 640 -y 480 -m soft -s 0 - run test in 640x480 in software mode, no smooth scaling\n", argv[0]); - exit(0); - } - } - - d = XOpenDisplay(NULL); - vis = evas_get_optimal_visual(e, d); - cmap = evas_get_optimal_colormap(e, d); - - { - XSetWindowAttributes att; - - att.colormap = cmap; - att.border_pixel = 0; - att.event_mask = 0; - - win = XCreateWindow(d, - RootWindow(d, DefaultScreen(d)), - 0, 0, win_w, win_h, 0, - imlib_get_visual_depth(d, vis), - InputOutput, - vis, - CWColormap | CWBorderPixel | CWEventMask, - &att); - XSelectInput(d, win, ButtonPressMask | ButtonReleaseMask | - PointerMotionMask | ExposureMask); - XMapWindow(d, win); - XSync(d, False); - } - evas_font_add_path(e, "./fnt"); - evas_set_output(e, d, win, vis, cmap); - evas_set_output_size(e, win_w, win_h); - evas_set_output_viewport(e, 0, 0, win_w, win_h); - - evas_set_font_cache(e, 1 * 1024 * 1024); - evas_set_image_cache(e, 8 * 1024 * 1024); - - o[0] = evas_add_image_from_file(e, "img/sky001.png"); - evas_show(e, o[0]); - o[1] = evas_add_image_from_file(e, "img/logo001.png"); - evas_get_image_size(e, o[1], &w, &h); - evas_callback_add(e, o[1], CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o[1], CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o[1], CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o[1], CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o[1], CALLBACK_MOUSE_OUT, mouse_out, NULL); - w /= 2; - h /= 2; - evas_show(e, o[1]); - - for (i = 2 ; i < 120; i++) - { - o[i] = evas_add_image_from_file(e, "img/mush.png"); - evas_show(e, o[i]); - evas_set_layer(e, o[i], 100); - evas_callback_add(e, o[i], CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); - } - for (i = 120; i < 128; i++) - { - o[i] = evas_add_text(e, "notepad", 16, imgs[i & 0x7]); - evas_set_color(e, o[i], rand()&0xff, rand()&0xff, rand()&0xff, 255); - evas_show(e, o[i]); - evas_set_layer(e, o[i], 100); - evas_callback_add(e, o[i], CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); - } - o_rect = evas_add_rectangle(e); - evas_show(e, o_rect); - evas_move(e, o_rect, 100, 100); - evas_resize(e, o_rect, 200, 100); - evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120); - evas_set_layer(e, o_rect, 150); - evas_callback_add(e, o_rect, CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o_rect, CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o_rect, CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o_rect, CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o_rect, CALLBACK_MOUSE_OUT, mouse_out, NULL); - - o_line = evas_add_line(e); - evas_show(e, o_line); - evas_set_line_xy(e, o_line, 10, 20, 100, 50); - evas_set_color(e, o_line, rand()&0xff, rand()&0xff, rand()&0xff, 120); - evas_set_layer(e, o_rect, 150); - evas_callback_add(e, o_line, CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o_line, CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o_line, CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o_line, CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o_line, CALLBACK_MOUSE_OUT, mouse_out, NULL); - - o_grad = evas_add_gradient_box(e); - evas_show(e, o_grad); - evas_move(e, o_grad, 300, 50); - evas_resize(e, o_grad, 200, 200); - evas_set_layer(e, o_grad, 150); - grad = evas_gradient_new(); - evas_gradient_add_color(grad, 255, 255, 255, 255, 8); - evas_gradient_add_color(grad, 255, 255, 0, 200, 8); - evas_gradient_add_color(grad, 255, 0 , 0, 150, 8); - evas_gradient_add_color(grad, 0 , 0 , 0, 0, 8); - evas_set_gradient(e, o_grad, grad); - evas_callback_add(e, o_grad, CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o_grad, CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o_grad, CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o_grad, CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o_grad, CALLBACK_MOUSE_OUT, mouse_out, NULL); - - o_text = evas_add_text(e, "grunge", 14, "Click and Drag Objects..."); - evas_set_color(e, o_text, 0, 0, 0, 160); - evas_move(e, o_text, 30, 60); - evas_show(e, o_text); - evas_set_layer(e, o_text, 200); - evas_callback_add(e, o_text, CALLBACK_MOUSE_DOWN, mouse_down, NULL); - evas_callback_add(e, o_text, CALLBACK_MOUSE_UP, mouse_up, NULL); - evas_callback_add(e, o_text, CALLBACK_MOUSE_MOVE, mouse_move, NULL); - evas_callback_add(e, o_text, CALLBACK_MOUSE_IN, mouse_in, NULL); - evas_callback_add(e, o_text, CALLBACK_MOUSE_OUT, mouse_out, NULL); - - o_fps = evas_add_text(e, "morpheus", 16, "FPS..."); - evas_set_color(e, o_fps, 255, 255, 255, 120); - evas_move(e, o_fps, win_w, win_h); - evas_show(e, o_fps); - evas_set_layer(e, o_fps, 500); - - evas_raise(e, o[1]); - evas_move(e, o[0], 0, 0); - evas_resize(e, o[0], win_w, win_h); - evas_set_image_fill(e, o[0], 0, 0, win_w, win_h); - a = 0; - down = 0; - t1 = get_time(); - m = 0; - for (;;) - { - double x, y; - XEvent ev; - - while (XPending(d)) -/* do*/ - { - XNextEvent(d, &ev); - switch(ev.type) - { - case ButtonPress: - { - int button, mouse_x, mouse_y; - - down = 1; - button = ev.xbutton.button; - mouse_x = ev.xbutton.x; - mouse_y = ev.xbutton.y; - evas_event_button_down(e, mouse_x, mouse_y, button); - } - break; - case ButtonRelease: - { - int button, mouse_x, mouse_y; - - down = 0; - button = ev.xbutton.button; - if (button == 3) - { - evas_free(e); - exit(0); - } - mouse_x = ev.xbutton.x; - mouse_y = ev.xbutton.y; - evas_event_button_up(e, mouse_x, mouse_y, button); - } - break; - case MotionNotify: - { - int mouse_x, mouse_y; - - mouse_x = ev.xmotion.x; - mouse_y = ev.xmotion.y; - evas_event_move(e, mouse_x, mouse_y); - } - break; - case Expose: - { - evas_update_rect(e, ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height); - } - break; - default: - break; - } - } -/* while (XPending(d));*/ - for (i = 2; i < 128; i++) - { - int j, k; - double ww, hh; - - if (!evas_get_data(e, o[i], "clicked")) - { - j = (i * 50) + i; - k = (i * -60) - (i * 2); - x = (win_w + (cos((double)(a + j) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; - y = (win_h + (sin((double)(a + k) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; - if (i < 100) - evas_set_image_file(e, o[i], imgs[(i) & 0x7]); - evas_move(e, o[i], x, y); - ww = ((1.2 + cos((double)(a + j + m) * 2 * 3.141592654 / 1000)) * 48); - hh = ww; - evas_resize(e, o[i], ww, hh); - evas_set_image_fill(e, o[i], 0, 0, ww, hh); -/* - evas_set_color(e, o[i], 255, 255, 255, - (((1.0 + cos((double)(a + j) * 2 * 3 * 3.141592654 / 1000)) / 2) * 255)); - */ - } - } - evas_set_angle(e, o_grad, (double)a * 360 / 1000); - evas_render(e); - if ((argc == 5) && (!strcmp(argv[4], "save")) && (buffer)) - { - imlib_context_set_image(buffer); - imlib_image_set_format("png"); - imlib_save_image("output.png"); - printf("save done\n"); - sleep(1); - printf("run\n"); - } - a++; - m++; - if ((a % 25) == 0) - { - char buf[64]; - double gw, gh; - - t2 = get_time() - t1; - t1 = get_time(); - sprintf(buf, "FPS: %3.1f", 25 / t2); - printf("%s\n", buf); - evas_set_text(e, o_fps, buf); - evas_get_geometry(e, o_fps, NULL, NULL, &gw, &gh); - evas_move(e, o_fps, win_w - gw, win_h - gh); - } - if (a >= 1000) - { - a = 0; - } - } + setup(); + handle_events(); } diff --git a/legacy/evas/test/evas_test_old.c b/legacy/evas/test/evas_test_old.c new file mode 100644 index 0000000000..8718a9c45f --- /dev/null +++ b/legacy/evas/test/evas_test_old.c @@ -0,0 +1,403 @@ +#include "../src/Evas.h" +#include +#include +#include +#include +#include + +double get_time(void); + +double +get_time(void) +{ + struct timeval timev; + + gettimeofday(&timev, NULL); + return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000); +} + + +/* callbacks for logo object */ + +void +mouse_down (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + evas_put_data(_e, _o, "clicked", (void *)1); + evas_put_data(_e, _o, "x", (void *)_x); + evas_put_data(_e, _o, "y", (void *)_y); + evas_set_layer(_e, _o, 200); +} + +void +mouse_up (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + evas_remove_data(_e, _o, "clicked"); + evas_set_layer(_e, _o, 50); +} + +void +mouse_move (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + if (evas_get_data(_e, _o, "clicked")) + { + double ox, oy; + int x, y; + + evas_get_geometry(_e, _o, &ox, &oy, NULL, NULL); + x = evas_get_data(_e, _o, "x"); + y = evas_get_data(_e, _o, "y"); + evas_put_data(_e, _o, "x", (void *)_x); + evas_put_data(_e, _o, "y", (void *)_y); + evas_move(_e, _o, ox + _x - x, oy + _y - y); + } +} + +void +mouse_in (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ +} + +void +mouse_out (void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ +} + +/* done with callbacks */ + + +int +main(int argc, char **argv) +{ + Imlib_Image buffer = NULL; + Display *d; + Visual *vis; + Colormap cmap; + Window win; + int win_w, win_h; + int i, a, w, h, m; + Evas e; + Evas_Object o[128], o_rect, o_line, o_grad, o_fps, o_text; + Evas_Gradient grad; + int down; + double t1, t2; + char *imgs[8] = + { + "img/mush.png", + "img/book.png", + "img/bulb.png", + "img/term.png", + "img/calc.png", + "img/worlds.png", + "img/spider.png", + "img/mouse.png" + }; + + win_w = 640; win_h = 480; + e = evas_new(); + for (i = 1; i < argc; i++) + { + if ((!strcmp(argv[i], "-x")) && (i < (argc - 1))) + { + i++; + win_w = atoi(argv[i]); + } + else if ((!strcmp(argv[i], "-y")) && (i < (argc - 1))) + { + i++; + win_h = atoi(argv[i]); + } + else if ((!strcmp(argv[i], "-m")) && (i < (argc - 1))) + { + i++; + if (!strcmp(argv[i], "x11")) + evas_set_output_method(e, RENDER_METHOD_BASIC_HARDWARE); + else if (!strcmp(argv[i], "soft")) + evas_set_output_method(e, RENDER_METHOD_ALPHA_SOFTWARE); + else if (!strcmp(argv[i], "hard")) + evas_set_output_method(e, RENDER_METHOD_3D_HARDWARE); + else if (!strcmp(argv[i], "buf")) + { + DATA32 *data; + + buffer = imlib_create_image(win_w, win_h); + imlib_context_set_image(buffer); + evas_set_output_method(e, RENDER_METHOD_IMAGE); + evas_set_output_image(e, buffer); + } + } + else if ((!strcmp(argv[i], "-c")) && (i < (argc - 1))) + { + i++; + evas_set_output_colors(e, atoi(argv[i])); + } + else if ((!strcmp(argv[i], "-s")) && (i < (argc - 1))) + { + i++; + evas_set_scale_smoothness(e, atoi(argv[i])); + } + else + { + printf("Usage:\n"); + printf(" %s [options]\n", argv[0]); + printf("Where options is one or more of:\n"); + printf(" -x width - width of window in pixels\n"); + printf(" -y height - height of window in pixels\n"); + printf(" -m [x11 | soft | hard | buf] - rendering mode\n"); + printf(" -c colors - maximum colors allocated\n"); + printf(" -s [1 | 0] - smooth scaling / rendering\n"); + printf("\n"); + printf("Examples:\n"); + printf(" %s -x 640 -y 480 -m soft - run test in 640x480 in software mode\n", argv[0]); + printf(" %s -x 800 -y 600 -m x11 - run test in 800x600 in X11 mode\n", argv[0]); + printf(" %s -x 1024 -y 768 -m hard - run test in 1024x768 in OpenGL mode\n", argv[0]); + printf(" %s -x 640 -y 480 -m soft -s 0 - run test in 640x480 in software mode, no smooth scaling\n", argv[0]); + exit(0); + } + } + + d = XOpenDisplay(NULL); + vis = evas_get_optimal_visual(e, d); + cmap = evas_get_optimal_colormap(e, d); + + { + XSetWindowAttributes att; + + att.colormap = cmap; + att.border_pixel = 0; + att.event_mask = 0; + + win = XCreateWindow(d, + RootWindow(d, DefaultScreen(d)), + 0, 0, win_w, win_h, 0, + imlib_get_visual_depth(d, vis), + InputOutput, + vis, + CWColormap | CWBorderPixel | CWEventMask, + &att); + XSelectInput(d, win, ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | ExposureMask); + XMapWindow(d, win); + XSync(d, False); + } + evas_font_add_path(e, "./fnt"); + evas_set_output(e, d, win, vis, cmap); + evas_set_output_size(e, win_w, win_h); + evas_set_output_viewport(e, 0, 0, win_w, win_h); + + evas_set_font_cache(e, 1 * 1024 * 1024); + evas_set_image_cache(e, 8 * 1024 * 1024); + + o[0] = evas_add_image_from_file(e, "img/sky001.png"); + evas_show(e, o[0]); + o[1] = evas_add_image_from_file(e, "img/logo001.png"); + evas_get_image_size(e, o[1], &w, &h); + evas_callback_add(e, o[1], CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o[1], CALLBACK_MOUSE_OUT, mouse_out, NULL); + w /= 2; + h /= 2; + evas_show(e, o[1]); + + for (i = 2 ; i < 120; i++) + { + o[i] = evas_add_image_from_file(e, "img/mush.png"); + evas_show(e, o[i]); + evas_set_layer(e, o[i], 100); + evas_callback_add(e, o[i], CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); + } + for (i = 120; i < 128; i++) + { + o[i] = evas_add_text(e, "notepad", 16, imgs[i & 0x7]); + evas_set_color(e, o[i], rand()&0xff, rand()&0xff, rand()&0xff, 255); + evas_show(e, o[i]); + evas_set_layer(e, o[i], 100); + evas_callback_add(e, o[i], CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); + } + o_rect = evas_add_rectangle(e); + evas_show(e, o_rect); + evas_move(e, o_rect, 100, 100); + evas_resize(e, o_rect, 200, 100); + evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120); + evas_set_layer(e, o_rect, 150); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_rect, CALLBACK_MOUSE_OUT, mouse_out, NULL); + + o_line = evas_add_line(e); + evas_show(e, o_line); + evas_set_line_xy(e, o_line, 10, 20, 100, 50); + evas_set_color(e, o_line, rand()&0xff, rand()&0xff, rand()&0xff, 120); + evas_set_layer(e, o_rect, 150); + evas_callback_add(e, o_line, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_line, CALLBACK_MOUSE_OUT, mouse_out, NULL); + + o_grad = evas_add_gradient_box(e); + evas_show(e, o_grad); + evas_move(e, o_grad, 300, 50); + evas_resize(e, o_grad, 200, 200); + evas_set_layer(e, o_grad, 150); + grad = evas_gradient_new(); + evas_gradient_add_color(grad, 255, 255, 255, 255, 8); + evas_gradient_add_color(grad, 255, 255, 0, 200, 8); + evas_gradient_add_color(grad, 255, 0 , 0, 150, 8); + evas_gradient_add_color(grad, 0 , 0 , 0, 0, 8); + evas_set_gradient(e, o_grad, grad); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_grad, CALLBACK_MOUSE_OUT, mouse_out, NULL); + + o_text = evas_add_text(e, "grunge", 14, "Click and Drag Objects..."); + evas_set_color(e, o_text, 0, 0, 0, 160); + evas_move(e, o_text, 30, 60); + evas_show(e, o_text); + evas_set_layer(e, o_text, 200); + evas_callback_add(e, o_text, CALLBACK_MOUSE_DOWN, mouse_down, NULL); + evas_callback_add(e, o_text, CALLBACK_MOUSE_UP, mouse_up, NULL); + evas_callback_add(e, o_text, CALLBACK_MOUSE_MOVE, mouse_move, NULL); + evas_callback_add(e, o_text, CALLBACK_MOUSE_IN, mouse_in, NULL); + evas_callback_add(e, o_text, CALLBACK_MOUSE_OUT, mouse_out, NULL); + + o_fps = evas_add_text(e, "morpheus", 16, "FPS..."); + evas_set_color(e, o_fps, 255, 255, 255, 120); + evas_move(e, o_fps, win_w, win_h); + evas_show(e, o_fps); + evas_set_layer(e, o_fps, 500); + + evas_raise(e, o[1]); + evas_move(e, o[0], 0, 0); + evas_resize(e, o[0], win_w, win_h); + evas_set_image_fill(e, o[0], 0, 0, win_w, win_h); + a = 0; + down = 0; + t1 = get_time(); + m = 0; + for (;;) + { + double x, y; + XEvent ev; + + while (XPending(d)) +/* do*/ + { + XNextEvent(d, &ev); + switch(ev.type) + { + case ButtonPress: + { + int button, mouse_x, mouse_y; + + down = 1; + button = ev.xbutton.button; + mouse_x = ev.xbutton.x; + mouse_y = ev.xbutton.y; + evas_event_button_down(e, mouse_x, mouse_y, button); + } + break; + case ButtonRelease: + { + int button, mouse_x, mouse_y; + + down = 0; + button = ev.xbutton.button; + if (button == 3) + { + evas_free(e); + exit(0); + } + mouse_x = ev.xbutton.x; + mouse_y = ev.xbutton.y; + evas_event_button_up(e, mouse_x, mouse_y, button); + } + break; + case MotionNotify: + { + int mouse_x, mouse_y; + + mouse_x = ev.xmotion.x; + mouse_y = ev.xmotion.y; + evas_event_move(e, mouse_x, mouse_y); + } + break; + case Expose: + { + evas_update_rect(e, ev.xexpose.x, ev.xexpose.y, ev.xexpose.width, ev.xexpose.height); + } + break; + default: + break; + } + } +/* while (XPending(d));*/ + for (i = 2; i < 128; i++) + { + int j, k; + double ww, hh; + + if (!evas_get_data(e, o[i], "clicked")) + { + j = (i * 50) + i; + k = (i * -60) - (i * 2); + x = (win_w + (cos((double)(a + j) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; + y = (win_h + (sin((double)(a + k) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; + if (i < 100) + evas_set_image_file(e, o[i], imgs[(i) & 0x7]); + evas_move(e, o[i], x, y); + ww = ((1.2 + cos((double)(a + j + m) * 2 * 3.141592654 / 1000)) * 48); + hh = ww; + evas_resize(e, o[i], ww, hh); + evas_set_image_fill(e, o[i], 0, 0, ww, hh); +/* + evas_set_color(e, o[i], 255, 255, 255, + (((1.0 + cos((double)(a + j) * 2 * 3 * 3.141592654 / 1000)) / 2) * 255)); + */ + } + } + evas_set_angle(e, o_grad, (double)a * 360 / 1000); + evas_render(e); + if ((argc == 5) && (!strcmp(argv[4], "save")) && (buffer)) + { + imlib_context_set_image(buffer); + imlib_image_set_format("png"); + imlib_save_image("output.png"); + printf("save done\n"); + sleep(1); + printf("run\n"); + } + a++; + m++; + if ((a % 25) == 0) + { + char buf[64]; + double gw, gh; + + t2 = get_time() - t1; + t1 = get_time(); + sprintf(buf, "FPS: %3.1f", 25 / t2); + printf("%s\n", buf); + evas_set_text(e, o_fps, buf); + evas_get_geometry(e, o_fps, NULL, NULL, &gw, &gh); + evas_move(e, o_fps, win_w - gw, win_h - gh); + } + if (a >= 1000) + { + a = 0; + } + } +} diff --git a/legacy/evas/test/img/evas_test_control_bg.png b/legacy/evas/test/img/evas_test_control_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..01e47a0e443c8fc30e6316c50f2cadc23e4154ca GIT binary patch literal 144941 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