#define MY_CLASS EFL_CANVAS_VG_GRADIENT_CLASS
-#ifdef HAVE_THORVG
-
-static void
-_gradient_stop_set(Evas_Vg_Gradient *obj, const Efl_Gfx_Gradient_Stop *colors, unsigned int length)
-{
- if (!obj) return;
-
- Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS);
- if (!gd) return;
-
- Tvg_Color_Stop *color_stops = malloc(sizeof(Tvg_Color_Stop) * length);
- if (!color_stops) return;
-
- unsigned int i = 0;
- for (i = 0; i < length; ++i)
- {
- color_stops[i].offset = colors[i].offset;
-
- int r, g, b, a;
- r = colors[i].r;
- g = colors[i].g;
- b = colors[i].b;
- a = colors[i].a;
- evas_color_argb_unpremul(a, &r, &g, &b);
- color_stops[i].r = (uint8_t)r;
- color_stops[i].g = (uint8_t)g;
- color_stops[i].b = (uint8_t)b;
- color_stops[i].a = (uint8_t)a;
- }
-
- tvg_gradient_set_color_stops(gd->gradient, color_stops, length);
- free(color_stops);
-
- if (gd->shape) efl_canvas_vg_node_change(gd->shape);
-}
-
-static void
-_gradient_stop_get(Evas_Vg_Gradient *obj, Efl_Gfx_Gradient_Stop **colors, unsigned int *length)
-{
- if (!obj || !colors || !length) return;
-
- const Tvg_Color_Stop *stop = NULL;
- uint32_t len = 0;
- unsigned int i = 0;
-
- Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS);
- if (!gd) return;
-
- tvg_gradient_get_color_stops(gd->gradient, &stop, &len);
- *length = len;
-
- *colors = malloc(sizeof(Efl_Gfx_Gradient_Stop) * len);
- if (!*colors) return;
-
- for (i = 0; i < len; ++i)
- {
- (*colors)[i].offset = stop[i].offset;
- (*colors)[i].a = stop[i].a;
- (*colors)[i].r = stop[i].r;
- (*colors)[i].g = stop[i].g;
- (*colors)[i].b = stop[i].b;
- evas_color_argb_premul((*colors)[i].a, &(*colors)[i].r, &(*colors)[i].g, &(*colors)[i].b);
- }
-}
-#endif
-
-static void
-_efl_canvas_vg_gradient_efl_gfx_gradient_stop_set(Eo *obj EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *pd,
- const Efl_Gfx_Gradient_Stop *colors,
- unsigned int length)
-{
- pd->colors = realloc(pd->colors, length * sizeof(Efl_Gfx_Gradient_Stop));
- if (!pd->colors)
- {
- pd->colors_count = 0;
- return ;
- }
-
- memcpy(pd->colors, colors, length * sizeof(Efl_Gfx_Gradient_Stop));
- pd->colors_count = length;
-
- efl_canvas_vg_node_change(obj);
-}
-
-static void
-_efl_canvas_vg_gradient_efl_gfx_gradient_stop_get(const Eo *obj EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *pd,
- const Efl_Gfx_Gradient_Stop **colors,
- unsigned int *length)
-{
- if (colors) *colors = pd->colors;
- if (length) *length = pd->colors_count;
-}
-
-static void
-_efl_canvas_vg_gradient_efl_gfx_gradient_spread_set(Eo *obj EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *pd,
- Efl_Gfx_Gradient_Spread spread)
-{
- pd->spread = spread;
-
- efl_canvas_vg_node_change(obj);
-}
-
-static Efl_Gfx_Gradient_Spread
-_efl_canvas_vg_gradient_efl_gfx_gradient_spread_get(const Eo *obj EINA_UNUSED,
- Efl_Canvas_Vg_Gradient_Data *pd)
-{
- return pd->spread;
-}
-
static Eina_Bool
_efl_canvas_vg_gradient_efl_gfx_path_interpolate(Eo *obj,
Efl_Canvas_Vg_Gradient_Data *pd EINA_UNUSED,
const Efl_VG *from, const Efl_VG *to,
double pos_map)
{
- Efl_Canvas_Vg_Gradient_Data *fromd, *tod;
- Efl_Gfx_Gradient_Stop *colors;
- unsigned int i;
- double from_map;
- Eina_Bool r;
+ Efl_Canvas_Vg_Gradient_Data *fromd = NULL, *tod = NULL;
+ Eina_Bool ret = EINA_FALSE;
- r = efl_gfx_path_interpolate(efl_super(obj, EFL_CANVAS_VG_GRADIENT_CLASS), from, to, pos_map);
+ unsigned int i = 0;
+ double from_map = 0.0;
+
+ ret = efl_gfx_path_interpolate(efl_super(obj, EFL_CANVAS_VG_GRADIENT_CLASS), from, to, pos_map);
+ if (!ret) return EINA_FALSE;
fromd = efl_data_scope_get(from, EFL_CANVAS_VG_GRADIENT_CLASS);
tod = efl_data_scope_get(to, EFL_CANVAS_VG_GRADIENT_CLASS);
- from_map = 1.0 - pos_map;
- if (!r) return EINA_FALSE;
- if (fromd->colors_count != tod->colors_count) return EINA_FALSE;
+ if (!fromd || !tod) return EINA_FALSE;
-#ifndef HAVE_THORVG
- colors = realloc(pd->colors, sizeof (Efl_Gfx_Gradient_Stop) * tod->colors_count);
- if (!colors) return EINA_FALSE;
- pd->colors = colors;
+ from_map = 1.0 - pos_map;
+ if (fromd->colors_count != tod->colors_count) return EINA_FALSE;
-#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
+#define INTP(destination, f, t, I, Member, From_Map, Pos_Map) \
+ destination->colors[I].Member = f->colors[I].Member * From_Map + t->colors[I].Member * Pos_Map
- for (i = 0; i < fromd->colors_count; i++)
+ for (i = 0; i < pd->colors_count; i++)
{
INTP(pd, fromd, tod, i, offset, from_map, pos_map);
INTP(pd, fromd, tod, i, r, from_map, pos_map);
#undef INTP
-#else
- unsigned len = 0, from_len = 0, to_len = 0;
-
- Efl_Gfx_Gradient_Stop *fcolors, *tcolors;
-
- _gradient_stop_get(obj, &colors, &len);
- _gradient_stop_get((Efl_VG*) from, &fcolors, &from_len);
- _gradient_stop_get((Efl_VG*) to, &tcolors, &to_len);
-
- if (from_len != to_len) return EINA_FALSE;
-
-#define INTP(destination, f, t, I, Member, From_Map, Pos_Map) \
- destination[I].Member = f[I].Member * From_Map + t[I].Member * Pos_Map
-
- for (i = 0; i < len; i++)
- {
- INTP(colors, fcolors, tcolors, i, offset, from_map, pos_map);
- INTP(colors, fcolors, tcolors, i, r, from_map, pos_map);
- INTP(colors, fcolors, tcolors, i, g, from_map, pos_map);
- INTP(colors, fcolors, tcolors, i, b, from_map, pos_map);
- INTP(colors, fcolors, tcolors, i, a, from_map, pos_map);
- }
-
-#undef INTP
-
- _gradient_stop_set(obj, colors, len);
-#endif
+ evas_vg_gradient_stop_set(obj, pd->colors, pd->colors_count);
return EINA_TRUE;
}
static void
_efl_canvas_vg_gradient_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Gradient_Data *pd)
{
- if (pd->colors) free(pd->colors);
+ if (pd->colors)
+ {
+ free(pd->colors);
+ pd->colors = NULL;
+ }
+
efl_destructor(efl_super(obj, MY_CLASS));
}
EOLIAN static Efl_VG *
_efl_canvas_vg_gradient_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Gradient_Data *pd)
-
{
Efl_VG *cn = efl_duplicate(efl_super(obj, MY_CLASS));
- efl_gfx_gradient_stop_set(cn, pd->colors, pd->colors_count);
- efl_gfx_gradient_spread_set(cn, pd->spread);
+ evas_vg_gradient_stop_set(cn, pd->colors, pd->colors_count);
+ evas_vg_gradient_spread_set(cn, pd->spread);
return cn;
}
EAPI void
evas_vg_gradient_stop_set(Evas_Vg_Gradient *obj, const Evas_Vg_Gradient_Stop *colors, unsigned int length)
{
-#ifdef HAVE_THORVG
- _gradient_stop_set(obj, (const Efl_Gfx_Gradient_Stop *)colors, length);
-#else
- efl_gfx_gradient_stop_set(obj, (const Efl_Gfx_Gradient_Stop *)colors, length);
-#endif
+ Efl_Canvas_Vg_Gradient_Data *gd = NULL;
+ Tvg_Color_Stop *color_stops = NULL;
+
+ if (!obj || length == 0) return;
+
+ gd = efl_data_scope_get(obj, MY_CLASS);
+ if (!gd) return;
+
+ color_stops = malloc(sizeof(Tvg_Color_Stop) * length);
+ if (!color_stops) return;
+
+ gd->colors = malloc(sizeof(Evas_Vg_Gradient_Stop) * length);
+ if (!gd->colors) return;
+
+ unsigned int i = 0;
+ for (i = 0; i < length; ++i)
+ {
+ color_stops[i].offset = colors[i].offset;
+
+ int r, g, b, a;
+ r = colors[i].r;
+ g = colors[i].g;
+ b = colors[i].b;
+ a = colors[i].a;
+ evas_color_argb_unpremul(a, &r, &g, &b);
+ color_stops[i].r = (uint8_t)r;
+ color_stops[i].g = (uint8_t)g;
+ color_stops[i].b = (uint8_t)b;
+ color_stops[i].a = (uint8_t)a;
+ }
+
+ tvg_gradient_set_color_stops(gd->gradient, color_stops, length);
+ free(color_stops);
+
+ memcpy(gd->colors, colors, sizeof(Evas_Vg_Gradient_Stop) * length);
+ gd->colors_count = length;
+
+ if (gd->shape) efl_canvas_vg_node_change(gd->shape);
}
EAPI void
evas_vg_gradient_stop_get(Evas_Vg_Gradient *obj, const Evas_Vg_Gradient_Stop **colors, unsigned int *length)
{
-#ifdef HAVE_THORVG
- _gradient_stop_get(obj, (Efl_Gfx_Gradient_Stop **)colors, length);
-#else
- efl_gfx_gradient_stop_get(obj, (const Efl_Gfx_Gradient_Stop **)colors, length);
-#endif
+ Efl_Canvas_Vg_Gradient_Data *gd = NULL;
+ Evas_Vg_Gradient_Stop **destination = NULL;
+ const Tvg_Color_Stop *stop = NULL;
+ uint32_t len = 0;
+ unsigned int i = 0;
+
+ if (!obj || !colors) return;
+
+ gd = efl_data_scope_get(obj, MY_CLASS);
+ if (!gd || gd->gradient) return;
+
+ tvg_gradient_get_color_stops(gd->gradient, &stop, &len);
+ if (length) *length = len;
+
+ *colors = malloc(sizeof(Evas_Vg_Gradient_Stop) * len);
+ if (!*colors) return;
+ destination = (Evas_Vg_Gradient_Stop**)colors;
+
+ for (i = 0; i < len; ++i)
+ {
+ (*destination)[i].offset = stop[i].offset;
+ (*destination)[i].a = stop[i].a;
+ (*destination)[i].r = stop[i].r;
+ (*destination)[i].g = stop[i].g;
+ (*destination)[i].b = stop[i].b;
+ evas_color_argb_premul((*destination)[i].a, &(*destination)[i].r, &(*destination)[i].g, &(*destination)[i].b);
+ }
}
EAPI void
evas_vg_gradient_spread_set(Evas_Vg_Gradient *obj, Evas_Vg_Gradient_Spread s)
{
-#ifdef HAVE_THORVG
+ Efl_Canvas_Vg_Gradient_Data *gd = NULL;
+
if (!obj) return;
- Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS);
+ gd = efl_data_scope_get(obj, MY_CLASS);
+
+ if (!gd || !gd->gradient) return;
+ gd->spread = s;
+
tvg_gradient_set_spread(gd->gradient, (Tvg_Stroke_Fill)s);
-#else
- efl_gfx_gradient_spread_set(obj, (Efl_Gfx_Gradient_Spread)s);
-#endif
}
EAPI Evas_Vg_Gradient_Spread
evas_vg_gradient_spread_get(Evas_Vg_Gradient *obj)
{
-#ifdef HAVE_THORVG
+ Efl_Canvas_Vg_Gradient_Data *gd = NULL;
+ Tvg_Stroke_Fill fill = TVG_STROKE_FILL_PAD;
+
if (!obj) return EVAS_VG_GRADIENT_SPREAD_LAST;
- Efl_Canvas_Vg_Gradient_Data *gd = efl_data_scope_get(obj, MY_CLASS);
+ gd = efl_data_scope_get(obj, MY_CLASS);
if (!gd || !gd->gradient) return EVAS_VG_GRADIENT_SPREAD_LAST;
- Tvg_Stroke_Fill fill = TVG_STROKE_FILL_PAD;
tvg_gradient_get_spread(gd->gradient, &fill);
return (Evas_Vg_Gradient_Spread)fill;
-#else
- return (Evas_Vg_Gradient_Spread)efl_gfx_gradient_spread_get(obj);
-#endif
}
#include "efl_canvas_vg_gradient.eo.c"