2015-04-03 07:12:59 -07:00
|
|
|
#include "evas_common_private.h"
|
|
|
|
#include "evas_private.h"
|
|
|
|
|
2015-04-03 07:22:58 -07:00
|
|
|
#include "evas_vg_private.h"
|
|
|
|
|
2015-04-03 07:12:59 -07:00
|
|
|
#include <strings.h>
|
|
|
|
|
2015-04-03 07:30:59 -07:00
|
|
|
#define MY_CLASS EFL_VG_GRADIENT_LINEAR_CLASS
|
2015-04-03 07:22:58 -07:00
|
|
|
|
2015-04-03 07:30:59 -07:00
|
|
|
typedef struct _Efl_VG_Gradient_Linear_Data Efl_VG_Gradient_Linear_Data;
|
|
|
|
struct _Efl_VG_Gradient_Linear_Data
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
struct {
|
|
|
|
double x, y;
|
|
|
|
} start, end;
|
|
|
|
};
|
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2015-04-03 07:30:59 -07:00
|
|
|
_efl_vg_gradient_linear_efl_gfx_gradient_linear_start_set(Eo *obj EINA_UNUSED,
|
|
|
|
Efl_VG_Gradient_Linear_Data *pd,
|
|
|
|
double x, double y)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
pd->start.x = x;
|
|
|
|
pd->start.y = y;
|
2015-04-03 07:30:42 -07:00
|
|
|
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_changed(obj);
|
2015-04-03 07:12:59 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2015-04-03 07:30:59 -07:00
|
|
|
_efl_vg_gradient_linear_efl_gfx_gradient_linear_start_get(Eo *obj EINA_UNUSED,
|
|
|
|
Efl_VG_Gradient_Linear_Data *pd,
|
|
|
|
double *x, double *y)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
if (x) *x = pd->start.x;
|
|
|
|
if (y) *y = pd->start.y;
|
|
|
|
}
|
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2015-04-03 07:30:59 -07:00
|
|
|
_efl_vg_gradient_linear_efl_gfx_gradient_linear_end_set(Eo *obj EINA_UNUSED,
|
|
|
|
Efl_VG_Gradient_Linear_Data *pd,
|
|
|
|
double x, double y)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
pd->end.x = x;
|
|
|
|
pd->end.y = y;
|
2015-04-03 07:30:42 -07:00
|
|
|
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_changed(obj);
|
2015-04-03 07:12:59 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2015-04-03 07:30:59 -07:00
|
|
|
_efl_vg_gradient_linear_efl_gfx_gradient_linear_end_get(Eo *obj EINA_UNUSED,
|
|
|
|
Efl_VG_Gradient_Linear_Data *pd,
|
|
|
|
double *x, double *y)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
if (x) *x = pd->end.x;
|
|
|
|
if (y) *y = pd->end.y;
|
|
|
|
}
|
|
|
|
|
2015-04-03 07:22:58 -07:00
|
|
|
static void
|
2015-04-03 07:30:59 -07:00
|
|
|
_efl_vg_gradient_linear_render_pre(Eo *obj,
|
|
|
|
Eina_Matrix3 *parent,
|
|
|
|
Ector_Surface *s,
|
|
|
|
void *data,
|
2016-05-11 05:13:27 -07:00
|
|
|
Efl_VG_Data *nd)
|
2015-04-03 07:22:58 -07:00
|
|
|
{
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Linear_Data *pd = data;
|
|
|
|
Efl_VG_Gradient_Data *gd;
|
2015-04-03 07:30:42 -07:00
|
|
|
|
2016-05-19 01:55:06 -07:00
|
|
|
if (nd->flags == EFL_GFX_CHANGE_FLAG_NONE) return ;
|
|
|
|
|
|
|
|
nd->flags = EFL_GFX_CHANGE_FLAG_NONE;
|
2015-04-03 07:30:42 -07:00
|
|
|
|
2015-04-03 07:30:59 -07:00
|
|
|
gd = eo_data_scope_get(obj, EFL_VG_GRADIENT_CLASS);
|
|
|
|
EFL_VG_COMPUTE_MATRIX(current, parent, nd);
|
2015-04-03 07:22:58 -07:00
|
|
|
|
|
|
|
if (!nd->renderer)
|
|
|
|
{
|
2016-05-11 04:57:06 -07:00
|
|
|
nd->renderer = ector_surface_renderer_factory_new(s, ECTOR_RENDERER_GRADIENT_LINEAR_MIXIN);
|
2015-04-03 07:22:58 -07:00
|
|
|
}
|
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
ector_renderer_transformation_set(nd->renderer, current);
|
|
|
|
ector_renderer_origin_set(nd->renderer, nd->x, nd->y);
|
|
|
|
ector_renderer_color_set(nd->renderer, nd->r, nd->g, nd->b, nd->a);
|
|
|
|
ector_renderer_visibility_set(nd->renderer, nd->visibility);
|
|
|
|
efl_gfx_gradient_stop_set(nd->renderer, gd->colors, gd->colors_count);
|
|
|
|
efl_gfx_gradient_spread_set(nd->renderer, gd->s);
|
|
|
|
efl_gfx_gradient_linear_start_set(nd->renderer, pd->start.x, pd->start.y);
|
|
|
|
efl_gfx_gradient_linear_end_set(nd->renderer, pd->end.x, pd->end.y);
|
|
|
|
ector_renderer_prepare(nd->renderer);
|
2015-04-03 07:22:58 -07:00
|
|
|
}
|
|
|
|
|
2015-05-19 03:41:27 -07:00
|
|
|
static Eo *
|
2016-08-10 07:23:04 -07:00
|
|
|
_efl_vg_gradient_linear_efl_object_constructor(Eo *obj,
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Linear_Data *pd)
|
2015-04-03 07:22:58 -07:00
|
|
|
{
|
2016-05-11 05:13:27 -07:00
|
|
|
Efl_VG_Data *nd;
|
2015-04-03 07:22:58 -07:00
|
|
|
|
2016-08-10 07:23:04 -07:00
|
|
|
obj = efl_constructor(eo_super(obj, MY_CLASS));
|
2015-04-03 07:22:58 -07:00
|
|
|
|
2016-05-11 05:13:27 -07:00
|
|
|
nd = eo_data_scope_get(obj, EFL_VG_CLASS);
|
2015-04-03 07:30:59 -07:00
|
|
|
nd->render_pre = _efl_vg_gradient_linear_render_pre;
|
2015-04-03 07:22:58 -07:00
|
|
|
nd->data = pd;
|
2015-05-19 03:41:27 -07:00
|
|
|
|
|
|
|
return obj;
|
2015-04-03 07:22:58 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:37:56 -07:00
|
|
|
static void
|
2016-08-10 07:23:04 -07:00
|
|
|
_efl_vg_gradient_linear_efl_object_destructor(Eo *obj, Efl_VG_Gradient_Linear_Data *pd EINA_UNUSED)
|
2015-04-03 07:22:58 -07:00
|
|
|
{
|
2016-08-10 07:23:04 -07:00
|
|
|
efl_destructor(eo_super(obj, MY_CLASS));
|
2015-04-03 07:22:58 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:38:07 -07:00
|
|
|
static void
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_gradient_linear_efl_vg_bounds_get(Eo *obj, Efl_VG_Gradient_Linear_Data *pd, Eina_Rectangle *r)
|
2015-04-03 07:37:56 -07:00
|
|
|
{
|
2016-05-11 05:13:27 -07:00
|
|
|
Efl_VG_Data *nd;
|
2015-04-03 07:38:04 -07:00
|
|
|
|
2016-05-11 05:13:27 -07:00
|
|
|
nd = eo_data_scope_get(obj, EFL_VG_CLASS);
|
2015-04-03 07:38:04 -07:00
|
|
|
EINA_RECTANGLE_SET(r,
|
|
|
|
nd->x + pd->start.x, nd->y + pd->start.y,
|
|
|
|
pd->end.x - pd->start.x, pd->end.y - pd->start.x);
|
2015-04-03 07:37:56 -07:00
|
|
|
}
|
|
|
|
|
2015-06-16 07:28:19 -07:00
|
|
|
static Eina_Bool
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_gradient_linear_efl_vg_interpolate(Eo *obj,
|
2015-06-16 07:28:19 -07:00
|
|
|
Efl_VG_Gradient_Linear_Data *pd,
|
2016-05-11 05:13:27 -07:00
|
|
|
const Efl_VG *from, const Efl_VG *to,
|
2015-06-16 07:28:19 -07:00
|
|
|
double pos_map)
|
|
|
|
{
|
|
|
|
Efl_VG_Gradient_Linear_Data *fromd, *tod;
|
|
|
|
double from_map;
|
|
|
|
Eina_Bool r;
|
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
r = efl_vg_interpolate(eo_super(obj, EFL_VG_GRADIENT_LINEAR_CLASS), from, to, pos_map);
|
2015-06-16 07:28:19 -07:00
|
|
|
|
|
|
|
if (!r) return EINA_FALSE;
|
|
|
|
|
|
|
|
fromd = eo_data_scope_get(from, EFL_VG_GRADIENT_LINEAR_CLASS);
|
|
|
|
tod = eo_data_scope_get(to, EFL_VG_GRADIENT_LINEAR_CLASS);
|
|
|
|
from_map = 1.0 - pos_map;
|
|
|
|
|
|
|
|
#define INTP(Pd, From, To, Member, From_Map, Pos_Map) \
|
|
|
|
Pd->Member = From->Member * From_Map + To->Member * Pos_Map
|
|
|
|
|
|
|
|
INTP(pd, fromd, tod, start.x, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, start.y, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, end.x, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, end.y, from_map, pos_map);
|
|
|
|
|
|
|
|
#undef INTP
|
|
|
|
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2015-06-19 02:26:46 -07:00
|
|
|
static void
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_gradient_linear_efl_vg_dup(Eo *obj,
|
2015-06-19 02:26:46 -07:00
|
|
|
Efl_VG_Gradient_Linear_Data *pd EINA_UNUSED,
|
2016-05-11 05:13:27 -07:00
|
|
|
const Efl_VG *from)
|
2015-06-19 02:26:46 -07:00
|
|
|
{
|
|
|
|
Efl_VG_Gradient_Linear_Data *fromd;
|
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_vg_dup(eo_super(obj, EFL_VG_GRADIENT_LINEAR_CLASS), from);
|
2015-06-19 02:26:46 -07:00
|
|
|
|
|
|
|
fromd = eo_data_scope_get(from, EFL_VG_GRADIENT_LINEAR_CLASS);
|
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_linear_start_set(obj, fromd->start.x, fromd->start.y);
|
|
|
|
efl_gfx_gradient_linear_end_set(obj, fromd->end.x, fromd->end.y);
|
2015-06-19 02:26:46 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:30:59 -07:00
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_linear_start_set(Eo *obj, double x, double y)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_linear_start_set(obj, x, y);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_linear_start_get(Eo *obj, double *x, double *y)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_linear_start_get(obj, x, y);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_linear_end_set(Eo *obj, double x, double y)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_linear_end_set(obj, x, y);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_linear_end_get(Eo *obj, double *x, double *y)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_linear_end_get(obj, x, y);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#include "efl_vg_gradient_linear.eo.c"
|