void SSRegenerateFromSpiros(SplineSet *spl) { SplineSet *temp; if ( spl->spiro_cnt<=1 ) return; if ( !has_spiro) return; SplineSetBeziersClear(spl); temp = SpiroCP2SplineSet(spl->spiros); if ( temp!=NULL ) { spl->first = temp->first; spl->last = temp->last; chunkfree(temp,sizeof(SplineSet)); } else { /* didn't converge... or something */ int i; SplinePoint *sp, *last; last = spl->first = SplinePointCreate(spl->spiros[0].x, spl->spiros[0].y); for ( i=1; i<spl->spiro_cnt; ++i ) { sp = SplinePointCreate(spl->spiros[i].x, spl->spiros[i].y); SplineMake3(last,sp); last = sp; } if ( SPIRO_SPL_OPEN(spl)) spl->last = last; else { SplineMake3(last,spl->first); spl->last = spl->first; } } spl->beziers_need_optimizer = true; }
void SSRegenerateFromSpiros(SplineSet * spl) { /* Regenerate an updated SplineSet from SpiroCPs after edits are done. */ if (spl->spiro_cnt <= 1 || !has_spiro) return; SplineSet *temp=SpiroCP2SplineSet(spl->spiros); if (temp != NULL) { /* Regenerated new SplineSet. Discard old copy. Keep new copy. */ SplineSetBeziersClear(spl); spl->first=temp->first; spl->last=temp->last; chunkfree(temp, sizeof(SplineSet)); } else { /* Didn't converge... or something ...therefore let's fake-it. */ int i; SplinePoint *sp, *first, *last; if ((last=first = SplinePointCreate(spl->spiros[0].x, spl->spiros[0].y))==NULL) return; for (i=1; i < spl->spiro_cnt; ++i) { if ((sp=SplinePointCreate(spl->spiros[i].x, spl->spiros[i].y))) { SplineMake3(last, sp); last=sp; } else break; /* ...have problem, but keep what we got so far */ } /* dump the prior SplineSet and now show this line-art instead */ SplineSetBeziersClear(spl); spl->first=first; if (SPIRO_SPL_OPEN(spl)) spl->last=last; else { SplineMake3(last, spl->first); spl->last=spl->first; } } spl->beziers_need_optimizer=true; }