From 8766e6c15d64c8863571d320e3803c7002ddda3e Mon Sep 17 00:00:00 2001 From: Michal Maciola Date: Mon, 24 Aug 2020 11:30:52 +0200 Subject: [PATCH] Created gradient manipulation example Change-Id: I2f58fba0f6260cf57dbcc58aa59ba26a80eb24ce --- src/examples/evas/evas-vg-gradient-manipulation.c | 240 ++++++++++++++++++++++ src/examples/evas/meson.build | 3 +- 2 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 src/examples/evas/evas-vg-gradient-manipulation.c diff --git a/src/examples/evas/evas-vg-gradient-manipulation.c b/src/examples/evas/evas-vg-gradient-manipulation.c new file mode 100644 index 0000000..fd67bbb --- /dev/null +++ b/src/examples/evas/evas-vg-gradient-manipulation.c @@ -0,0 +1,240 @@ +/** + * gcc evas-vg-gradient-manipulation.c -o evas-vg-gradient-manipulation `pkg-config --libs --cflags ecore ecore-evas` + */ + +#include +#include + +#define WIDTH 640 +#define HEIGHT 480 + +struct content +{ + Ecore_Evas *ee; + Evas *ev; + Evas_Object *bg; + Evas_Object *vg; + Efl_VG *container; + Efl_VG *shape; + Efl_VG *gradient; +}; +static struct content cnt; + +static void +_on_delete(Ecore_Evas *ee EINA_UNUSED) +{ + ecore_main_loop_quit(); +} + +static void +_canvas_resize_cb(Ecore_Evas *ee) +{ + int w, h; + + ecore_evas_geometry_get(ee, NULL, NULL, &w, &h); + evas_object_resize(cnt.bg, w, h); + evas_object_resize(cnt.vg, w, h); +} + +static void +_on_keydown(void *data EINA_UNUSED, + Evas *evas EINA_UNUSED, + Evas_Object *o, + void *einfo) +{ + Evas_Event_Key_Down *ei = einfo; + if (!strcmp(ei->key, "q")) + { + _on_delete(cnt.ee); + } + else if (!strcmp(ei->key, "a")) + { + double x, y; + evas_vg_node_origin_get(cnt.shape, &x, &y); + y -= 10; + evas_vg_node_origin_set(cnt.shape, x, y); + printf("Shape origin moved up\n"); + } + else if (!strcmp(ei->key, "z")) + { + double x, y; + evas_vg_node_origin_get(cnt.shape, &x, &y); + y += 10; + evas_vg_node_origin_set(cnt.shape, x, y); + printf("Shape origin moved down\n"); + } + else if (!strcmp(ei->key, "w")) + { + int x = rand() % 540; + int y = rand() % 380; + evas_vg_gradient_radial_center_set(cnt.gradient, x, y); + printf("Gradient center set to random x: %d y: %d\n", x, y); + } + else if (!strcmp(ei->key, "s")) + { + double x, y; + evas_vg_gradient_radial_center_get(cnt.gradient, &x, &y); + y -= 10; + evas_vg_gradient_radial_center_set(cnt.gradient, x, y); + printf("Gradient center moved up\n"); + } + else if (!strcmp(ei->key, "x")) + { + double x, y; + evas_vg_gradient_radial_center_get(cnt.gradient, &x, &y); + y += 10; + evas_vg_gradient_radial_center_set(cnt.gradient, x, y); + printf("Gradient center moved down\n"); + } + else if (!strcmp(ei->key, "e")) + { + int r, g, b, a; + unsigned int i; + unsigned int length; + Evas_Vg_Gradient_Stop * stops; + evas_vg_gradient_stop_get(cnt.gradient, (const Evas_Vg_Gradient_Stop **)&stops, &length); + if (length != 2) + { + printf("Some critical problem, two color stops was set, received %d.\n", length); + } + for (i = 0; i < length; i++) + { + r = stops[i].r; + g = stops[i].g; + b = stops[i].b; + a = stops[i].a; + evas_color_argb_unpremul(a, &r, &g, &b); + a = 128; + evas_color_argb_premul(a, &r, &g, &b); + stops[i].r = r; + stops[i].g = g; + stops[i].b = b; + stops[i].a = a; + } + evas_vg_gradient_stop_set(cnt.gradient, stops, length); + printf("Alpha value set to 128\n"); + } + else if (!strcmp(ei->key, "d")) + { + int r, g, b, a; + unsigned int i; + unsigned int length; + Evas_Vg_Gradient_Stop * stops; + evas_vg_gradient_stop_get(cnt.gradient, (const Evas_Vg_Gradient_Stop **)&stops, &length); + if (length != 2) + { + printf("Some critical problem, two color stops was set, received %d.\n", length); + } + for (i = 0; i < length; i++) + { + r = stops[i].r; + g = stops[i].g; + b = stops[i].b; + a = stops[i].a; + evas_color_argb_unpremul(a, &r, &g, &b); + a += 10; + if (a > 255) a = 255; + evas_color_argb_premul(a, &r, &g, &b); + stops[i].r = r; + stops[i].g = g; + stops[i].b = b; + stops[i].a = a; + } + evas_vg_gradient_stop_set(cnt.gradient, stops, length); + printf("Alpha value increased\n"); + } + else if (!strcmp(ei->key, "c")) + { + int r, g, b, a; + unsigned int i; + unsigned int length; + Evas_Vg_Gradient_Stop * stops; + evas_vg_gradient_stop_get(cnt.gradient, (const Evas_Vg_Gradient_Stop **)&stops, &length); + if (length != 2) + { + printf("Some critical problem, two color stops was set, received %d.\n", length); + } + for (i = 0; i < length; i++) + { + r = stops[i].r; + g = stops[i].g; + b = stops[i].b; + a = stops[i].a; + evas_color_argb_unpremul(a, &r, &g, &b); + a -= 10; + if (a < 0) a = 0; + evas_color_argb_premul(a, &r, &g, &b); + stops[i].r = r; + stops[i].g = g; + stops[i].b = b; + stops[i].a = a; + } + evas_vg_gradient_stop_set(cnt.gradient, stops, length); + printf("Alpha value decreased\n"); + } + else if (!strcmp(ei->key, "r")) + { + Evas_Vg_Gradient_Stop stops[] = { + {.offset = 0, .r = 255, .g = 0, .b = 0, .a = 255}, + {.offset = 1, .r = 0, .g = 0, .b = 255, .a = 255} + }; + evas_vg_gradient_stop_set(cnt.gradient, stops, 2); + printf("Color stops reset\n"); + } +} + +int main(void) +{ + if (!ecore_evas_init()) + return EXIT_FAILURE; + + cnt.ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL); + if (!cnt.ee) + { + ecore_evas_shutdown(); + return -1; + } + + ecore_evas_callback_delete_request_set(cnt.ee, _on_delete); + ecore_evas_callback_resize_set(cnt.ee, _canvas_resize_cb); + ecore_evas_show(cnt.ee); + + cnt.ev = ecore_evas_get(cnt.ee); + cnt.bg = evas_object_rectangle_add(cnt.ev); + evas_object_color_set(cnt.bg, 255, 255, 255, 255); + evas_object_focus_set(cnt.bg, EINA_TRUE); + evas_object_show(cnt.bg); + evas_object_event_callback_add(cnt.bg, EVAS_CALLBACK_KEY_DOWN, _on_keydown, NULL); + cnt.vg = evas_object_vg_add(cnt.ev); + evas_object_show(cnt.vg); + _canvas_resize_cb(cnt.ee); + + cnt.container = evas_vg_container_add(cnt.vg); + + cnt.shape = evas_vg_shape_add(cnt.container); + evas_vg_shape_append_rect(cnt.shape, 0, 0, 540, 380, 10, 10); + evas_vg_node_origin_set(cnt.shape, 50, 50); + cnt.gradient = evas_vg_gradient_radial_add(cnt.container); + evas_vg_gradient_radial_center_set(cnt.gradient, 540/2, 380/2); + evas_vg_gradient_radial_radius_set(cnt.gradient, 100); + Evas_Vg_Gradient_Stop stops[] = { + {.offset = 0, .r = 255, .g = 0, .b = 0, .a = 255}, + {.offset = 1, .r = 0, .g = 0, .b = 255, .a = 255} + }; + evas_vg_gradient_stop_set(cnt.gradient, stops, 2); + evas_vg_shape_fill_set(cnt.shape, cnt.gradient); + + printf("Evas gradient manipulation example\n"); + printf("'a'/'z' to move shape vertically\n"); + printf("'s'/'x' to move gradient center vertically\n"); + printf("'w' to set random gradient center position\n"); + printf("'e' to set random gradient colors to semi-transparent (a=128)\n"); + printf("'d'/'c' to increase/decrease alpha value\n"); + printf("'r' to restart color stops\n"); + printf("'q' to quit\n"); + + evas_object_vg_root_node_set(cnt.vg, cnt.container); + ecore_main_loop_begin(); + ecore_evas_shutdown(); + return 0; +} diff --git a/src/examples/evas/meson.build b/src/examples/evas/meson.build index 2e54f7a..d8102c4 100644 --- a/src/examples/evas/meson.build +++ b/src/examples/evas/meson.build @@ -49,7 +49,8 @@ examples = [ 'evas-vg-multiple-shapes', 'evas-vg-reset', 'evas-vg-cubic', - 'evas-vg-gradient' + 'evas-vg-gradient', + 'evas-vg-gradient-manipulation' ] foreach example : examples -- 2.7.4