evas: start properly implementing render_pre for Evas_VG_Node.

This commit is contained in:
Cedric BAIL 2015-04-03 16:22:58 +02:00
parent 621d3b5660
commit 6097178ec3
13 changed files with 257 additions and 44 deletions

View File

@ -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;

View File

@ -6,10 +6,37 @@
#define MY_CLASS EVAS_VG_CONTAINER_CLASS
static void
_evas_vg_container_eo_base_constructor(Eo *obj,
Evas_VG_Container_Data *pd EINA_UNUSED)
_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)
{
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

View File

@ -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;
}
}

View File

@ -1,18 +1,10 @@
#include "evas_common_private.h"
#include "evas_private.h"
#include "evas_vg_private.h"
#include <strings.h>
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;
Efl_Graphics_Gradient_Spread s;
};
static void
_evas_vg_gradient_efl_graphics_gradient_stop_set(Eo *obj EINA_UNUSED,
Evas_VG_Gradient_Data *pd,

View File

@ -1,8 +1,12 @@
#include "evas_common_private.h"
#include "evas_private.h"
#include "evas_vg_private.h"
#include <strings.h>
#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"

View File

@ -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;
}
}

View File

@ -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"

View File

@ -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;
}
}

View File

@ -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"

View File

@ -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;
}
}

View File

@ -1,14 +1,19 @@
#ifndef EVAS_VG_PRIVATE_H_
# define EVAS_VG_PRIVATE_H_
#include <Ector.h>
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

View File

@ -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"

View File

@ -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;
}