ector: don't use eo parent relationship for accessing the surface.

This commit is contained in:
Cedric BAIL 2015-11-16 00:56:28 +01:00
parent 4f0ef04788
commit 9c3c402fd6
10 changed files with 126 additions and 106 deletions

View File

@ -58,15 +58,12 @@ _ector_cairo_extent_get(Efl_Gfx_Gradient_Spread s)
if (!Sym) return Error;
static inline void *
_ector_cairo_symbol_get(Eo *obj, const char *name)
_ector_cairo_symbol_get(Ector_Renderer_Generic_Base_Data *base,
const char *name)
{
Eo *parent;
void *sym;
eo_do(obj, parent = eo_parent_get());
if (!parent) return NULL;
eo_do(parent, sym = ector_cairo_surface_symbol_get(name));
eo_do(base->surface, sym = ector_cairo_surface_symbol_get(name));
return sym;
}
@ -74,15 +71,12 @@ extern void (*cairo_pattern_add_color_stop_rgba)(cairo_pattern_t *pattern, doubl
double red, double green, double blue, double alpha);
static inline void
_ector_renderer_cairo_gradient_prepare(Eo *obj,
cairo_pattern_t *pat,
_ector_renderer_cairo_gradient_prepare(cairo_pattern_t *pat,
Ector_Renderer_Generic_Gradient_Data *src,
unsigned int mul_col)
{
unsigned int i;
USE(obj, cairo_pattern_add_color_stop_rgba, );
for (i = 0; i < src->colors_count; i++)
{
int r,g,b,a;

View File

@ -62,11 +62,15 @@ _ector_cairo_surface_ector_generic_surface_renderer_factory_new(Eo *obj,
const Eo_Class *type)
{
if (type == ECTOR_RENDERER_GENERIC_SHAPE_MIXIN)
return eo_add(ECTOR_RENDERER_CAIRO_SHAPE_CLASS, obj);
return eo_add(ECTOR_RENDERER_CAIRO_SHAPE_CLASS, NULL,
ector_renderer_surface_set(obj));
else if (type == ECTOR_RENDERER_GENERIC_GRADIENT_LINEAR_MIXIN)
return eo_add(ECTOR_RENDERER_CAIRO_GRADIENT_LINEAR_CLASS, obj);
return eo_add(ECTOR_RENDERER_CAIRO_GRADIENT_LINEAR_CLASS, NULL,
ector_renderer_surface_set(obj));
else if (type == ECTOR_RENDERER_GENERIC_GRADIENT_RADIAL_MIXIN)
return eo_add(ECTOR_RENDERER_CAIRO_GRADIENT_RADIAL_CLASS, obj);
return eo_add(ECTOR_RENDERER_CAIRO_GRADIENT_RADIAL_CLASS, NULL,
ector_renderer_surface_set(obj));
ERR("Couldn't find class for type: %s\n", eo_class_name_get(type));
return NULL;
}

View File

@ -99,11 +99,7 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_prepare(Eo *obj, Ector_Re
{
if (!pd->parent)
{
Eo *parent;
eo_do(obj, parent = eo_parent_get());
if (!parent) return EINA_FALSE;
pd->parent = eo_data_xref(parent, ECTOR_CAIRO_SURFACE_CLASS, obj);
pd->parent = eo_data_xref(pd->generic->surface, ECTOR_CAIRO_SURFACE_CLASS, obj);
}
if (pd->generic->m)
{
@ -186,22 +182,31 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj EINA_UNUSED,
static Eo *
_ector_renderer_cairo_base_eo_base_constructor(Eo *obj, Ector_Renderer_Cairo_Base_Data *pd EINA_UNUSED)
{
USE(obj, cairo_matrix_init, NULL);
USE(obj, cairo_translate, NULL);
USE(obj, cairo_set_source_rgba, NULL);
USE(obj, cairo_transform, NULL);
USE(obj, cairo_set_operator, NULL);
USE(obj, cairo_new_path, NULL);
USE(obj, cairo_rectangle, NULL);
USE(obj, cairo_clip, NULL);
USE(obj, cairo_device_to_user, NULL);
USE(obj, cairo_matrix_init_identity, NULL);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_BASE_CLASS, obj = eo_constructor());
if (!obj) return NULL;
pd->generic = eo_data_xref(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS, obj);
return obj;
}
static Eo_Base *
_ector_renderer_cairo_base_eo_base_finalize(Eo *obj, Ector_Renderer_Cairo_Base_Data *pd)
{
eo_do_super(obj, ECTOR_RENDERER_CAIRO_BASE_CLASS, obj = eo_finalize());
if (!obj) return NULL;
USE(pd->generic, cairo_matrix_init, NULL);
USE(pd->generic, cairo_translate, NULL);
USE(pd->generic, cairo_set_source_rgba, NULL);
USE(pd->generic, cairo_transform, NULL);
USE(pd->generic, cairo_set_operator, NULL);
USE(pd->generic, cairo_new_path, NULL);
USE(pd->generic, cairo_rectangle, NULL);
USE(pd->generic, cairo_clip, NULL);
USE(pd->generic, cairo_device_to_user, NULL);
USE(pd->generic, cairo_matrix_init_identity, NULL);
cairo_matrix_init_identity(&identity);
return obj;
@ -210,14 +215,14 @@ _ector_renderer_cairo_base_eo_base_constructor(Eo *obj, Ector_Renderer_Cairo_Bas
static void
_ector_renderer_cairo_base_eo_base_destructor(Eo *obj, Ector_Renderer_Cairo_Base_Data *pd)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
eo_data_xunref(base->surface, pd->parent, obj);
eo_data_xunref(obj, pd->generic, obj);
free(pd->m);
eo_do(obj, parent = eo_parent_get());
eo_data_xunref(parent, pd->parent, obj);
eo_data_xunref(obj, pd->generic, obj);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_BASE_CLASS, eo_destructor());
}

View File

@ -16,6 +16,7 @@ abstract Ector.Renderer.Cairo.Base (Ector.Renderer.Generic.Base)
Ector.Renderer.Generic.Base.color.set;
Ector.Renderer.Generic.Base.color.get;
Eo.Base.constructor;
Eo.Base.finalize;
Eo.Base.destructor;
}
}

View File

@ -27,7 +27,7 @@ struct _Ector_Renderer_Cairo_Gradient_Linear_Data
};
static cairo_pattern_t *
_ector_renderer_cairo_gradient_linear_prepare(Eo *obj,
_ector_renderer_cairo_gradient_linear_prepare(Eo *obj EINA_UNUSED,
Ector_Renderer_Generic_Gradient_Linear_Data *gld,
Ector_Renderer_Generic_Gradient_Data *gd,
unsigned int mul_col)
@ -37,7 +37,7 @@ _ector_renderer_cairo_gradient_linear_prepare(Eo *obj,
pat = cairo_pattern_create_linear(gld->start.x, gld->start.y,
gld->end.x, gld->end.y);
if (!pat) return NULL;
_ector_renderer_cairo_gradient_prepare(obj, pat, gd, mul_col);
_ector_renderer_cairo_gradient_prepare(pat, gd, mul_col);
cairo_pattern_set_extend(pat, _ector_cairo_extent_get(gd->s));
@ -52,11 +52,10 @@ _ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_prepare(Eo *ob
if (!pd->parent)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
eo_do(obj, parent = eo_parent_get());
if (!parent) return EINA_FALSE;
pd->parent = eo_data_xref(parent, ECTOR_CAIRO_SURFACE_CLASS, obj);
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
pd->parent = eo_data_xref(base->surface, ECTOR_CAIRO_SURFACE_CLASS, obj);
}
return EINA_FALSE;
@ -131,19 +130,25 @@ _ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_bounds_get(Eo
}
static Eo_Base *
_ector_renderer_cairo_gradient_linear_eo_base_constructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Linear_Data *pd EINA_UNUSED)
_ector_renderer_cairo_gradient_linear_eo_base_finalize(Eo *obj, Ector_Renderer_Cairo_Gradient_Linear_Data *pd EINA_UNUSED)
{
USE(obj, cairo_set_source, NULL);
USE(obj, cairo_pattern_destroy, NULL);
USE(obj, cairo_rectangle, NULL);
USE(obj, cairo_fill, NULL);
USE(obj, cairo_pattern_destroy, NULL);
USE(obj, cairo_set_source, NULL);
USE(obj, cairo_pattern_set_extend, NULL);
USE(obj, cairo_pattern_create_linear, NULL);
Ector_Renderer_Generic_Base_Data *base;
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_LINEAR_CLASS, obj = eo_finalize());
if (!obj) return NULL;
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
USE(base, cairo_set_source, NULL);
USE(base, cairo_pattern_destroy, NULL);
USE(base, cairo_rectangle, NULL);
USE(base, cairo_fill, NULL);
USE(base, cairo_pattern_destroy, NULL);
USE(base, cairo_set_source, NULL);
USE(base, cairo_pattern_set_extend, NULL);
USE(base, cairo_pattern_create_linear, NULL);
USE(base, cairo_pattern_add_color_stop_rgba, NULL);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_LINEAR_CLASS, obj = eo_constructor());
return obj;
}
@ -151,10 +156,10 @@ static void
_ector_renderer_cairo_gradient_linear_eo_base_destructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Linear_Data *pd)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
eo_do(obj, parent = eo_parent_get());
eo_data_xunref(parent, pd->parent, obj);
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
eo_data_xunref(base->surface, pd->parent, obj);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_LINEAR_CLASS, eo_destructor());
}

View File

@ -8,7 +8,7 @@ class Ector.Renderer.Cairo.Gradient_Linear (Ector.Renderer.Cairo.Base, Ector.Ren
Ector.Renderer.Generic.Base.bounds_get;
Ector.Renderer.Generic.Base.crc.get;
Ector.Renderer.Cairo.Base.fill;
Eo.Base.constructor;
Eo.Base.finalize;
Eo.Base.destructor;
Efl.Gfx.Gradient.Base.stop.set;
}

View File

@ -38,18 +38,17 @@ _ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_prepare(Eo *ob
if (!pd->parent)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
eo_do(obj, parent = eo_parent_get());
if (!parent) return EINA_FALSE;
pd->parent = eo_data_xref(parent, ECTOR_CAIRO_SURFACE_CLASS, obj);
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
pd->parent = eo_data_xref(base->surface, ECTOR_CAIRO_SURFACE_CLASS, obj);
}
return EINA_FALSE;
}
static cairo_pattern_t *
_ector_renderer_cairo_gradient_radial_prepare(Eo *obj,
_ector_renderer_cairo_gradient_radial_prepare(Eo *obj EINA_UNUSED,
Ector_Renderer_Generic_Gradient_Radial_Data *grd,
Ector_Renderer_Generic_Gradient_Data *gd,
unsigned int mul_col)
@ -60,7 +59,7 @@ _ector_renderer_cairo_gradient_radial_prepare(Eo *obj,
grd->radial.x, grd->radial.y, grd->radius);
if (!pat) return NULL;
_ector_renderer_cairo_gradient_prepare(obj, pat, gd, mul_col);
_ector_renderer_cairo_gradient_prepare(pat, gd, mul_col);
cairo_pattern_set_extend(pat, _ector_cairo_extent_get(gd->s));
@ -136,19 +135,24 @@ _ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_bounds_get(Eo
}
static Eo_Base *
_ector_renderer_cairo_gradient_radial_eo_base_constructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Radial_Data *pd EINA_UNUSED)
_ector_renderer_cairo_gradient_radial_eo_base_finalize(Eo *obj, Ector_Renderer_Cairo_Gradient_Radial_Data *pd EINA_UNUSED)
{
USE(obj, cairo_set_source, NULL);
USE(obj, cairo_pattern_destroy, NULL);
USE(obj, cairo_arc, NULL);
USE(obj, cairo_fill, NULL);
USE(obj, cairo_set_source, NULL);
USE(obj, cairo_pattern_destroy, NULL);
USE(obj, cairo_pattern_set_extend, NULL);
USE(obj, cairo_pattern_create_radial, NULL);
Ector_Renderer_Generic_Base_Data *base;
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_RADIAL_CLASS, obj = eo_finalize());
if (!obj) return NULL;
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
USE(base, cairo_set_source, NULL);
USE(base, cairo_pattern_destroy, NULL);
USE(base, cairo_arc, NULL);
USE(base, cairo_fill, NULL);
USE(base, cairo_set_source, NULL);
USE(base, cairo_pattern_destroy, NULL);
USE(base, cairo_pattern_set_extend, NULL);
USE(base, cairo_pattern_create_radial, NULL);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_RADIAL_CLASS, obj = eo_constructor());
return obj;
}
@ -156,10 +160,10 @@ static void
_ector_renderer_cairo_gradient_radial_eo_base_destructor(Eo *obj,
Ector_Renderer_Cairo_Gradient_Radial_Data *pd)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
eo_do(obj, parent = eo_parent_get());
eo_data_xunref(parent, pd->parent, obj);
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
eo_data_xunref(base->surface, pd->parent, obj);
eo_do_super(obj, ECTOR_RENDERER_CAIRO_GRADIENT_RADIAL_CLASS, eo_destructor());
}

View File

@ -9,7 +9,7 @@ class Ector.Renderer.Cairo.Gradient_Radial (Ector.Renderer.Cairo.Base, Ector.Ren
Ector.Renderer.Generic.Base.crc.get;
Ector.Renderer.Cairo.Base.fill;
Eo.Base.destructor;
Eo.Base.constructor;
Eo.Base.finalize;
Efl.Gfx.Gradient.Base.stop.set;
}
}

View File

@ -95,12 +95,10 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_prepare(Eo *obj, Ector_R
// shouldn't that be moved to the cairo base object
if (!pd->parent)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
eo_do(obj, parent = eo_parent_get());
if (!parent) return EINA_FALSE;
pd->parent = eo_data_xref(parent, ECTOR_CAIRO_SURFACE_CLASS, obj);
if (!pd->parent) return EINA_FALSE;
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
pd->parent = eo_data_xref(base->surface, ECTOR_CAIRO_SURFACE_CLASS, obj);
}
eo_do(obj, efl_gfx_shape_path_get(&cmds, &pts));
@ -238,28 +236,7 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_bounds_get(Eo *obj,
Eo *
_ector_renderer_cairo_shape_eo_base_constructor(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd)
{
USE(obj, cairo_path_destroy, NULL);
USE(obj, cairo_restore, NULL);
USE(obj, cairo_fill, NULL);
USE(obj, cairo_set_dash, NULL);
USE(obj, cairo_fill_preserve, NULL);
USE(obj, cairo_set_source_rgba, NULL);
USE(obj, cairo_stroke, NULL);
USE(obj, cairo_set_line_width, NULL);
USE(obj, cairo_set_line_cap, NULL);
USE(obj, cairo_set_line_join, NULL);
USE(obj, cairo_new_path, NULL);
USE(obj, cairo_append_path, NULL);
USE(obj, cairo_save, NULL);
USE(obj, cairo_copy_path, NULL);
USE(obj, cairo_close_path, NULL);
USE(obj, cairo_curve_to, NULL);
USE(obj, cairo_line_to, NULL);
USE(obj, cairo_new_path, NULL);
USE(obj, cairo_path_destroy, NULL);
USE(obj, cairo_move_to, NULL);
obj = eo_do_super_ret(obj, ECTOR_RENDERER_CAIRO_SHAPE_CLASS, obj, eo_constructor());
eo_do_super(obj, ECTOR_RENDERER_CAIRO_SHAPE_CLASS, obj = eo_constructor());
if (!obj) return NULL;
pd->shape = eo_data_xref(obj, ECTOR_RENDERER_GENERIC_SHAPE_MIXIN, obj);
@ -268,19 +245,48 @@ _ector_renderer_cairo_shape_eo_base_constructor(Eo *obj, Ector_Renderer_Cairo_Sh
eo_do(obj,
eo_event_callback_add(EFL_GFX_PATH_CHANGED, _ector_renderer_cairo_shape_path_changed, pd));
return obj;
}
static Eo_Base *
_ector_renderer_cairo_shape_eo_base_finalize(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd)
{
eo_do_super(obj, ECTOR_RENDERER_CAIRO_SHAPE_CLASS, obj = eo_finalize());
if (!obj) return NULL;
USE(pd->base, cairo_path_destroy, NULL);
USE(pd->base, cairo_restore, NULL);
USE(pd->base, cairo_fill, NULL);
USE(pd->base, cairo_set_dash, NULL);
USE(pd->base, cairo_fill_preserve, NULL);
USE(pd->base, cairo_set_source_rgba, NULL);
USE(pd->base, cairo_stroke, NULL);
USE(pd->base, cairo_set_line_width, NULL);
USE(pd->base, cairo_set_line_cap, NULL);
USE(pd->base, cairo_set_line_join, NULL);
USE(pd->base, cairo_new_path, NULL);
USE(pd->base, cairo_append_path, NULL);
USE(pd->base, cairo_save, NULL);
USE(pd->base, cairo_copy_path, NULL);
USE(pd->base, cairo_close_path, NULL);
USE(pd->base, cairo_curve_to, NULL);
USE(pd->base, cairo_line_to, NULL);
USE(pd->base, cairo_move_to, NULL);
return obj;
}
void
_ector_renderer_cairo_shape_eo_base_destructor(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd)
{
Eo *parent;
Ector_Renderer_Generic_Base_Data *base;
//FIXME, As base class destructor can't call destructor of mixin class.
// call explicit API to free shape data.
eo_do(obj, efl_gfx_shape_reset());
eo_do(obj, parent = eo_parent_get());
eo_data_xunref(parent, pd->parent, obj);
base = eo_data_scope_get(obj, ECTOR_RENDERER_GENERIC_BASE_CLASS);
eo_data_xunref(base->surface, pd->parent, obj);
eo_data_xunref(obj, pd->shape, obj);
eo_data_xunref(obj, pd->base, obj);

View File

@ -9,6 +9,7 @@ class Ector.Renderer.Cairo.Shape (Ector.Renderer.Cairo.Base, Ector.Renderer.Gene
Ector.Renderer.Generic.Base.crc.get;
Ector.Renderer.Cairo.Base.fill;
Eo.Base.constructor;
Eo.Base.finalize;
Eo.Base.destructor;
}
}