forked from enlightenment/efl
evas: start properly implementing render_pre for Evas_VG_Node.
This commit is contained in:
parent
621d3b5660
commit
6097178ec3
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue