Created gradient manipulation example 99/243499/2
authorMichal Maciola <m.maciola@samsung.com>
Mon, 24 Aug 2020 09:30:52 +0000 (11:30 +0200)
committerHermet Park <chuneon.park@samsung.com>
Tue, 8 Sep 2020 03:32:51 +0000 (03:32 +0000)
Change-Id: I2f58fba0f6260cf57dbcc58aa59ba26a80eb24ce

src/examples/evas/evas-vg-gradient-manipulation.c [new file with mode: 0644]
src/examples/evas/meson.build

diff --git a/src/examples/evas/evas-vg-gradient-manipulation.c b/src/examples/evas/evas-vg-gradient-manipulation.c
new file mode 100644 (file)
index 0000000..fd67bbb
--- /dev/null
@@ -0,0 +1,240 @@
+/**
+ * gcc evas-vg-gradient-manipulation.c -o evas-vg-gradient-manipulation `pkg-config --libs --cflags ecore ecore-evas`
+ */
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+#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;
+}
index 2e54f7a..d8102c4 100644 (file)
@@ -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