static void SCShiftAllBy(SplineChar *sc,int xd, int yd) { /* If they change the left/right side-bearing, I think that means everything */ /* should be shifted over */ SplineSet *ss; SplinePoint *sp; RefChar *ref; if ( xd==0 && yd==0 ) return; for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { for ( sp=ss->first; sp!=NULL ; ) { if ( sp->ttfindex!=0xffff && sp->ttfindex!=0xfffe ) { sp->me.x += xd; sp->me.y += yd; } if ( sp->nextcpindex!=0xffff && sp->nextcpindex!=0xfffe ) { sp->nextcp.x += xd; sp->nextcp.y += yd; if ( sp->next!=NULL ) sp->next->to->prevcp = sp->nextcp; } if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp == ss->first ) break; } } for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { ref->transform[4] += xd; ref->transform[5] += yd; SCReinstanciateRefChar(sc,ref,ly_fore); } }
static void RedoRefs(SplineFont *sf,SplineChar *sc,int layer) { RefChar *refs; sc->ticked2 = true; for ( refs=sc->layers[layer].refs; refs!=NULL; refs=refs->next ) { if ( refs->sc->ticked && !refs->sc->ticked2 ) RedoRefs(sf,refs->sc,layer); SCReinstanciateRefChar(sc,refs,layer); } }
char *MMBlendChar(MMSet *mm, int gid) { char *ret; RefChar *ref; if ( gid>=mm->normal->glyphcnt ) return( _("The different instances of this mm have a different number of glyphs") ); ret = _MMBlendChar(mm,gid); if ( mm->normal->glyphs[gid]!=NULL ) { SplineChar *sc = mm->normal->glyphs[gid]; for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { SCReinstanciateRefChar(sc,ref,ly_fore); SCMakeDependent(sc,ref->sc); } } return(ret); }
static void VaryGlyph(SplineChar *sc,int *points, int *xdeltas, int *ydeltas, int pcnt) { /* A character contains either composites or contours */ int i,j; RefChar *ref; SplineSet *ss; SplinePoint *sp; Spline *s, *first; if ( points[0]==ALL_POINTS ) { if ( sc->layers[ly_fore].refs!=NULL ) { for ( i=0, ref=sc->layers[ly_fore].refs; ref!=NULL; ++i, ref=ref->next ) { if ( xdeltas[i]!=0 || ydeltas[i]!=0 ) { ref->transform[4] += xdeltas[i]; ref->transform[5] += ydeltas[i]; SCReinstanciateRefChar(sc,ref,ly_fore); } } } else { for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { for ( sp=ss->first; sp!=NULL ; ) { if ( sp->ttfindex!=0xffff && sp->ttfindex!=0xfffe ) { sp->me.x += xdeltas[sp->ttfindex]; sp->me.y += ydeltas[sp->ttfindex]; } if ( sp->nextcpindex!=0xffff && sp->nextcpindex!=0xfffe ) { sp->nextcp.x += xdeltas[sp->nextcpindex]; sp->nextcp.y += ydeltas[sp->nextcpindex]; if ( sp->next!=NULL ) sp->next->to->prevcp = sp->nextcp; } if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp == ss->first ) break; } } } SCShiftAllBy(sc,-xdeltas[pcnt-4],0); SCShiftAllBy(sc,0,-ydeltas[pcnt-2]); sc->width += xdeltas[pcnt-3]; sc->vwidth += ydeltas[pcnt-1]; } else { j = 0; if ( sc->layers[ly_fore].refs!=NULL ) { for ( i=0, ref=sc->layers[ly_fore].refs; ref!=NULL; ++i, ref=ref->next ) { if ( points[j]==i ) { if ( xdeltas[j]!=0 || ydeltas[j]!=0 ) { ref->transform[4] += xdeltas[j]; ref->transform[5] += ydeltas[j]; SCReinstanciateRefChar(sc,ref,ly_fore); } ++j; } } } else { for ( i=0, ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { if ( ss->first->prev!=NULL && ss->first->prev->from->nextcpindex==points[j] ) { ss->first->prevcp.x += xdeltas[j]; ss->first->prevcp.y += ydeltas[j]; ss->first->prev->from->nextcp = ss->first->prevcp; ++j; } for ( sp=ss->first; sp!=NULL ; ++i ) { if ( sp->ttfindex!=0xffff && sp->ttfindex!=0xfffe ) ++i; if ( sp->ttfindex==points[j] ) { sp->me.x += xdeltas[j]; sp->me.y += ydeltas[j++]; } if ( sp->nextcpindex!=0xffff && sp->nextcpindex!=0xfffe ) ++i; if ( sp->nextcpindex==points[j] ) { sp->nextcp.x += xdeltas[j]; sp->nextcp.y += ydeltas[j++]; if ( sp->next!=NULL ) sp->next->to->prevcp = sp->nextcp; } else if ( sp->nonextcp ) { sp->nextcp = sp->me; } if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp == ss->first ) break; } first = NULL; } } if ( points[j]==i ) SCShiftAllBy(sc,-xdeltas[j++],0); if ( points[j]==i+1 ) sc->width += xdeltas[j++]; if ( points[j]==i+2 ) SCShiftAllBy(sc,0,-ydeltas[j++]); if ( points[j]==i+3 ) sc->vwidth += ydeltas[j++]; } if ( sc->layers[ly_fore].refs==NULL ) { for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { for ( sp=ss->first; sp!=NULL ; ++i ) { if ( sp->ttfindex==0xffff ) { sp->me.x = ( sp->nextcp.x + sp->prevcp.x )/2; sp->me.y = ( sp->nextcp.y + sp->prevcp.y )/2; } if ( sp->next==NULL ) break; sp = sp->next->to; if ( sp == ss->first ) break; } first = NULL; for ( s=ss->first->next; s!=NULL && s!=first; s=s->to->next ) { SplineRefigure(s); if ( first==NULL ) first = s; } } } }
int SVAttachFV(FontView *fv,int ask_if_difficult) { int i, doit, pos, any=0, gid; RefChar *r, *rnext, *rprev; if ( searcher==NULL ) return( false ); if ( searcher->sd.fv==(FontViewBase *) fv ) return( true ); if ( searcher->sd.fv!=NULL && searcher->sd.fv->sf==fv->b.sf ) { ((FontView *) searcher->sd.fv)->sv = NULL; fv->sv = searcher; searcher->sd.fv = (FontViewBase *) fv; SVSetTitle(searcher); searcher->sd.curchar = NULL; return( true ); } if ( searcher->dummy_sf.layers[ly_fore].order2 != fv->b.sf->layers[ly_fore].order2 ) { SCClearContents(&searcher->sd.sc_srch,ly_fore); SCClearContents(&searcher->sd.sc_rpl,ly_fore); for ( i=0; i<searcher->sd.sc_srch.layer_cnt; ++i ) UndoesFree(searcher->sd.sc_srch.layers[i].undoes); for ( i=0; i<searcher->sd.sc_rpl.layer_cnt; ++i ) UndoesFree(searcher->sd.sc_rpl.layers[i].undoes); } for ( doit=!ask_if_difficult; doit<=1; ++doit ) { for ( i=0; i<2; ++i ) { rprev = NULL; for ( r = searcher->chars[i]->layers[ly_fore].refs; r!=NULL; r=rnext ) { rnext = r->next; pos = SFFindSlot(fv->b.sf,fv->b.map,r->sc->unicodeenc,r->sc->name); gid = -1; if ( pos!=-1 ) gid = fv->b.map->map[pos]; if ( (gid==-1 || fv->b.sf->glyphs[gid]!=NULL) && !doit ) { char *buttons[3]; buttons[0] = _("Yes"); buttons[1] = _("Cancel"); buttons[2] = NULL; if ( ask_if_difficult==2 && !searcher->isvisible ) return( false ); if ( gwwv_ask(_("Bad Reference"),(const char **) buttons,1,1, _("The %1$s in the search dialog contains a reference to %2$.20hs which does not exist in the new font.\nShould I remove the reference?"), i==0?_("Search Pattern"):_("Replace Pattern"), r->sc->name)==1 ) return( false ); } else if ( !doit ) /* Do Nothing */; else if ( gid==-1 || fv->b.sf->glyphs[gid]!=NULL ) { if ( rprev==NULL ) searcher->chars[i]->layers[ly_fore].refs = rnext; else rprev->next = rnext; RefCharFree(r); any = true; } else { /*SplinePointListsFree(r->layers[0].splines); r->layers[0].splines = NULL;*/ r->sc = fv->b.sf->glyphs[gid]; r->orig_pos = gid; SCReinstanciateRefChar(searcher->chars[i],r,fv->b.active_layer); any = true; rprev = r; } } } } fv->sv = searcher; searcher->sd.fv = (FontViewBase *) fv; searcher->sd.curchar = NULL; if ( any ) { GDrawRequestExpose(searcher->cv_srch.v,NULL,false); GDrawRequestExpose(searcher->cv_rpl.v,NULL,false); } SVSetTitle(searcher); return( true ); }