summaryrefslogtreecommitdiff
path: root/potrace/curve.cpp
blob: 1cb9f0389d1618f5f54622ec4eb7c4353862c3c7 (plain)
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
116
117
118
119
120
121
122
/* 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 <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;
}