1 #include "evas_common_private.h"
2 #include "evas_private.h"
3 
4 #include "evas_vg_private.h"
5 
6 #include <strings.h>
7 
8 #define MY_CLASS EFL_CANVAS_VG_GRADIENT_CLASS
9 
10 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)11 _efl_canvas_vg_gradient_efl_gfx_gradient_stop_set(Eo *obj EINA_UNUSED,
12                                                 Efl_Canvas_Vg_Gradient_Data *pd,
13                                                 const Efl_Gfx_Gradient_Stop *colors,
14                                                 unsigned int length)
15 {
16    pd->colors = realloc(pd->colors, length * sizeof(Efl_Gfx_Gradient_Stop));
17    if (!pd->colors)
18      {
19         pd->colors_count = 0;
20         return ;
21      }
22 
23    memcpy(pd->colors, colors, length * sizeof(Efl_Gfx_Gradient_Stop));
24    pd->colors_count = length;
25 
26    efl_canvas_vg_node_change(obj);
27 }
28 
29 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)30 _efl_canvas_vg_gradient_efl_gfx_gradient_stop_get(const Eo *obj EINA_UNUSED,
31                                                 Efl_Canvas_Vg_Gradient_Data *pd,
32                                                 const Efl_Gfx_Gradient_Stop **colors,
33                                                 unsigned int *length)
34 {
35    if (colors) *colors = pd->colors;
36    if (length) *length = pd->colors_count;
37 }
38 
39 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)40 _efl_canvas_vg_gradient_efl_gfx_gradient_spread_set(Eo *obj EINA_UNUSED,
41                                                   Efl_Canvas_Vg_Gradient_Data *pd,
42                                                   Efl_Gfx_Gradient_Spread spread)
43 {
44    pd->spread = spread;
45 
46    efl_canvas_vg_node_change(obj);
47 }
48 
49 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)50 _efl_canvas_vg_gradient_efl_gfx_gradient_spread_get(const Eo *obj EINA_UNUSED,
51                                                   Efl_Canvas_Vg_Gradient_Data *pd)
52 {
53    return pd->spread;
54 }
55 
56 static Eina_Bool
_efl_canvas_vg_gradient_efl_gfx_path_interpolate(Eo * obj,Efl_Canvas_Vg_Gradient_Data * pd,const Efl_VG * from,const Efl_VG * to,double pos_map)57 _efl_canvas_vg_gradient_efl_gfx_path_interpolate(Eo *obj,
58                                          Efl_Canvas_Vg_Gradient_Data *pd,
59                                          const Efl_VG *from, const Efl_VG *to,
60                                          double pos_map)
61 {
62    Efl_Canvas_Vg_Gradient_Data *fromd, *tod;
63    Efl_Gfx_Gradient_Stop *colors;
64    unsigned int i;
65    double from_map;
66    Eina_Bool r;
67 
68    r = efl_gfx_path_interpolate(efl_super(obj, EFL_CANVAS_VG_GRADIENT_CLASS), from, to, pos_map);
69 
70    fromd = efl_data_scope_get(from, EFL_CANVAS_VG_GRADIENT_CLASS);
71    tod = efl_data_scope_get(to, EFL_CANVAS_VG_GRADIENT_CLASS);
72    from_map = 1.0 - pos_map;
73 
74    if (!r) return EINA_FALSE;
75    if (fromd->colors_count != tod->colors_count) return EINA_FALSE;
76 
77    colors = realloc(pd->colors, sizeof (Efl_Gfx_Gradient_Stop) * tod->colors_count);
78    if (!colors) return EINA_FALSE;
79 
80    pd->colors = colors;
81 
82 #define INTP(Pd, From, To, I, Member, From_Map, Pos_Map)                \
83    Pd->colors[I].Member = From->colors[I].Member * From_Map + To->colors[I].Member * Pos_Map
84 
85    for (i = 0; i < fromd->colors_count; i++)
86      {
87         INTP(pd, fromd, tod, i, offset, from_map, pos_map);
88         INTP(pd, fromd, tod, i, r, from_map, pos_map);
89         INTP(pd, fromd, tod, i, g, from_map, pos_map);
90         INTP(pd, fromd, tod, i, b, from_map, pos_map);
91         INTP(pd, fromd, tod, i, a, from_map, pos_map);
92      }
93 
94 #undef INTP
95 
96    return EINA_TRUE;
97 }
98 
99 static void
_efl_canvas_vg_gradient_efl_object_destructor(Eo * obj,Efl_Canvas_Vg_Gradient_Data * pd)100 _efl_canvas_vg_gradient_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Gradient_Data *pd)
101 {
102    if (pd->colors) free(pd->colors);
103 
104    efl_destructor(efl_super(obj, MY_CLASS));
105 }
106 
107 
108 EOLIAN static Efl_VG *
_efl_canvas_vg_gradient_efl_duplicate_duplicate(const Eo * obj,Efl_Canvas_Vg_Gradient_Data * pd)109 _efl_canvas_vg_gradient_efl_duplicate_duplicate(const Eo *obj, Efl_Canvas_Vg_Gradient_Data *pd)
110 
111 {
112    Efl_VG *cn = NULL;
113 
114    cn = efl_duplicate(efl_super(obj, MY_CLASS));
115    efl_gfx_gradient_stop_set(cn, pd->colors, pd->colors_count);
116    efl_gfx_gradient_spread_set(cn, pd->spread);
117    return cn;
118 }
119 
120 EAPI void
evas_vg_gradient_stop_set(Evas_Vg_Gradient * obj,const Evas_Vg_Gradient_Stop * colors,unsigned int length)121 evas_vg_gradient_stop_set(Evas_Vg_Gradient *obj, const Evas_Vg_Gradient_Stop *colors, unsigned int length)
122 {
123    efl_gfx_gradient_stop_set(obj, (const Efl_Gfx_Gradient_Stop *)colors, length);
124 }
125 
126 EAPI void
evas_vg_gradient_stop_get(Evas_Vg_Gradient * obj,const Evas_Vg_Gradient_Stop ** colors,unsigned int * length)127 evas_vg_gradient_stop_get(Evas_Vg_Gradient *obj, const Evas_Vg_Gradient_Stop **colors, unsigned int *length)
128 {
129    efl_gfx_gradient_stop_get(obj, (const Efl_Gfx_Gradient_Stop **)colors, length);
130 }
131 
132 EAPI void
evas_vg_gradient_spread_set(Evas_Vg_Gradient * obj,Evas_Vg_Gradient_Spread s)133 evas_vg_gradient_spread_set(Evas_Vg_Gradient *obj, Evas_Vg_Gradient_Spread s)
134 {
135    efl_gfx_gradient_spread_set(obj, (Efl_Gfx_Gradient_Spread)s);
136 }
137 
138 EAPI Evas_Vg_Gradient_Spread
evas_vg_gradient_spread_get(Evas_Vg_Gradient * obj)139 evas_vg_gradient_spread_get(Evas_Vg_Gradient *obj)
140 {
141    return (Evas_Vg_Gradient_Spread)efl_gfx_gradient_spread_get(obj);
142 }
143 
144 #include "efl_canvas_vg_gradient.eo.c"
145