path: Implement gsk_path_to_cairo() using foreach()
This commit is contained in:
committed by
Matthias Clasen
parent
268efbd5a6
commit
d9a79c0a2f
110
gsk/gskpath.c
110
gsk/gskpath.c
@@ -45,8 +45,6 @@ struct _GskContourClass
|
||||
GskPathFlags (* get_flags) (const GskContour *contour);
|
||||
void (* print) (const GskContour *contour,
|
||||
GString *string);
|
||||
void (* to_cairo) (const GskContour *contour,
|
||||
cairo_t *cr);
|
||||
gboolean (* get_bounds) (const GskContour *contour,
|
||||
graphene_rect_t *bounds);
|
||||
gboolean (* foreach) (const GskContour *contour,
|
||||
@@ -157,17 +155,6 @@ gsk_rect_contour_print (const GskContour *contour,
|
||||
g_string_append (string, " z");
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_rect_contour_to_cairo (const GskContour *contour,
|
||||
cairo_t *cr)
|
||||
{
|
||||
const GskRectContour *self = (const GskRectContour *) contour;
|
||||
|
||||
cairo_rectangle (cr,
|
||||
self->x, self->y,
|
||||
self->width, self->height);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gsk_rect_contour_get_bounds (const GskContour *contour,
|
||||
graphene_rect_t *rect)
|
||||
@@ -301,7 +288,6 @@ static const GskContourClass GSK_RECT_CONTOUR_CLASS =
|
||||
gsk_contour_get_size_default,
|
||||
gsk_rect_contour_get_flags,
|
||||
gsk_rect_contour_print,
|
||||
gsk_rect_contour_to_cairo,
|
||||
gsk_rect_contour_get_bounds,
|
||||
gsk_rect_contour_foreach,
|
||||
gsk_rect_contour_init_measure,
|
||||
@@ -440,44 +426,6 @@ gsk_standard_contour_print (const GskContour *contour,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_standard_contour_to_cairo (const GskContour *contour,
|
||||
cairo_t *cr)
|
||||
{
|
||||
const GskStandardContour *self = (const GskStandardContour *) contour;
|
||||
gsize i;
|
||||
|
||||
cairo_new_sub_path (cr);
|
||||
|
||||
for (i = 0; i < self->n_ops; i ++)
|
||||
{
|
||||
graphene_point_t *pt = &self->points[self->ops[i].point];
|
||||
|
||||
switch (self->ops[i].op)
|
||||
{
|
||||
case GSK_PATH_MOVE:
|
||||
cairo_move_to (cr, pt[0].x, pt[0].y);
|
||||
break;
|
||||
|
||||
case GSK_PATH_CLOSE:
|
||||
cairo_close_path (cr);
|
||||
break;
|
||||
|
||||
case GSK_PATH_LINE:
|
||||
cairo_line_to (cr, pt[1].x, pt[1].y);
|
||||
break;
|
||||
|
||||
case GSK_PATH_CURVE:
|
||||
cairo_curve_to (cr, pt[1].x, pt[1].y, pt[2].x, pt[2].y, pt[3].x, pt[3].y);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rect_add_point (graphene_rect_t *rect,
|
||||
const graphene_point_t *point)
|
||||
@@ -691,7 +639,6 @@ static const GskContourClass GSK_STANDARD_CONTOUR_CLASS =
|
||||
gsk_standard_contour_get_size,
|
||||
gsk_standard_contour_get_flags,
|
||||
gsk_standard_contour_print,
|
||||
gsk_standard_contour_to_cairo,
|
||||
gsk_standard_contour_get_bounds,
|
||||
gsk_standard_contour_foreach,
|
||||
gsk_standard_contour_init_measure,
|
||||
@@ -944,6 +891,38 @@ gsk_path_to_string (GskPath *self)
|
||||
return g_string_free (string, FALSE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gsk_path_to_cairo_add_op (GskPathOperation op,
|
||||
const graphene_point_t *pts,
|
||||
gsize n_pts,
|
||||
gpointer cr)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case GSK_PATH_MOVE:
|
||||
cairo_move_to (cr, pts[0].x, pts[0].y);
|
||||
break;
|
||||
|
||||
case GSK_PATH_CLOSE:
|
||||
cairo_close_path (cr);
|
||||
break;
|
||||
|
||||
case GSK_PATH_LINE:
|
||||
cairo_line_to (cr, pts[1].x, pts[1].y);
|
||||
break;
|
||||
|
||||
case GSK_PATH_CURVE:
|
||||
cairo_curve_to (cr, pts[1].x, pts[1].y, pts[2].x, pts[2].y, pts[3].x, pts[3].y);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gsk_path_to_cairo:
|
||||
* @self: a `GskPath`
|
||||
@@ -962,15 +941,13 @@ void
|
||||
gsk_path_to_cairo (GskPath *self,
|
||||
cairo_t *cr)
|
||||
{
|
||||
gsize i;
|
||||
|
||||
g_return_if_fail (self != NULL);
|
||||
g_return_if_fail (cr != NULL);
|
||||
|
||||
for (i = 0; i < self->n_contours; i++)
|
||||
{
|
||||
self->contours[i]->klass->to_cairo (self->contours[i], cr);
|
||||
}
|
||||
gsk_path_foreach_with_tolerance (self,
|
||||
cairo_get_tolerance (cr),
|
||||
gsk_path_to_cairo_add_op,
|
||||
cr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1076,14 +1053,23 @@ gsk_path_foreach (GskPath *self,
|
||||
GskPathForeachFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
gsize i;
|
||||
|
||||
g_return_val_if_fail (self != NULL, FALSE);
|
||||
g_return_val_if_fail (func, FALSE);
|
||||
|
||||
return gsk_path_foreach_with_tolerance (self, GSK_PATH_TOLERANCE_DEFAULT, func, user_data);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gsk_path_foreach_with_tolerance (GskPath *self,
|
||||
double tolerance,
|
||||
GskPathForeachFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
gsize i;
|
||||
|
||||
for (i = 0; i < self->n_contours; i++)
|
||||
{
|
||||
if (!gsk_contour_foreach (self->contours[i], GSK_PATH_TOLERANCE_DEFAULT, func, user_data))
|
||||
if (!gsk_contour_foreach (self->contours[i], tolerance, func, user_data))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,10 @@ G_BEGIN_DECLS
|
||||
#define GSK_PATH_TOLERANCE_DEFAULT (0.1)
|
||||
|
||||
gsize gsk_path_get_n_contours (GskPath *path);
|
||||
gboolean gsk_path_foreach_with_tolerance (GskPath *self,
|
||||
double tolerance,
|
||||
GskPathForeachFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
gpointer gsk_contour_init_measure (GskPath *path,
|
||||
gsize i,
|
||||
|
||||
Reference in New Issue
Block a user