#include "spiroentrypoints.h"
void SpiroCPsToBezier(spiro_cp *spiros,int n,int isclosed,bezctx *bc) {
SpiroCPsToBezier2(spiros,n,SPIRO_RETRO_VER1,isclosed,bc);
}
void TaggedSpiroCPsToBezier(spiro_cp *spiros,bezctx *bc) {
TaggedSpiroCPsToBezier2(spiros,SPIRO_RETRO_VER1,bc);
}
int SpiroCPsToBezier0(spiro_cp *spiros,int n,int isclosed,bezctx *bc) {
return SpiroCPsToBezier2(spiros,n,SPIRO_RETRO_VER1,isclosed,bc);
}
int TaggedSpiroCPsToBezier0(spiro_cp *spiros,bezctx *bc) {
return TaggedSpiroCPsToBezier2(spiros,SPIRO_RETRO_VER1,bc);
}
void SpiroCPsToBezier1(spiro_cp *spiros,int n,int isclosed,bezctx *bc,int *done) {
*done = SpiroCPsToBezier2(spiros,n,SPIRO_RETRO_VER1,isclosed,bc);
}
void TaggedSpiroCPsToBezier1(spiro_cp *spiros,bezctx *bc,int *done) {
*done = TaggedSpiroCPsToBezier2(spiros,SPIRO_RETRO_VER1,bc);
}
int SpiroCPsToBezier2(spiro_cp *spiros,int n,int ncq,int isclosed,bezctx *bc) {
double dm[6];
spiro_seg *s;
if ( n<=0 || ncq<0 ) return 0;
if ( n > 1 && (ncq & SPIRO_REVERSE_SRC) && spiroreverse(spiros,n) )
return 0;
if ( isclosed )
s = run_spiro0(spiros,dm,ncq,n);
else {
char oldty_start = spiros[0].ty;
char oldty_end = spiros[n-1].ty;
spiros[0].ty = '{';
spiros[n-1].ty = '}';
s = run_spiro0(spiros,dm,ncq,n);
spiros[n-1].ty = oldty_end;
spiros[0].ty = oldty_start;
}
if (s) {
spiro_to_bpath0(spiros,s,dm,ncq,n,bc);
free_spiro(s);
return 1;
}
return 0;
}
int TaggedSpiroCPsToBezier2(spiro_cp *spiros,int ncq,bezctx *bc) {
double dm[6];
spiro_seg *s;
int n;
for ( n=0; spiros[n].ty!='z' && spiros[n].ty!='}'; ++n );
if ( spiros[n].ty == '}' ) ++n;
if ( n<=0 || ncq<0 ) return 0;
if ( n > 1 && (ncq & SPIRO_REVERSE_SRC) && spiroreverse(spiros,n) )
return 0;
s = run_spiro0(spiros,dm,ncq,n);
if (s) {
spiro_to_bpath0(spiros,s,dm,ncq,n,bc);
free_spiro(s);
return 1;
}
return 0;
}