/* Copyright (C) 2001-2017 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. */ /* private part of the path and curve data structures */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "curve.h" #include "lists.h" #include "potracelib.h" #define SAFE_CALLOC( var, n, typ ) \ if( ( var = (typ*) calloc( n, sizeof( typ ) ) ) == NULL ) \ goto calloc_error /* ---------------------------------------------------------------------- */ /* allocate and free path objects */ path_t* path_new( void ) { path_t* p = NULL; privpath_t* priv = NULL; SAFE_CALLOC( p, 1, path_t ); memset( p, 0, sizeof( path_t ) ); SAFE_CALLOC( priv, 1, privpath_t ); memset( priv, 0, sizeof( privpath_t ) ); p->priv = priv; return p; calloc_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_CALLOC( curve->tag, n, int ); SAFE_CALLOC( curve->c, n, dpoint3_t ); SAFE_CALLOC( curve->vertex, n, dpoint_t ); SAFE_CALLOC( curve->alpha, n, double ); SAFE_CALLOC( curve->alpha0, n, double ); SAFE_CALLOC( curve->beta, n, double ); return 0; calloc_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; }