vg_init_object(&path->base, vg_current_context(), VG_OBJECT_PATH);
path->caps = capabilities & VG_PATH_CAPABILITY_ALL;
- vg_context_add_object(vg_current_context(), VG_OBJECT_PATH, path);
+ vg_context_add_object(vg_current_context(), &path->base);
path->datatype = dt;
path->scale = scale;
void path_destroy(struct path *p)
{
- vg_context_remove_object(vg_current_context(), VG_OBJECT_PATH, p);
+ vg_context_remove_object(vg_current_context(), &p->base);
array_destroy(p->segments);
array_destroy(p->control_points);
if (p->stroked.path)
path_destroy(p->stroked.path);
+ vg_free_object(&p->base);
+
FREE(p);
}
void *coords = (VGfloat *)p->control_points->data;
struct array *array;
+ memset(data, 0, sizeof(data));
+
if (p->fill_polys.polygon_array.array)
{
if (memcmp( &p->fill_polys.matrix,
}
break;
case VG_SCUBIC_TO: {
- VGfloat x0, y0, x1, y1, x2, y2, x3, y3;
+ VGfloat x1, y1, x2, y2, x3, y3;
data_at(&pd->coords, pd->path, 0, 4, data);
- x0 = pd->ox;
- y0 = pd->oy;
x1 = 2*pd->ox-pd->px;
y1 = 2*pd->oy-pd->py;
x2 = data[0];
default:
abort();
assert(!"Unknown segment!");
+ return 0;
}
}
mat,
&paint_matrix)) {
/* First the fill */
+ shader_set_surface_matrix(ctx->shader, mat);
shader_set_paint(ctx->shader, ctx->state.vg.fill_paint);
shader_set_paint_matrix(ctx->shader, &paint_matrix);
shader_bind(ctx->shader);
- path_fill(p, mat);
+ path_fill(p);
}
if ((paintModes & VG_STROKE_PATH) &&
* taking place."*/
if (ctx->state.vg.stroke.line_width.f <= 0)
return;
+ shader_set_surface_matrix(ctx->shader, mat);
shader_set_paint(ctx->shader, ctx->state.vg.stroke_paint);
shader_set_paint_matrix(ctx->shader, &paint_matrix);
shader_bind(ctx->shader);
- path_stroke(p, mat);
+ path_stroke(p);
}
}
-void path_fill(struct path *p, struct matrix *mat)
+void path_fill(struct path *p)
{
struct vg_context *ctx = vg_current_context();
+ struct matrix identity;
+
+ matrix_load_identity(&identity);
+
{
- struct polygon_array *polygon_array = path_get_fill_polygons(p, mat);
+ struct polygon_array *polygon_array = path_get_fill_polygons(p, &identity);
struct array *polys = polygon_array->array;
if (!polygon_array || !polys || !polys->num_elements) {
}
}
-void path_stroke(struct path *p, struct matrix *mat)
+void path_stroke(struct path *p)
{
struct vg_context *ctx = vg_current_context();
VGFillRule old_fill = ctx->state.vg.fill_rule;
if (stroke && !path_is_empty(stroke)) {
ctx->state.vg.fill_rule = VG_NON_ZERO;
- path_fill(stroke, mat);
+ path_fill(stroke);
ctx->state.vg.fill_rule = old_fill;
}