2015-04-03 07:31:20 -07:00
|
|
|
/**
|
2015-04-03 07:33:32 -07:00
|
|
|
* Simple Evas example illustrating a Evas_VG basic node usage.
|
2015-04-03 07:31:20 -07:00
|
|
|
*
|
|
|
|
* You'll need at least one engine built for it (excluding the buffer
|
|
|
|
* one). See stdout/stderr for output.
|
|
|
|
*
|
|
|
|
* @verbatim
|
2015-11-19 19:07:01 -08:00
|
|
|
* gcc -o evas_vg_simple evas-vg-simple.c `pkg-config --libs --cflags evas ecore ecore-evas eina ector eo efl` -lm
|
2015-04-03 07:31:20 -07:00
|
|
|
* @endverbatim
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#else
|
|
|
|
#define PACKAGE_EXAMPLES_DIR "."
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define WIDTH 400
|
|
|
|
#define HEIGHT 400
|
|
|
|
|
|
|
|
#ifndef EFL_BETA_API_SUPPORT
|
|
|
|
#define EFL_BETA_API_SUPPORT 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Eo.h>
|
|
|
|
#include <Efl.h>
|
|
|
|
#include <Evas.h>
|
|
|
|
#include <Ecore.h>
|
|
|
|
#include <Ecore_Evas.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include <Eina.h>
|
|
|
|
|
|
|
|
#define PATH_KAPPA 0.5522847498
|
|
|
|
#define PI 3.1415926535
|
|
|
|
|
|
|
|
|
2015-07-02 12:51:54 -07:00
|
|
|
static Efl_VG *beginning = NULL;
|
|
|
|
static Efl_VG *end = NULL;
|
|
|
|
static Efl_VG *root = NULL;
|
|
|
|
static double start_time = 0;
|
|
|
|
static Ecore_Animator *anim = NULL;
|
|
|
|
|
2015-04-03 07:31:20 -07:00
|
|
|
struct example_data
|
|
|
|
{
|
|
|
|
Ecore_Evas *ee;
|
|
|
|
Evas *evas;
|
|
|
|
Evas_Object *bg;
|
|
|
|
Evas_Object *vg;
|
|
|
|
};
|
|
|
|
|
|
|
|
static struct example_data d;
|
|
|
|
|
|
|
|
static void
|
|
|
|
_on_delete(Ecore_Evas *ee EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void /* adjust canvas' contents on resizes */
|
|
|
|
_canvas_resize_cb(Ecore_Evas *ee)
|
|
|
|
{
|
|
|
|
int w, h;
|
|
|
|
|
|
|
|
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
|
|
|
|
evas_object_resize(d.bg, w, h);
|
|
|
|
evas_object_resize(d.vg, w, h);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
vector_set(int x, int y, int w, int h)
|
|
|
|
{
|
|
|
|
int vg_w = w, vg_h = h;
|
2016-05-31 14:42:37 -07:00
|
|
|
Efl_VG *root_node, *tmp_vg;
|
2015-04-03 07:31:20 -07:00
|
|
|
|
|
|
|
//Create VG Object
|
|
|
|
Evas_Object *tmp = evas_object_rectangle_add(d.evas);
|
|
|
|
evas_object_resize(tmp, vg_w, vg_h);
|
2015-04-03 07:31:23 -07:00
|
|
|
evas_object_color_set(tmp, 100, 100, 50, 100);
|
2015-04-03 07:31:20 -07:00
|
|
|
evas_object_move(tmp, x,y);
|
|
|
|
evas_object_show(tmp);
|
|
|
|
|
|
|
|
d.vg = evas_object_vg_add(d.evas);
|
|
|
|
evas_object_resize(d.vg, vg_w, vg_h);
|
|
|
|
evas_object_move(d.vg, x,y);
|
|
|
|
evas_object_show(d.vg);
|
|
|
|
evas_object_clip_set(d.vg, tmp);
|
|
|
|
|
|
|
|
// Applying map on the evas_object_vg
|
|
|
|
// Evas_Map *m = evas_map_new(4);
|
|
|
|
// evas_map_smooth_set(m, EINA_TRUE);
|
|
|
|
// evas_map_util_points_populate_from_object_full(m, d.vg, 0);
|
|
|
|
// evas_map_util_rotate(m, 10, 0,0);
|
|
|
|
// evas_object_map_enable_set(d.vg, EINA_TRUE);
|
|
|
|
// evas_object_map_set(d.vg, m);
|
|
|
|
|
|
|
|
// apply some transformation
|
|
|
|
double radian = 30.0 * 2 * 3.141 / 360.0;
|
|
|
|
Eina_Matrix3 matrix;
|
2015-04-16 19:24:47 -07:00
|
|
|
eina_matrix3_identity(&matrix);
|
2015-04-03 07:31:20 -07:00
|
|
|
eina_matrix3_rotate(&matrix, radian);
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
root = efl_add(EFL_VG_CONTAINER_CLASS, NULL);
|
2016-03-01 10:06:28 -08:00
|
|
|
//evas_vg_node_transformation_set(root, &matrix);
|
2015-04-03 07:31:20 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *bg = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "bg"));
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_rect(bg, 0, 0 , vg_w, vg_h, 0, 0);
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_node_origin_set(bg, 0,0);
|
|
|
|
evas_vg_shape_stroke_width_set(bg, 1.0);
|
|
|
|
evas_vg_node_color_set(bg, 80, 80, 80, 80);
|
2015-04-03 07:31:20 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *shape = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "shape"));
|
|
|
|
Efl_VG *rgradient = efl_add(EFL_VG_GRADIENT_RADIAL_CLASS, NULL, efl_vg_name_set(efl_self, "rgradient"));
|
|
|
|
Efl_VG *lgradient = efl_add(EFL_VG_GRADIENT_LINEAR_CLASS, NULL, efl_vg_name_set(efl_self, "lgradient"));
|
2015-04-03 07:31:20 -07:00
|
|
|
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_arc(shape, 0, 0, 100, 100, 25, 330);
|
2015-04-03 07:31:23 -07:00
|
|
|
|
|
|
|
Efl_Gfx_Gradient_Stop stops[3];
|
|
|
|
stops[0].r = 255;
|
|
|
|
stops[0].g = 0;
|
|
|
|
stops[0].b = 0;
|
|
|
|
stops[0].a = 255;
|
|
|
|
stops[0].offset = 0;
|
|
|
|
stops[1].r = 0;
|
|
|
|
stops[1].g = 255;
|
|
|
|
stops[1].b = 0;
|
|
|
|
stops[1].a = 255;
|
|
|
|
stops[1].offset = 0.5;
|
|
|
|
stops[2].r = 0;
|
|
|
|
stops[2].g = 0;
|
|
|
|
stops[2].b = 255;
|
|
|
|
stops[2].a = 255;
|
|
|
|
stops[2].offset = 1;
|
|
|
|
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_node_origin_set(rgradient, 10, 10);
|
|
|
|
evas_vg_gradient_spread_set(rgradient, EFL_GFX_GRADIENT_SPREAD_REFLECT);
|
|
|
|
evas_vg_gradient_stop_set(rgradient, stops, 3);
|
|
|
|
evas_vg_gradient_radial_center_set(rgradient, 30, 30);
|
|
|
|
evas_vg_gradient_radial_radius_set(rgradient, 80);
|
|
|
|
|
|
|
|
evas_vg_node_origin_set(lgradient, 10, 10);
|
|
|
|
evas_vg_gradient_stop_set(lgradient, stops, 3);
|
|
|
|
evas_vg_gradient_spread_set(lgradient, EFL_GFX_GRADIENT_SPREAD_REFLECT);
|
|
|
|
evas_vg_gradient_stop_set(lgradient, stops, 3);
|
|
|
|
evas_vg_gradient_linear_start_set(lgradient, 10, 10);
|
|
|
|
evas_vg_gradient_linear_end_set(lgradient, 50, 50);
|
|
|
|
|
|
|
|
evas_vg_node_origin_set(shape, 10, 10);
|
|
|
|
evas_vg_shape_fill_set(shape, rgradient);
|
|
|
|
evas_vg_shape_stroke_scale_set(shape, 2.0);
|
|
|
|
evas_vg_shape_stroke_width_set(shape, 1.0);
|
|
|
|
evas_vg_node_color_set(shape, 0, 0, 255, 255);
|
|
|
|
evas_vg_shape_stroke_color_set(shape, 0, 0, 255, 128);
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *rect = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "rect"));
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_rect(rect, 0, 0, 100, 100, 0, 0);
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_node_origin_set(rect, 100, 100);
|
|
|
|
evas_vg_shape_fill_set(rect, lgradient);
|
|
|
|
evas_vg_shape_stroke_width_set(rect, 2.0);
|
|
|
|
evas_vg_shape_stroke_join_set(rect, EFL_GFX_JOIN_ROUND);
|
|
|
|
evas_vg_shape_stroke_color_set(rect, 255, 255, 255, 255);
|
2015-04-03 07:31:20 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *rect1 = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "rect1"));
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_rect(rect1, 0, 0, 70, 70, 0, 0);
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_node_origin_set(rect1, 50, 70);
|
|
|
|
evas_vg_shape_stroke_scale_set(rect1, 2);
|
|
|
|
evas_vg_shape_stroke_width_set(rect1, 8.0);
|
|
|
|
evas_vg_shape_stroke_join_set(rect1, EFL_GFX_JOIN_ROUND);
|
|
|
|
evas_vg_shape_stroke_color_set(rect1, 0, 100, 80, 100);
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *circle = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "circle"));
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_arc(circle, 0, 0, 250, 100, 30, 300);
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_shape_fill_set(circle, lgradient);
|
|
|
|
//evas_vg_node_transformation_set(&matrix),
|
|
|
|
evas_vg_node_origin_set(circle, 50,50);
|
|
|
|
evas_vg_node_color_set(circle, 50, 0, 0, 50);
|
2015-04-03 07:31:20 -07:00
|
|
|
|
|
|
|
// Foreground
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *fg = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "fg"));
|
2016-05-31 14:42:37 -07:00
|
|
|
evas_vg_shape_shape_append_rect(fg, 0, 0, vg_w, vg_h, 0, 0);
|
2015-04-03 07:31:27 -07:00
|
|
|
evas_vg_node_origin_set(fg, 0, 0);
|
|
|
|
evas_vg_shape_stroke_width_set(fg, 5.0);
|
|
|
|
evas_vg_shape_stroke_join_set(fg, EFL_GFX_JOIN_ROUND);
|
|
|
|
evas_vg_shape_stroke_color_set(fg, 70, 70, 0, 70);
|
2015-04-03 07:32:56 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *tst = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "tst"));
|
2015-04-03 07:32:56 -07:00
|
|
|
evas_vg_shape_shape_append_rect(tst, 50, 25, 200, 200, 3, 5);
|
|
|
|
evas_vg_node_color_set(tst, 0, 0, 200, 200);
|
|
|
|
evas_vg_shape_stroke_width_set(tst, 2);
|
|
|
|
evas_vg_shape_stroke_color_set(tst, 255, 0, 0, 255);
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
Efl_VG *vc = efl_add(EFL_VG_SHAPE_CLASS, root, efl_vg_name_set(efl_self, "vc"));
|
2015-04-03 07:32:56 -07:00
|
|
|
evas_vg_shape_shape_append_circle(vc, 100, 100, 23);
|
|
|
|
evas_vg_node_color_set(vc, 0, 200, 0, 255);
|
|
|
|
evas_vg_shape_stroke_width_set(vc, 4);
|
|
|
|
evas_vg_shape_stroke_color_set(vc, 255, 0, 0, 255);
|
2015-07-02 12:51:54 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
beginning = efl_add(EFL_VG_CONTAINER_CLASS, NULL, efl_vg_dup(efl_self, root));
|
|
|
|
end = efl_add(EFL_VG_CONTAINER_CLASS, NULL, efl_vg_dup(efl_self, root));
|
2015-07-02 12:51:54 -07:00
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
circle = efl_vg_container_child_get(end, "circle");
|
|
|
|
efl_vg_transformation_set(circle, &matrix);
|
2016-05-31 14:42:37 -07:00
|
|
|
|
|
|
|
root_node = evas_object_vg_root_node_get(d.vg);
|
|
|
|
// check if the dupe is working properly or not
|
2016-08-10 07:23:04 -07:00
|
|
|
efl_parent_set(beginning, root_node);
|
2016-05-31 14:42:37 -07:00
|
|
|
|
|
|
|
tmp_vg = root;
|
|
|
|
root = beginning;
|
|
|
|
beginning = tmp_vg;
|
2015-07-02 12:51:54 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_anim(void *data EINA_UNUSED)
|
|
|
|
{
|
|
|
|
double pos, now;
|
|
|
|
|
|
|
|
now = ecore_loop_time_get();
|
|
|
|
|
|
|
|
if (now - start_time > 3)
|
|
|
|
{
|
|
|
|
Efl_VG *tmp = beginning;
|
|
|
|
|
|
|
|
beginning = end;
|
|
|
|
end = tmp;
|
|
|
|
start_time = now;
|
|
|
|
}
|
|
|
|
|
|
|
|
pos = ecore_animator_pos_map((now - start_time) / 3, ECORE_POS_MAP_SINUSOIDAL, 0, 0);
|
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_vg_interpolate(root, beginning, end, pos);
|
2015-07-02 12:51:54 -07:00
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_keydown(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *einfo)
|
|
|
|
{
|
|
|
|
Evas_Event_Key_Down *ev = einfo;
|
|
|
|
|
|
|
|
if (strcmp(ev->key, "a") == 0)
|
|
|
|
{
|
|
|
|
if (!anim)
|
|
|
|
{
|
|
|
|
anim = ecore_animator_add(_anim, NULL);
|
|
|
|
start_time = ecore_loop_time_get();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ecore_animator_del(anim);
|
|
|
|
anim = NULL;
|
|
|
|
}
|
2016-03-01 10:06:28 -08:00
|
|
|
/* efl_vg_interpolate(root, beginning, end, 0.5); */
|
2015-07-02 12:51:54 -07:00
|
|
|
}
|
|
|
|
fprintf(stderr, "key: [%s]\n", ev->key);
|
2015-04-03 07:31:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main(void)
|
|
|
|
{
|
|
|
|
if (!ecore_evas_init())
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
|
|
|
/* this will give you a window with an Evas canvas under the first
|
|
|
|
* engine available */
|
|
|
|
d.ee = ecore_evas_new(NULL, 0, 0, WIDTH, HEIGHT, NULL);
|
|
|
|
if (!d.ee)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
ecore_evas_callback_delete_request_set(d.ee, _on_delete);
|
|
|
|
ecore_evas_callback_resize_set(d.ee, _canvas_resize_cb);
|
|
|
|
ecore_evas_show(d.ee);
|
|
|
|
|
|
|
|
d.evas = ecore_evas_get(d.ee);
|
|
|
|
|
|
|
|
d.bg = evas_object_rectangle_add(d.evas);
|
|
|
|
evas_object_color_set(d.bg, 70, 70, 70, 255); /* white bg */
|
2015-07-02 12:51:54 -07:00
|
|
|
evas_object_focus_set(d.bg, 1);
|
|
|
|
evas_object_event_callback_add(d.bg, EVAS_CALLBACK_KEY_DOWN, _keydown, NULL);
|
2015-04-03 07:31:20 -07:00
|
|
|
evas_object_show(d.bg);
|
|
|
|
|
|
|
|
_canvas_resize_cb(d.ee);
|
|
|
|
|
|
|
|
vector_set(50, 50, 300 ,300);
|
|
|
|
//vector_set(30, 90, 300 ,300);
|
|
|
|
|
|
|
|
ecore_main_loop_begin();
|
|
|
|
ecore_evas_shutdown();
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
error:
|
|
|
|
ecore_evas_shutdown();
|
|
|
|
return -1;
|
|
|
|
}
|