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
|
|
|
|
2015-04-03 07:22:58 -07:00
|
|
|
#include <strings.h>
|
2015-04-03 07:12:59 -07:00
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2016-05-10 07:06:04 -07:00
|
|
|
_efl_vg_gradient_efl_gfx_gradient_stop_set(Eo *obj EINA_UNUSED,
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Data *pd,
|
|
|
|
const Efl_Gfx_Gradient_Stop *colors,
|
|
|
|
unsigned int length)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
2015-04-03 07:23:16 -07:00
|
|
|
pd->colors = realloc(pd->colors, length * sizeof(Efl_Gfx_Gradient_Stop));
|
2015-04-03 07:12:59 -07:00
|
|
|
if (!pd->colors)
|
|
|
|
{
|
|
|
|
pd->colors_count = 0;
|
|
|
|
return ;
|
|
|
|
}
|
|
|
|
|
2015-04-03 07:23:16 -07:00
|
|
|
memcpy(pd->colors, colors, length * sizeof(Efl_Gfx_Gradient_Stop));
|
2015-04-03 07:12:59 -07:00
|
|
|
pd->colors_count = length;
|
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
|
2016-05-10 07:06:04 -07:00
|
|
|
_efl_vg_gradient_efl_gfx_gradient_stop_get(Eo *obj EINA_UNUSED,
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Data *pd,
|
|
|
|
const Efl_Gfx_Gradient_Stop **colors,
|
|
|
|
unsigned int *length)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
if (colors) *colors = pd->colors;
|
|
|
|
if (length) *length = pd->colors_count;
|
|
|
|
}
|
|
|
|
|
2015-04-03 07:22:57 -07:00
|
|
|
static void
|
2016-05-10 07:06:04 -07:00
|
|
|
_efl_vg_gradient_efl_gfx_gradient_spread_set(Eo *obj EINA_UNUSED,
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Data *pd,
|
|
|
|
Efl_Gfx_Gradient_Spread s)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
pd->s = s;
|
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:23:16 -07:00
|
|
|
static Efl_Gfx_Gradient_Spread
|
2016-05-10 07:06:04 -07:00
|
|
|
_efl_vg_gradient_efl_gfx_gradient_spread_get(Eo *obj EINA_UNUSED,
|
2015-04-03 07:30:59 -07:00
|
|
|
Efl_VG_Gradient_Data *pd)
|
2015-04-03 07:12:59 -07:00
|
|
|
{
|
|
|
|
return pd->s;
|
|
|
|
}
|
|
|
|
|
2015-06-16 07:28:19 -07:00
|
|
|
static Eina_Bool
|
2016-05-11 05:13:27 -07:00
|
|
|
_efl_vg_gradient_efl_vg_interpolate(Eo *obj,
|
2015-06-16 07:28:19 -07:00
|
|
|
Efl_VG_Gradient_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_Data *fromd, *tod;
|
|
|
|
Efl_Gfx_Gradient_Stop *colors;
|
|
|
|
unsigned int i;
|
|
|
|
double from_map;
|
|
|
|
Eina_Bool r;
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
r = efl_vg_interpolate(efl_super(obj, EFL_VG_GRADIENT_CLASS), from, to, pos_map);
|
2015-06-16 07:28:19 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
fromd = efl_data_scope_get(from, EFL_VG_GRADIENT_CLASS);
|
|
|
|
tod = efl_data_scope_get(to, EFL_VG_GRADIENT_CLASS);
|
2015-06-16 07:28:19 -07:00
|
|
|
from_map = 1.0 - pos_map;
|
|
|
|
|
|
|
|
if (!r) return EINA_FALSE;
|
|
|
|
if (fromd->colors_count != tod->colors_count) return EINA_FALSE;
|
|
|
|
|
|
|
|
colors = realloc(pd->colors, sizeof (Efl_Gfx_Gradient_Stop) * tod->colors_count);
|
|
|
|
if (!colors) return EINA_FALSE;
|
|
|
|
|
|
|
|
pd->colors = colors;
|
|
|
|
|
|
|
|
#define INTP(Pd, From, To, I, Member, From_Map, Pos_Map) \
|
|
|
|
Pd->colors[I].Member = From->colors[I].Member * From_Map + To->colors[I].Member * Pos_Map
|
|
|
|
|
|
|
|
for (i = 0; i < fromd->colors_count; i++)
|
|
|
|
{
|
|
|
|
INTP(pd, fromd, tod, i, offset, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, i, r, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, i, g, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, i, b, from_map, pos_map);
|
|
|
|
INTP(pd, fromd, tod, i, a, 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_efl_vg_dup(Eo *obj,
|
2015-06-19 02:26:46 -07:00
|
|
|
Efl_VG_Gradient_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_Data *fromd;
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
efl_vg_dup(efl_super(obj, EFL_VG_GRADIENT_CLASS), from);
|
2015-06-19 02:26:46 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
fromd = efl_data_scope_get(from, EFL_VG_GRADIENT_CLASS);
|
2015-06-19 02:26:46 -07:00
|
|
|
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_stop_set(obj, fromd->colors, fromd->colors_count);
|
|
|
|
efl_gfx_gradient_spread_set(obj, fromd->s);
|
2015-06-19 02:26:46 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:30:59 -07:00
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_stop_set(Eo *obj, const Efl_Gfx_Gradient_Stop *colors, unsigned int length)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_stop_set(obj, colors, length);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_stop_get(Eo *obj, const Efl_Gfx_Gradient_Stop **colors, unsigned int *length)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_stop_get(obj, colors, length);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
evas_vg_gradient_spread_set(Eo *obj, Efl_Gfx_Gradient_Spread s)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
efl_gfx_gradient_spread_set(obj, s);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI Efl_Gfx_Gradient_Spread
|
|
|
|
evas_vg_gradient_spread_get(Eo *obj)
|
|
|
|
{
|
2016-03-01 10:06:28 -08:00
|
|
|
return efl_gfx_gradient_spread_get(obj);
|
2015-04-03 07:30:59 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#include "efl_vg_gradient.eo.c"
|