SplineSet *SpiroCP2SplineSet(spiro_cp *spiros) { int n; int any = 0; spiro_cp *nspiros; SplineSet *ss; int lastty = 0; if ( spiros==NULL ) return( NULL ); for ( n=0; spiros[n].ty!=SPIRO_END; ++n ) if ( SPIRO_SELECTED(&spiros[n]) ) ++any; if ( n==0 ) return( NULL ); if ( n==1 ) { ss = chunkalloc(sizeof(SplineSet)); ss->first = ss->last = SplinePointCreate(spiros[0].x,spiros[0].y); } else { bezctx *bc = new_bezctx_ff(); if ( (spiros[0].ty&0x7f)=='{' ) { lastty = spiros[n-1].ty; spiros[n-1].ty = '}'; } if ( !any ) { #if _LIBSPIRO_FUN if ( TaggedSpiroCPsToBezier0(spiros,bc)==0 ) { return( NULL ); } #else TaggedSpiroCPsToBezier(spiros,bc); #endif } else { nspiros = galloc((n+1)*sizeof(spiro_cp)); memcpy(nspiros,spiros,(n+1)*sizeof(spiro_cp)); for ( n=0; nspiros[n].ty!=SPIRO_END; ++n ) nspiros[n].ty &= ~0x80; #if _LIBSPIRO_FUN if ( TaggedSpiroCPsToBezier0(nspiros,bc)==0 ) { free(nspiros); return( NULL ); } #else TaggedSpiroCPsToBezier(nspiros,bc); #endif free(nspiros); } ss = bezctx_ff_close(bc); if ( (spiros[0].ty&0x7f)=='{' ) spiros[n-1].ty = lastty; } ss->spiros = spiros; ss->spiro_cnt = ss->spiro_max = n+1; SPLCatagorizePoints(ss); return( ss ); }
SplinePointList *CVAnySelPointList(CharView *cv) { /* if there is exactly one point selected and it is on an open splineset */ /* and it is one of the endpoints of the splineset, then return that */ /* splineset */ SplinePointList *spl, *found=NULL; Spline *spline, *first; int i; for ( spl= cv->b.layerheads[cv->b.drawmode]->splines; spl!=NULL; spl=spl->next ) { if ( cv->b.sc->inspiro && hasspiro()) { for ( i = 0; i<spl->spiro_cnt-1; ++i ) { if ( SPIRO_SELECTED(&spl->spiros[i])) { /* Only interesting if the single selection is at the */ /* start/end of an open contour */ if (( i!=0 && i!=spl->spiro_cnt-2 ) || !SPIRO_SPL_OPEN(spl)) return( NULL ); else if ( found==NULL ) found = spl; else return( NULL ); } } } else { if ( spl->first->selected ) { if ( found!=NULL ) return( NULL ); /* At least two points */ if ( spl->first->prev!=NULL ) return( NULL ); /* Not an open splineset */ found = spl; } first = NULL; for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { if ( spline->to->selected ) { if ( found!=NULL ) return( NULL ); if ( spline->to->next!=NULL ) return( NULL ); /* Selected point is not at end of a splineset */ found = spl; } if ( first==NULL ) first = spline; } } } return( found ); }
int CVAnySelPoint(CharView *cv,SplinePoint **sp, spiro_cp **cp) { /* if there is exactly one point selected */ SplinePointList *spl; Spline *spline, *first; SplinePoint *found = NULL; spiro_cp *foundcp = NULL; int i; *sp = NULL; *cp = NULL; if ( cv->b.sc->inspiro && hasspiro()) { for ( spl= cv->b.layerheads[cv->b.drawmode]->splines; spl!=NULL; spl=spl->next ) { for ( i=0; i<spl->spiro_cnt-1; ++i ) if ( SPIRO_SELECTED( &spl->spiros[i]) ) { if ( foundcp ) return( false ); foundcp = &spl->spiros[i]; } } *cp = foundcp; return( foundcp!=NULL ); } else { for ( spl= cv->b.layerheads[cv->b.drawmode]->splines; spl!=NULL; spl=spl->next ) { if ( spl->first->selected ) { if ( found!=NULL ) return( false ); /* At least two points */ found = spl->first; } first = NULL; for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { if ( spline->to->selected ) { if ( found!=NULL ) return( false ); found = spline->to; } if ( first==NULL ) first = spline; } } *sp = found; return( found!=NULL ); } }
SplineSet *SpiroCP2SplineSet(spiro_cp *spiros) { /* Create a SplineSet from the given spiros_code_points.*/ int n; int any = 0; SplineSet *ss; int lastty = 0; if ( spiros==NULL ) return( NULL ); for ( n=0; spiros[n].ty!=SPIRO_END; ++n ) if ( SPIRO_SELECTED(&spiros[n]) ) ++any; if ( n==0 ) return( NULL ); if ( n==1 ) { /* Spiro only haS 1 code point sofar (no conversion needed yet) */ if ( (ss=chunkalloc(sizeof(SplineSet)))==NULL || \ (ss->first=ss->last=SplinePointCreate(spiros[0].x,spiros[0].y))==NULL ) { chunkfree(ss,sizeof(SplineSet)); return( NULL ); } } else { /* Spiro needs to be converted to bezier curves using libspiro. */ bezctx *bc; if ( (bc=new_bezctx_ff())==NULL ) return( NULL ); if ( (spiros[0].ty&0x7f)=='{' ) { lastty = spiros[n-1].ty; spiros[n-1].ty = '}'; } if ( !any ) { #if _LIBSPIRO_FUN if ( TaggedSpiroCPsToBezier0(spiros,bc)==0 ) { if ( lastty ) spiros[n-1].ty = lastty; free(bc); return( NULL ); } #else TaggedSpiroCPsToBezier(spiros,bc); #endif } else { int i; spiro_cp *nspiros; if ( (nspiros=malloc((n+1)*sizeof(spiro_cp)))==NULL ) { if ( lastty ) spiros[n-1].ty = lastty; free(bc); return( NULL ); } memcpy(nspiros,spiros,(n+1)*sizeof(spiro_cp)); for ( i=0; nspiros[i].ty!=SPIRO_END; ++i ) nspiros[i].ty &= ~0x80; #if _LIBSPIRO_FUN if ( TaggedSpiroCPsToBezier0(nspiros,bc)==0 ) { if ( lastty ) spiros[n-1].ty = lastty; free(nspiros); free(bc); return( NULL ); } #else TaggedSpiroCPsToBezier(nspiros,bc); #endif free(nspiros); } if ( lastty ) spiros[n-1].ty = lastty; if ( (ss=bezctx_ff_close(bc))==NULL ) return( NULL ); } ss->spiros = spiros; ss->spiro_cnt = ss->spiro_max = n+1; SPLCatagorizePoints(ss); return( ss ); }
int CVOneThingSel(CharView *cv, SplinePoint **sp, SplinePointList **_spl, RefChar **ref, ImageList **img, AnchorPoint **ap, spiro_cp **scp) { /* if there is exactly one thing selected return it */ SplinePointList *spl, *found=NULL; Spline *spline; SplinePoint *foundsp=NULL; RefChar *refs, *foundref=NULL; ImageList *imgs, *foundimg=NULL; AnchorPoint *aps, *foundap=NULL; spiro_cp *foundcp = NULL; int i; *sp = NULL; *_spl=NULL; *ref=NULL; *img = NULL; *scp = NULL; if ( ap ) *ap = NULL; for ( spl= cv->b.layerheads[cv->b.drawmode]->splines; spl!=NULL; spl=spl->next ) { if ( !cv->b.sc->inspiro || !hasspiro()) { if ( spl->first->selected ) { if ( found!=NULL ) return( 0 ); /* At least two points */ found = spl; foundsp = spl->first; } for ( spline = spl->first->next; spline!=NULL ; spline=spline->to->next ) { if ( spline->to==spl->first ) break; if ( spline->to->selected ) { if ( found!=NULL ) return( 0 ); found = spl; foundsp = spline->to; } } } else { for ( i=0; i<spl->spiro_cnt-1; ++i ) { if ( SPIRO_SELECTED(&spl->spiros[i])) { if ( found ) return( 0 ); found = spl; foundcp = &spl->spiros[i]; } } } } *sp = foundsp; *scp = foundcp; *_spl = found; if ( cv->b.drawmode!=dm_grid ) { for ( refs=cv->b.layerheads[cv->b.drawmode]->refs; refs!=NULL; refs = refs->next ) { if ( refs->selected ) { if ( found!=NULL || foundref!=NULL ) return( 0 ); foundref = refs; } } *ref = foundref; if ( cv->showanchor && ap!=NULL ) { for ( aps=cv->b.sc->anchor; aps!=NULL; aps=aps->next ) { if ( aps->selected ) { if ( found!=NULL || foundref!=NULL || foundap!=NULL ) return( 0 ); foundap = aps; } } *ap = foundap; } } for ( imgs=cv->b.layerheads[cv->b.drawmode]->images; imgs!=NULL; imgs = imgs->next ) { if ( imgs->selected ) { if ( found!=NULL || foundimg!=NULL ) return( 0 ); foundimg = imgs; } } *img = foundimg; if ( found ) return( foundimg==NULL && foundref==NULL && foundap==NULL ); else if ( foundref || foundimg || foundap ) return( true ); return( false ); }
static void CVMouseDownSpiroPoint(CharView *cv, GEvent *event) { SplineSet *sel, *ss; SplineChar *sc = cv->b.sc; spiro_cp *base, *cp; int base_index, cp_index, i; char ty = (cv->active_tool==cvt_curve?SPIRO_G4: cv->active_tool==cvt_hvcurve?SPIRO_G2: cv->active_tool==cvt_corner?SPIRO_CORNER: cv->active_tool==cvt_tangent?SPIRO_LEFT: /*cv->active_tool==cvt_pen?*/SPIRO_RIGHT); cv->active_spl = NULL; cv->active_sp = NULL; sel = CVAnySelPointList(cv); if ( sel!=NULL ) { if ( SPIRO_SELECTED(&sel->spiros[0]) ) base_index = 0; else base_index = sel->spiro_cnt-2; base = &sel->spiros[base_index]; if ( base==cv->p.spiro ) return; /* We clicked on the active point, that's a no-op */ } CVPreserveState(&cv->b); CVClearSel(cv); if ( sel!=NULL ) { if ( (cp = cv->p.spiro)!=NULL ) cp_index = cp-cv->p.spl->spiros; cv->lastselcp = base; ss = sel; if ( base_index!=sel->spiro_cnt-2 ) { SplineSetReverse(sel); base = &sel->spiros[sel->spiro_cnt-2]; if ( cv->p.spl==sel ) { cp_index = sel->spiro_cnt-2-cp_index; cp = &sel->spiros[cp_index]; } } if ( cp==NULL || (cp_index!=0 && cp_index!=cv->p.spl->spiro_cnt-2) || cp==base || !SPIRO_SPL_OPEN(cv->p.spl)) { /* Add a new point */ if ( sel->spiro_cnt>=sel->spiro_max ) sel->spiros = realloc(sel->spiros,(sel->spiro_max += 10)*sizeof(spiro_cp)); cp = &sel->spiros[sel->spiro_cnt-1]; cp[1] = cp[0]; /* Move the final 'z' */ cp->x = cv->p.cx; cp->y = cv->p.cy; cp->ty = ty; SPIRO_DESELECT(cp-1); ++sel->spiro_cnt; } else if ( cv->p.spl==sel ) { /* Close the current spline set */ sel->spiros[0].ty = ty; cv->joinvalid = true; cv->joincp = *cp; SPIRO_DESELECT(&cv->joincp); } else { /* Merge two spline sets */ SplinePoint *sp = cp_index==0 ? cv->p.spl->first : cv->p.spl->last; SplinePoint *basesp = base_index==0 ? sel->first : sel->last; cv->joincp = *cp; SPIRO_DESELECT(&cv->joincp); CVMergeSPLS(cv,ss,basesp,sp); } } else if ( cv->p.spline!=NULL ) { /* Add an intermediate point on an already existing spline */ ss = cv->p.spl; if ( ss->spiro_cnt>=ss->spiro_max ) ss->spiros = realloc(ss->spiros,(ss->spiro_max += 10)*sizeof(spiro_cp)); for ( i=ss->spiro_cnt-1; i>cv->p.spiro_index; --i ) ss->spiros[i+1] = ss->spiros[i]; ++ss->spiro_cnt; cp = &ss->spiros[cv->p.spiro_index+1]; cp->x = cv->p.cx; cp->y = cv->p.cy; cp->ty = ty; ss = cv->p.spl; cv->joinvalid = true; cv->joincp = *cp; SPIRO_DESELECT(&cv->joincp); } else { /* A new point on a new (open) contour */ ss = chunkalloc(sizeof(SplineSet)); ss->next = cv->b.layerheads[cv->b.drawmode]->splines; cv->b.layerheads[cv->b.drawmode]->splines = ss; ss->spiros = malloc((ss->spiro_max=10)*sizeof(spiro_cp)); cp = &ss->spiros[0]; cp->x = cv->p.cx; cp->y = cv->p.cy; cp->ty = SPIRO_OPEN_CONTOUR; cp[1].x = cp[1].y = 0; cp[1].ty = 'z'; ss->spiro_cnt = 2; } SPIRO_SELECT(cp); SSRegenerateFromSpiros(ss); cv->active_spl = ss; cv->active_cp = cp; CVSetCharChanged(cv,true); CVInfoDraw(cv,cv->gw); SCUpdateAll(sc); }
int CVOneContourSel(CharView *cv, SplinePointList **_spl, RefChar **ref, ImageList **img) { /* if there is exactly one contour/image/reg selected return it */ SplinePointList *spl, *found=NULL; Spline *spline; RefChar *refs, *foundref=NULL; ImageList *imgs, *foundimg=NULL; int i; *_spl=NULL; *ref=NULL; *img = NULL; for ( spl= cv->b.layerheads[cv->b.drawmode]->splines; spl!=NULL; spl=spl->next ) { if ( !cv->b.sc->inspiro || !hasspiro()) { if ( spl->first->selected ) { if ( found!=NULL && found!=spl ) return( 0 ); /* At least two contours */ found = spl; } for ( spline = spl->first->next; spline!=NULL ; spline=spline->to->next ) { if ( spline->to==spl->first ) break; if ( spline->to->selected ) { if ( found!=NULL && found!=spl ) return( 0 ); found = spl; } } } else { for ( i=0; i<spl->spiro_cnt-1; ++i ) { if ( SPIRO_SELECTED(&spl->spiros[i])) { if ( found!=NULL && found!=spl ) return( 0 ); found = spl; } } } } *_spl = found; if ( cv->b.drawmode==dm_fore ) { for ( refs=cv->b.layerheads[cv->b.drawmode]->refs; refs!=NULL; refs = refs->next ) { if ( refs->selected ) { if ( found!=NULL || foundref!=NULL ) return( 0 ); foundref = refs; } } *ref = foundref; } for ( imgs=cv->b.layerheads[cv->b.drawmode]->images; imgs!=NULL; imgs = imgs->next ) { if ( imgs->selected ) { if ( found!=NULL || foundimg!=NULL ) return( 0 ); foundimg = imgs; } } *img = foundimg; if ( found ) return( foundimg==NULL && foundref==NULL ); else if ( foundref || foundimg ) return( true ); return( false ); }