evas vg: Added gradient interpolation example 93/257993/2
authorMichal Szczecinski <m.szczecinsk@partner.samsung.com>
Thu, 6 May 2021 12:24:30 +0000 (14:24 +0200)
committerHermet Park <chuneon.park@samsung.com>
Mon, 10 May 2021 04:31:37 +0000 (04:31 +0000)
This example shows how to implement gradient interpolation. It will be
used as a test for gradients interpolation implementation.

Change-Id: Ifb6632d013686597a1c28ebba94b0afe95e5b677

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

diff --git a/src/examples/evas/evas-vg-gradient-interpolation.c b/src/examples/evas/evas-vg-gradient-interpolation.c
new file mode 100644 (file)
index 0000000..0a4628a
--- /dev/null
@@ -0,0 +1,191 @@
+/**
+ * gcc evas-vg-gradient-interpolation.c -o evas-vg-gradient-interpolation `pkg-config --libs --cflags ecore ecore-evas`
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#else
+#define PACKAGE_EXAMPLES_DIR "."
+#endif
+
+#define WIDTH 500
+#define HEIGHT 500
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+
+struct content
+{
+   Ecore_Evas *ee;
+   Evas *ev;
+   Evas_Object *bg;
+   Evas_Object *vg;
+   Efl_VG *container;
+
+   Ecore_Animator *anime;
+
+   Efl_VG *shape_rect;
+   Efl_VG *from_rect;
+   Efl_VG *to_rect;
+
+   Efl_VG *shape_circle;
+   Efl_VG *from_circle;
+   Efl_VG *to_circle;
+};
+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 EINA_UNUSED,
+            void *event_info)
+{
+   Evas_Event_Key_Down *ei = event_info;
+
+   if (!strcmp(ei->key, "q"))
+      _on_delete(cnt.ee);
+}
+
+static Eina_Bool
+_animator(void *data EINA_UNUSED, double pos)
+{
+   evas_vg_shape_interpolate(cnt.shape_rect, cnt.from_rect, cnt.to_rect, pos);
+   evas_vg_shape_interpolate(cnt.shape_circle, cnt.from_circle, cnt.to_circle, pos);
+   return EINA_TRUE;
+}
+
+int main(void)
+{
+   Efl_VG *linear_gradient_from = NULL;
+   Efl_VG *linear_gradient_to = NULL;
+   Efl_VG *radial_gradient_from = NULL;
+   Efl_VG *radial_gradient_to = NULL;
+
+   Evas_Vg_Gradient_Stop stops1[] =
+   {
+      {.offset = 0.25, .r = 255, .g = 000, .b = 000, .a = 255},
+      {.offset = 0.50, .r = 000, .g = 255, .b = 000, .a = 255},
+      {.offset = 1.00, .r = 000, .g = 000, .b = 255, .a = 255}
+   };
+
+   Evas_Vg_Gradient_Stop stops2[] =
+   {
+      {.offset = 0.25, .r = 000, .g = 255, .b = 000, .a = 255},
+      {.offset = 0.50, .r = 000, .g = 000, .b = 255, .a = 255},
+      {.offset = 1.00, .r = 255, .g = 000, .b = 000, .a = 255}
+   };
+
+   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);
+
+   //Create destination rectagle
+   cnt.shape_rect = evas_vg_shape_add(cnt.container);
+   evas_vg_shape_append_rect(cnt.shape_rect, 10, 10, 200, 200, 0, 0);
+   evas_vg_shape_stroke_color_set(cnt.shape_rect, 255, 0, 0, 255);
+   evas_vg_shape_stroke_width_set(cnt.shape_rect, 5);
+
+   //Create linear gradients (beggining state and end state)
+   linear_gradient_from = evas_vg_gradient_linear_add(cnt.container);
+   linear_gradient_to = evas_vg_gradient_linear_add(cnt.container);
+
+   //Setup gradients
+   evas_vg_gradient_linear_start_set(linear_gradient_from, 0, 0);
+   evas_vg_gradient_linear_end_set(linear_gradient_from, 200, 200);
+   evas_vg_gradient_linear_start_set(linear_gradient_to, 0, 0);
+   evas_vg_gradient_linear_end_set(linear_gradient_to, 50, 50);
+
+   evas_vg_gradient_spread_set(linear_gradient_to, EVAS_VG_GRADIENT_SPREAD_REFLECT);
+   evas_vg_gradient_spread_set(linear_gradient_from, EVAS_VG_GRADIENT_SPREAD_REFLECT);
+
+   //Set colors
+   evas_vg_gradient_stop_set(linear_gradient_from, stops1, 3);
+   evas_vg_gradient_stop_set(linear_gradient_to, stops2, 3);
+
+   //Setup begining state and end state of the shape.
+   cnt.from_rect = evas_vg_shape_add(cnt.vg);
+   cnt.to_rect = evas_vg_shape_add(cnt.vg);
+
+   evas_vg_shape_append_rect(cnt.from_rect, 10, 10, 200, 200, 0, 0);
+   evas_vg_shape_append_rect(cnt.to_rect, 10, 10, 200, 200, 0, 0);
+
+   //Destination shape should also use same fill setup.
+   evas_vg_shape_fill_set(cnt.shape_rect, linear_gradient_from);
+
+   evas_vg_shape_fill_set(cnt.from_rect, linear_gradient_from);
+   evas_vg_shape_fill_set(cnt.to_rect, linear_gradient_to);
+
+   //Same case for circle shape..
+   cnt.shape_circle = evas_vg_shape_add(cnt.container);
+   evas_vg_shape_append_circle(cnt.shape_circle, 370, 110, 100);
+   evas_vg_shape_stroke_color_set(cnt.shape_circle, 255, 0, 0, 255);
+   evas_vg_shape_stroke_width_set(cnt.shape_circle, 5);
+
+   cnt.from_circle = evas_vg_shape_add(cnt.vg);
+   cnt.to_circle = evas_vg_shape_add(cnt.vg);
+
+   evas_vg_shape_append_circle(cnt.from_circle, 370, 110, 100);
+   evas_vg_shape_append_circle(cnt.to_circle, 370, 110, 100);
+
+   radial_gradient_from = evas_vg_gradient_radial_add(cnt.container);
+   radial_gradient_to = evas_vg_gradient_radial_add(cnt.container);
+
+   evas_vg_gradient_spread_set(radial_gradient_from, EVAS_VG_GRADIENT_SPREAD_REFLECT);
+   evas_vg_gradient_stop_set(radial_gradient_from, stops1, 3);
+
+   evas_vg_gradient_spread_set(radial_gradient_to, EVAS_VG_GRADIENT_SPREAD_REFLECT);
+   evas_vg_gradient_stop_set(radial_gradient_to, stops2, 3);
+
+   evas_vg_gradient_radial_center_set(radial_gradient_from, 370, 110);
+   evas_vg_gradient_radial_center_set(radial_gradient_to, 320, 90);
+   evas_vg_gradient_radial_radius_set(radial_gradient_from, 100);
+   evas_vg_gradient_radial_radius_set(radial_gradient_to, 50);
+
+   evas_vg_shape_fill_set(cnt.shape_circle, radial_gradient_from);
+   evas_vg_shape_fill_set(cnt.from_circle, radial_gradient_from);
+   evas_vg_shape_fill_set(cnt.to_circle, radial_gradient_to);
+
+   evas_object_vg_root_node_set(cnt.vg, cnt.container);
+   cnt.anime = ecore_animator_timeline_add(5, _animator, NULL);
+
+   ecore_main_loop_begin();
+   ecore_evas_shutdown();
+   return 0;
+}
\ No newline at end of file
index 4e1c797..2b22676 100644 (file)
@@ -52,7 +52,8 @@ examples = [
   'evas-vg-reset',
   'evas-vg-cubic',
   'evas-vg-gradient',
-  'evas-vg-gradient-manipulation'
+  'evas-vg-gradient-manipulation',
+  'evas-vg-gradient-interpolation'
 ]
 
 foreach example : examples