CAIRO_LINE_JOIN_BEVEL
} cairo_line_join_t;
+typedef enum _cairo_fill_rule {
+ CAIRO_FILL_RULE_WINDING,
+ CAIRO_FILL_RULE_EVEN_ODD
+} cairo_fill_rule_t;
+
static void (*cairo_move_to)(cairo_t *cr, double x, double y) = NULL;
static void (*cairo_line_to)(cairo_t *cr, double x, double y) = NULL;
static void (*cairo_curve_to)(cairo_t *cr,
static void (*cairo_restore)(cairo_t *cr) = NULL;
static void (*cairo_set_dash) (cairo_t *cr, const double *dashes, int num_dashes, double offset) = NULL;
+static void (*cairo_set_fill_rule) (cairo_t *cr, cairo_fill_rule_t fill_rule);
typedef struct _Ector_Renderer_Cairo_Shape_Data Ector_Renderer_Cairo_Shape_Data;
struct _Ector_Renderer_Cairo_Shape_Data
{
int r, g, b, a;
unsigned i;
+ Efl_Gfx_Fill_Rule fill_rule;
if (pd->path == NULL) return EINA_FALSE;
cairo_new_path(pd->parent->cairo);
cairo_append_path(pd->parent->cairo, pd->path);
+ eo_do(obj, fill_rule = efl_gfx_shape_fill_rule_get());
+ if (fill_rule == EFL_GFX_FILL_RULE_ODD_EVEN)
+ cairo_set_fill_rule(pd->parent->cairo, CAIRO_FILL_RULE_EVEN_ODD);
+ else
+ cairo_set_fill_rule(pd->parent->cairo, CAIRO_FILL_RULE_WINDING);
+
if (pd->shape->fill)
eo_do(pd->shape->fill, ector_renderer_cairo_base_fill(mul_col));
_ector_renderer_cairo_shape_eo_base_constructor(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd)
{
eo_do_super(obj, ECTOR_RENDERER_CAIRO_SHAPE_CLASS, obj = eo_constructor());
+
if (!obj) return NULL;
pd->public_shape = eo_data_xref(obj, EFL_GFX_SHAPE_MIXIN, obj);
USE(pd->base, cairo_curve_to, NULL);
USE(pd->base, cairo_line_to, NULL);
USE(pd->base, cairo_move_to, NULL);
+ USE(pd->base, cairo_set_fill_rule, NULL);
return obj;
}
const Efl_Gfx_Path_Command *cmds = NULL;
const double *pts = NULL;
Eina_Bool close_path;
+ Efl_Gfx_Fill_Rule fill_rule;
Outline *outline, *dash_outline;
- eo_do(obj, efl_gfx_shape_path_get(&cmds, &pts));
+ eo_do(obj,
+ efl_gfx_shape_path_get(&cmds, &pts),
+ fill_rule = efl_gfx_shape_fill_rule_get());
if (cmds && (_generate_stroke_data(pd) || _generate_shape_data(pd)))
{
outline = _outline_create();
close_path = _generate_outline(cmds, pts, outline);
+ if (fill_rule == EFL_GFX_FILL_RULE_ODD_EVEN)
+ outline->ft_outline.flags = SW_FT_OUTLINE_EVEN_ODD_FILL;
+ else
+ outline->ft_outline.flags = SW_FT_OUTLINE_NONE; // default is winding fill
+
_outline_transform(outline, pd->base->m);
//shape data generation