From c5e35a7c4dd8b3350a8dddbb06b6b004c1d51c20 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 28 Jan 2015 23:53:52 +0100 Subject: [PATCH] evas: start properly implementing render_pre for Evas_VG_Node. Change-Id: I9978dbcdec0af5a613021cc0d6a9605a1252b283 --- src/lib/evas/canvas/evas_object_vg.c | 11 +- src/lib/evas/canvas/evas_vg_container.c | 29 ++++- src/lib/evas/canvas/evas_vg_container.eo | 1 + src/lib/evas/canvas/evas_vg_gradient.c | 12 +-- src/lib/evas/canvas/evas_vg_gradient_linear.c | 49 +++++++++ .../evas/canvas/evas_vg_gradient_linear.eo | 2 + src/lib/evas/canvas/evas_vg_gradient_radial.c | 50 +++++++++ .../evas/canvas/evas_vg_gradient_radial.eo | 2 + src/lib/evas/canvas/evas_vg_image.c | 11 ++ src/lib/evas/canvas/evas_vg_image.eo | 2 + src/lib/evas/canvas/evas_vg_private.h | 29 ++++- src/lib/evas/canvas/evas_vg_shape.c | 100 +++++++++++++----- src/lib/evas/canvas/evas_vg_shape.eo | 1 + 13 files changed, 256 insertions(+), 43 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_vg.c b/src/lib/evas/canvas/evas_object_vg.c index 397a3f646b..dba3c7a49f 100644 --- a/src/lib/evas/canvas/evas_object_vg.c +++ b/src/lib/evas/canvas/evas_object_vg.c @@ -1,6 +1,7 @@ #include "evas_common_private.h" #include "evas_private.h" +#include "evas_vg_private.h" #include "evas_vg_root_node.eo.h" #define MY_CLASS EVAS_VG_CLASS @@ -164,11 +165,17 @@ evas_object_vg_render(Evas_Object *eo_obj EINA_UNUSED, static void evas_object_vg_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, - void *type_private_data EINA_UNUSED) + void *type_private_data) { + Evas_VG_Data *vd = type_private_data; + Evas_Public_Data *e = obj->layer->evas; int is_v, was_v; + Ector_Surface *s; - // FIXME: call all modified Ector_Renderer prepare fct + // FIXME: handle damage only on changed renderer. + s = e->engine.func->ector_get(e->engine.data.output); + if (vd->root && s) + _evas_vg_render_pre(vd->root, s); /* dont pre-render the obj twice! */ if (obj->pre_render_done) return; diff --git a/src/lib/evas/canvas/evas_vg_container.c b/src/lib/evas/canvas/evas_vg_container.c index c4b7f389a4..20ac001f95 100644 --- a/src/lib/evas/canvas/evas_vg_container.c +++ b/src/lib/evas/canvas/evas_vg_container.c @@ -5,11 +5,38 @@ #define MY_CLASS EVAS_VG_CONTAINER_CLASS +static void +_evas_vg_container_render_pre(Eo *obj EINA_UNUSED, + Ector_Surface *s, + void *data, + Evas_VG_Node_Data *nd EINA_UNUSED) +{ + Evas_VG_Container_Data *pd = data; + Eina_List *l; + Eo *child; + + EINA_LIST_FOREACH(pd->children, l, child) + _evas_vg_render_pre(child, s); +} + static void _evas_vg_container_eo_base_constructor(Eo *obj, - Evas_VG_Container_Data *pd EINA_UNUSED) + Evas_VG_Container_Data *pd) { + Evas_VG_Node_Data *nd; + eo_do_super(obj, MY_CLASS, eo_constructor()); + + nd = eo_data_scope_get(obj, EVAS_VG_NODE_CLASS); + nd->render_pre = _evas_vg_container_render_pre; + nd->data = pd; +} + +static void +_evas_vg_container_eo_base_destructor(Eo *obj, + Evas_VG_Container_Data *pd EINA_UNUSED) +{ + eo_do_super(obj, MY_CLASS, eo_destructor()); } static Eina_Bool diff --git a/src/lib/evas/canvas/evas_vg_container.eo b/src/lib/evas/canvas/evas_vg_container.eo index 423a202bb1..0af3b00fc6 100644 --- a/src/lib/evas/canvas/evas_vg_container.eo +++ b/src/lib/evas/canvas/evas_vg_container.eo @@ -3,6 +3,7 @@ class Evas.VG_Container (Evas.VG_Node) eo_prefix: evas_vg_container; implements { Eo.Base.constructor; + Eo.Base.destructor; Evas.VG_Node.bound_get; } } diff --git a/src/lib/evas/canvas/evas_vg_gradient.c b/src/lib/evas/canvas/evas_vg_gradient.c index acca97f629..a63b636062 100644 --- a/src/lib/evas/canvas/evas_vg_gradient.c +++ b/src/lib/evas/canvas/evas_vg_gradient.c @@ -1,17 +1,9 @@ #include "evas_common_private.h" #include "evas_private.h" -#include - -typedef struct _Evas_VG_Gradient_Data Evas_VG_Gradient_Data; -struct _Evas_VG_Gradient_Data -{ - // FIXME: Later on we should deduplicate it somehow (Using Ector ?). - Efl_Graphics_Gradient_Stop *colors; - unsigned int colors_count; +#include "evas_vg_private.h" - Efl_Graphics_Gradient_Spread s; -}; +#include static void _evas_vg_gradient_efl_graphics_gradient_stop_set(Eo *obj EINA_UNUSED, diff --git a/src/lib/evas/canvas/evas_vg_gradient_linear.c b/src/lib/evas/canvas/evas_vg_gradient_linear.c index 035f6b1e29..156a5851ed 100644 --- a/src/lib/evas/canvas/evas_vg_gradient_linear.c +++ b/src/lib/evas/canvas/evas_vg_gradient_linear.c @@ -1,8 +1,12 @@ #include "evas_common_private.h" #include "evas_private.h" +#include "evas_vg_private.h" + #include +#define MY_CLASS EVAS_VG_GRADIENT_LINEAR_CLASS + typedef struct _Evas_VG_Gradient_Linear_Data Evas_VG_Gradient_Linear_Data; struct _Evas_VG_Gradient_Linear_Data { @@ -47,4 +51,49 @@ _evas_vg_gradient_linear_efl_graphics_gradient_linear_end_get(Eo *obj EINA_UNUSE if (y) *y = pd->end.y; } +static void +_evas_vg_gradient_linear_render_pre(Eo *obj, + Ector_Surface *s, + void *data, + Evas_VG_Node_Data *nd) +{ + Evas_VG_Gradient_Linear_Data *pd = data; + Evas_VG_Gradient_Data *gd = eo_data_scope_get(obj, EVAS_VG_GRADIENT_CLASS); + + if (!nd->renderer) + { + eo_do(s, nd->renderer = ector_surface_renderer_factory_new(ECTOR_RENDERER_GENERIC_GRADIENT_LINEAR_CLASS)); + } + + eo_do(nd->renderer, + ector_renderer_transformation_set(nd->m), + ector_renderer_origin_set(nd->x, nd->y), + ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a), + ector_renderer_visibility_set(nd->visibility), + efl_graphics_gradient_stop_set(gd->colors, gd->colors_count), + efl_graphics_gradient_spread_set(gd->s), + efl_graphics_gradient_linear_start_set(pd->start.x, pd->start.y), + efl_graphics_gradient_linear_end_set(pd->end.x, pd->end.y), + ector_renderer_prepare()); +} + +static void +_evas_vg_gradient_linear_eo_base_constructor(Eo *obj, + Evas_VG_Gradient_Linear_Data *pd) +{ + Evas_VG_Node_Data *nd; + + eo_do_super(obj, MY_CLASS, eo_constructor()); + + nd = eo_data_scope_get(obj, EVAS_VG_NODE_CLASS); + nd->render_pre = _evas_vg_gradient_linear_render_pre; + nd->data = pd; +} + +void +_evas_vg_gradient_linear_eo_base_destructor(Eo *obj, Evas_VG_Gradient_Linear_Data *pd EINA_UNUSED) +{ + eo_do_super(obj, MY_CLASS, eo_destructor()); +} + #include "evas_vg_gradient_linear.eo.c" diff --git a/src/lib/evas/canvas/evas_vg_gradient_linear.eo b/src/lib/evas/canvas/evas_vg_gradient_linear.eo index d513f10905..0ae1347d64 100644 --- a/src/lib/evas/canvas/evas_vg_gradient_linear.eo +++ b/src/lib/evas/canvas/evas_vg_gradient_linear.eo @@ -7,5 +7,7 @@ class Evas.VG_Gradient_Linear (Evas.VG_Gradient, Efl.Graphics.Gradient_Linear) Efl.Graphics.Gradient_Linear.start.get; Efl.Graphics.Gradient_Linear.end.set; Efl.Graphics.Gradient_Linear.end.get; + Eo.Base.constructor; + Eo.Base.destructor; } } diff --git a/src/lib/evas/canvas/evas_vg_gradient_radial.c b/src/lib/evas/canvas/evas_vg_gradient_radial.c index 0e21565c6d..c27430a340 100644 --- a/src/lib/evas/canvas/evas_vg_gradient_radial.c +++ b/src/lib/evas/canvas/evas_vg_gradient_radial.c @@ -1,6 +1,10 @@ #include "evas_common_private.h" #include "evas_private.h" +#include "evas_vg_private.h" + +#define MY_CLASS EVAS_VG_GRADIENT_RADIAL_CLASS + typedef struct _Evas_VG_Gradient_Radial_Data Evas_VG_Gradient_Radial_Data; struct _Evas_VG_Gradient_Radial_Data { @@ -61,4 +65,50 @@ _evas_vg_gradient_radial_efl_graphics_gradient_radial_focal_get(Eo *obj EINA_UNU if (y) *y = pd->focal.y; } +static void +_evas_vg_gradient_radial_render_pre(Eo *obj, + Ector_Surface *s, + void *data, + Evas_VG_Node_Data *nd) +{ + Evas_VG_Gradient_Radial_Data *pd = data; + Evas_VG_Gradient_Data *gd = eo_data_scope_get(obj, EVAS_VG_GRADIENT_CLASS); + + if (!nd->renderer) + { + eo_do(s, nd->renderer = ector_surface_renderer_factory_new(ECTOR_RENDERER_GENERIC_GRADIENT_RADIAL_CLASS)); + } + + eo_do(nd->renderer, + ector_renderer_transformation_set(nd->m), + ector_renderer_origin_set(nd->x, nd->y), + ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a), + ector_renderer_visibility_set(nd->visibility), + efl_graphics_gradient_stop_set(gd->colors, gd->colors_count), + efl_graphics_gradient_spread_set(gd->s), + efl_graphics_gradient_radial_center_set(pd->center.x, pd->center.y), + efl_graphics_gradient_radial_focal_set(pd->focal.x, pd->focal.y), + efl_graphics_gradient_radial_radius_set(pd->radius), + ector_renderer_prepare()); +} + +static void +_evas_vg_gradient_radial_eo_base_constructor(Eo *obj, Evas_VG_Gradient_Radial_Data *pd) +{ + Evas_VG_Node_Data *nd; + + eo_do_super(obj, MY_CLASS, eo_constructor()); + + nd = eo_data_scope_get(obj, EVAS_VG_NODE_CLASS); + nd->render_pre = _evas_vg_gradient_radial_render_pre; + nd->data = pd; +} + +static void +_evas_vg_gradient_radial_eo_base_destructor(Eo *obj, + Evas_VG_Gradient_Radial_Data *pd EINA_UNUSED) +{ + eo_do_super(obj, MY_CLASS, eo_destructor()); +} + #include "evas_vg_gradient_radial.eo.c" diff --git a/src/lib/evas/canvas/evas_vg_gradient_radial.eo b/src/lib/evas/canvas/evas_vg_gradient_radial.eo index a6bfe70abd..0a06ae932d 100644 --- a/src/lib/evas/canvas/evas_vg_gradient_radial.eo +++ b/src/lib/evas/canvas/evas_vg_gradient_radial.eo @@ -9,5 +9,7 @@ class Evas.VG_Gradient_Radial (Evas.VG_Gradient, Efl.Graphics.Gradient_Radial) Efl.Graphics.Gradient_Radial.radius.get; Efl.Graphics.Gradient_Radial.focal.set; Efl.Graphics.Gradient_Radial.focal.get; + Eo.Base.constructor; + Eo.Base.destructor; } } diff --git a/src/lib/evas/canvas/evas_vg_image.c b/src/lib/evas/canvas/evas_vg_image.c index 21a7bbe19f..d47b94e94c 100644 --- a/src/lib/evas/canvas/evas_vg_image.c +++ b/src/lib/evas/canvas/evas_vg_image.c @@ -59,5 +59,16 @@ _evas_vg_image_efl_file_file_get(Eo *obj, Evas_VG_Image_Data *pd, if (key) *key = pd->key; } +static void +_evas_vg_image_eo_base_constructor(Eo *obj, Evas_VG_Image_Data *pd) +{ + eo_error_set(obj); +} + +static void +_evas_vg_image_eo_base_destructor(Eo *obj, Evas_VG_Image_Data *pd) +{ + eo_error_set(obj); +} #include "evas_vg_image.eo.c" diff --git a/src/lib/evas/canvas/evas_vg_image.eo b/src/lib/evas/canvas/evas_vg_image.eo index 6ed670e93e..33fe0b0272 100644 --- a/src/lib/evas/canvas/evas_vg_image.eo +++ b/src/lib/evas/canvas/evas_vg_image.eo @@ -28,5 +28,7 @@ class Evas.VG_Image (Evas.VG_Node, Efl.File) implements { Efl.File.file.set; Efl.File.file.get; + Eo.Base.constructor; + Eo.Base.destructor; } } \ No newline at end of file diff --git a/src/lib/evas/canvas/evas_vg_private.h b/src/lib/evas/canvas/evas_vg_private.h index 6b83623517..7d8f0691f4 100644 --- a/src/lib/evas/canvas/evas_vg_private.h +++ b/src/lib/evas/canvas/evas_vg_private.h @@ -1,14 +1,19 @@ #ifndef EVAS_VG_PRIVATE_H_ # define EVAS_VG_PRIVATE_H_ +#include + typedef struct _Evas_VG_Node_Data Evas_VG_Node_Data; +typedef struct _Evas_VG_Container_Data Evas_VG_Container_Data; +typedef struct _Evas_VG_Gradient_Data Evas_VG_Gradient_Data; + struct _Evas_VG_Node_Data { Eina_Matrix3 *m; Evas_VG_Node *mask; + Ector_Renderer *renderer; - void (*render_pre)(void); - void (*render)(void); + void (*render_pre)(Eo *obj, Ector_Surface *s, void *data, Evas_VG_Node_Data *nd); void *data; double x, y; @@ -18,10 +23,28 @@ struct _Evas_VG_Node_Data Eina_Bool changed : 1; }; -typedef struct _Evas_VG_Container_Data Evas_VG_Container_Data; struct _Evas_VG_Container_Data { Eina_List *children; }; +struct _Evas_VG_Gradient_Data +{ + // FIXME: Later on we should deduplicate it somehow (Using Ector ?). + Efl_Graphics_Gradient_Stop *colors; + unsigned int colors_count; + + Efl_Graphics_Gradient_Spread s; +}; + +static inline void +_evas_vg_render_pre(Evas_VG_Node *child, Ector_Surface *s) +{ + Evas_VG_Node_Data *child_nd; + + // FIXME: Prevent infinite loop + child_nd = eo_data_scope_get(child, EVAS_VG_NODE_CLASS); + child_nd->render_pre(child, s, child_nd->data, child_nd); +} + #endif diff --git a/src/lib/evas/canvas/evas_vg_shape.c b/src/lib/evas/canvas/evas_vg_shape.c index b39a9efa06..9e67710f16 100644 --- a/src/lib/evas/canvas/evas_vg_shape.c +++ b/src/lib/evas/canvas/evas_vg_shape.c @@ -8,7 +8,7 @@ typedef struct _Evas_VG_Shape_Data Evas_VG_Shape_Data; struct _Evas_VG_Shape_Data { - Efl_Graphics_Path_Command *op; + Efl_Graphics_Path_Command *ops; double *points; Evas_VG_Node *fill; @@ -29,49 +29,30 @@ struct _Evas_VG_Shape_Data Efl_Graphics_Cap cap; Efl_Graphics_Join join; } stroke; - - unsigned int op_count; - unsigned int pts_counts; }; static Eina_Bool _evas_vg_shape_efl_graphics_shape_path_set(Eo *obj EINA_UNUSED, Evas_VG_Shape_Data *pd, - const Efl_Graphics_Path_Command *op, + const Efl_Graphics_Path_Command *ops, const double *points) { free(pd->points); pd->points = NULL; - free(pd->op); - pd->op = NULL; + free(pd->ops); + pd->ops = NULL; - return efl_graphics_path_dup(&pd->op, &pd->points, op, points); + return efl_graphics_path_dup(&pd->ops, &pd->points, ops, points); } static Eina_Bool -_evas_vg_shape_bounds_get(Eo *obj, Evas_VG_Shape_Data *pd, Eina_Rectangle *r) +_evas_vg_shape_evas_vg_node_bound_get(Eo *obj, + Evas_VG_Shape_Data *pd, + Eina_Rectangle *r) { - (void) obj; (void) pd; (void) r; return EINA_FALSE; } -static void -_evas_vg_shape_eo_base_constructor(Eo *obj, Evas_VG_Shape_Data *pd EINA_UNUSED) -{ - eo_do_super(obj, MY_CLASS, eo_constructor()); - pd->stroke.cap = EFL_GRAPHICS_CAP_BUTT; - pd->stroke.join = EFL_GRAPHICS_JOIN_MITER; - pd->stroke.scale = 1; - pd->stroke.a = 1; - pd->stroke.centered = 0.5; -} - -static void -_evas_vg_shape_eo_base_destructor(Eo *obj, Evas_VG_Shape_Data *pd EINA_UNUSED) -{ - eo_do_super(obj, MY_CLASS, eo_destructor()); -} - static void _evas_vg_shape_fill_set(Eo *obj EINA_UNUSED, Evas_VG_Shape_Data *pd, @@ -249,4 +230,69 @@ _evas_vg_shape_efl_graphics_shape_stroke_join_get(Eo *obj EINA_UNUSED, return pd->stroke.join; } +static void +_evas_vg_shape_render_pre(Eo *obj EINA_UNUSED, + Ector_Surface *s, + void *data, + Evas_VG_Node_Data *nd) +{ + Evas_VG_Shape_Data *pd = data; + + _evas_vg_render_pre(pd->fill, s); + _evas_vg_render_pre(pd->stroke.fill, s); + _evas_vg_render_pre(pd->stroke.marker, s); + _evas_vg_render_pre(nd->mask, s); + + if (!nd->renderer) + { + eo_do(s, nd->renderer = ector_surface_renderer_factory_new(ECTOR_RENDERER_GENERIC_SHAPE_CLASS)); + } + + eo_do(nd->renderer, + ector_renderer_transformation_set(nd->m), + ector_renderer_origin_set(nd->x, nd->y), + ector_renderer_color_set(nd->r, nd->g, nd->b, nd->a), + ector_renderer_visibility_set(nd->visibility), + ector_renderer_mask_set(nd->mask), + ector_renderer_shape_fill_set(pd->fill), + ector_renderer_shape_stroke_fill_set(pd->stroke.fill), + ector_renderer_shape_stroke_marker_set(pd->stroke.marker), + efl_graphics_shape_stroke_scale_set(pd->stroke.scale), + efl_graphics_shape_stroke_color_set(pd->stroke.r, + pd->stroke.g, + pd->stroke.b, + pd->stroke.a), + efl_graphics_shape_stroke_width_set(pd->stroke.width), + efl_graphics_shape_stroke_location_set(pd->stroke.centered), + efl_graphics_shape_stroke_dash_set(pd->stroke.dash, pd->stroke.dash_count), + efl_graphics_shape_stroke_cap_set(pd->stroke.cap), + efl_graphics_shape_stroke_join_set(pd->stroke.join), + efl_graphics_shape_path_set(pd->ops, pd->points), + ector_renderer_prepare()); +} + +static void +_evas_vg_shape_eo_base_constructor(Eo *obj, Evas_VG_Shape_Data *pd) +{ + Evas_VG_Node_Data *nd; + + eo_do_super(obj, MY_CLASS, eo_constructor()); + + pd->stroke.cap = EFL_GRAPHICS_CAP_BUTT; + pd->stroke.join = EFL_GRAPHICS_JOIN_MITER; + pd->stroke.scale = 1; + pd->stroke.a = 1; + pd->stroke.centered = 0.5; + + nd = eo_data_scope_get(obj, EVAS_VG_NODE_CLASS); + nd->render_pre = _evas_vg_shape_render_pre; + nd->data = pd; +} + +static void +_evas_vg_shape_eo_base_destructor(Eo *obj, Evas_VG_Shape_Data *pd EINA_UNUSED) +{ + eo_do_super(obj, MY_CLASS, eo_destructor()); +} + #include "evas_vg_shape.eo.c" diff --git a/src/lib/evas/canvas/evas_vg_shape.eo b/src/lib/evas/canvas/evas_vg_shape.eo index 0574b72118..41845b450e 100644 --- a/src/lib/evas/canvas/evas_vg_shape.eo +++ b/src/lib/evas/canvas/evas_vg_shape.eo @@ -40,6 +40,7 @@ class Evas.VG_Shape (Evas.VG_Node, Efl.Graphics.Shape) Efl.Graphics.Shape.stroke_cap; Efl.Graphics.Shape.stroke_join; Efl.Graphics.Shape.path_set; + Evas.VG_Node.bound_get; Eo.Base.constructor; Eo.Base.destructor; } -- 2.34.1