128 lines
2.9 KiB
C++
128 lines
2.9 KiB
C++
/* 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 <config.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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;
|
|
}
|