1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/* Copyright (C) 2001-2007 Peter Selinger.
This file is part of Potrace. It is free software and it is covered
by the GNU General Public License. See the file COPYING for details. */
/* $Id: curve.c 147 2007-04-09 00:44:09Z selinger $ */
/* private part of the path and curve data structures */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include "potracelib.h"
#include "lists.h"
#include "curve.h"
#define SAFE_MALLOC(var, n, typ) \
if ((var = (typ *)malloc((n)*sizeof(typ))) == NULL) goto malloc_error
/* ---------------------------------------------------------------------- */
/* allocate and free path objects */
path_t *path_new(void)
{
path_t *p = NULL;
privpath_t *priv = NULL;
SAFE_MALLOC(p, 1, path_t);
memset(p, 0, sizeof(path_t));
SAFE_MALLOC(priv, 1, privpath_t);
memset(priv, 0, sizeof(privpath_t));
p->priv = priv;
return p;
malloc_error:
free(p);
free(priv);
return NULL;
}
/* free the members of the given curve structure. Leave errno unchanged. */
static void privcurve_free_members(privcurve_t * curve)
{
free(curve->tag);
free(curve->c);
free(curve->vertex);
free(curve->alpha);
free(curve->alpha0);
free(curve->beta);
}
/* free a path. Leave errno untouched. */
void path_free(path_t * p)
{
if (p) {
if (p->priv) {
free(p->priv->pt);
free(p->priv->lon);
free(p->priv->sums);
free(p->priv->po);
privcurve_free_members(&p->priv->curve);
privcurve_free_members(&p->priv->ocurve);
}
free(p->priv);
/* do not free p->fcurve ! */
}
free(p);
}
/* free a pathlist, leaving errno untouched. */
void pathlist_free(path_t * plist)
{
path_t *p;
list_forall_unlink(p, plist) {
path_free(p);
}
}
/* ---------------------------------------------------------------------- */
/* initialize and finalize curve structures */
typedef dpoint_t dpoint3_t[3];
/* initialize the members of the given curve structure to size m.
Return 0 on success, 1 on error with errno set. */
int privcurve_init(privcurve_t * curve, int n)
{
memset(curve, 0, sizeof(privcurve_t));
curve->n = n;
SAFE_MALLOC(curve->tag, n, int);
SAFE_MALLOC(curve->c, n, dpoint3_t);
SAFE_MALLOC(curve->vertex, n, dpoint_t);
SAFE_MALLOC(curve->alpha, n, double);
SAFE_MALLOC(curve->alpha0, n, double);
SAFE_MALLOC(curve->beta, n, double);
return 0;
malloc_error:
free(curve->tag);
free(curve->c);
free(curve->vertex);
free(curve->alpha);
free(curve->alpha0);
free(curve->beta);
return 1;
}
/* copy private to public curve structure */
void privcurve_to_curve(privcurve_t * pc, potrace_curve_t * c)
{
c->n = pc->n;
c->tag = pc->tag;
c->c = pc->c;
}
|