Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}