static GimpBezierDesc * gimp_vectors_real_make_bezier (const GimpVectors *vectors) { GimpStroke *stroke; GArray *cmd_array; GimpBezierDesc *ret_bezdesc = NULL; cmd_array = g_array_new (FALSE, FALSE, sizeof (cairo_path_data_t)); for (stroke = gimp_vectors_stroke_get_next (vectors, NULL); stroke; stroke = gimp_vectors_stroke_get_next (vectors, stroke)) { GimpBezierDesc *bezdesc = gimp_stroke_make_bezier (stroke); if (bezdesc) { cmd_array = g_array_append_vals (cmd_array, bezdesc->data, bezdesc->num_data); gimp_bezier_desc_free (bezdesc); } } if (cmd_array->len > 0) ret_bezdesc = gimp_bezier_desc_new ((cairo_path_data_t *) cmd_array->data, cmd_array->len); g_array_free (cmd_array, FALSE); return ret_bezdesc; }
GimpBezierDesc * gimp_bezier_desc_copy (const GimpBezierDesc *desc) { g_return_val_if_fail (desc != NULL, NULL); return gimp_bezier_desc_new (g_memdup (desc->data, desc->num_data * sizeof (cairo_path_data_t)), desc->num_data); }
GimpBezierDesc * gimp_bezier_desc_new_from_bound_segs (BoundSeg *bound_segs, gint n_bound_segs, gint n_bound_groups) { GArray *path_data; GimpVector2 *points; gint n_points; gint seg; gint i; g_return_val_if_fail (bound_segs != NULL, NULL); g_return_val_if_fail (n_bound_segs > 0, NULL); path_data = g_array_new (FALSE, FALSE, sizeof (cairo_path_data_t)); points = g_new0 (GimpVector2, n_bound_segs + 4); seg = 0; n_points = 0; points[n_points].x = (gdouble) (bound_segs[0].x1); points[n_points].y = (gdouble) (bound_segs[0].y1); n_points++; for (i = 0; i < n_bound_groups; i++) { while (bound_segs[seg].x1 != -1 || bound_segs[seg].x2 != -1 || bound_segs[seg].y1 != -1 || bound_segs[seg].y2 != -1) { points[n_points].x = (gdouble) (bound_segs[seg].x1); points[n_points].y = (gdouble) (bound_segs[seg].y1); n_points++; seg++; } /* Close the stroke points up */ points[n_points] = points[0]; n_points++; add_polyline (path_data, points, n_points, TRUE); n_points = 0; seg++; points[n_points].x = (gdouble) (bound_segs[seg].x1); points[n_points].y = (gdouble) (bound_segs[seg].y1); n_points++; } g_free (points); return gimp_bezier_desc_new ((cairo_path_data_t *) g_array_free (path_data, FALSE), path_data->len); }