void ffw_import_svg_glyph(int code, const char * filename, double ox, double oy, double width) { int enc = SFFindSlot(cur_fv->sf, cur_fv->map, code, ""); if(enc == -1) return; SplineChar * sc = SFMakeChar(cur_fv->sf, cur_fv->map, enc); memset(cur_fv->selected, 0, cur_fv->map->enccount); cur_fv->selected[enc] = 1; int ok = FVImportImages(cur_fv, (char*)filename, fv_svg, 0, -1); if(!ok) err("Import SVG glyph failed"); // correct origin and width { int a = cur_fv->sf->ascent; int d = cur_fv->sf->descent; real transform[6]; transform[0] = 1.0; transform[3] = 1.0; transform[1] = transform[2] = 0.0; transform[4] = -ox * (a+d); transform[5] = -oy * (a+d) + d; FVTrans(cur_fv, sc, transform, NULL, fvt_alllayers | fvt_dontmovewidth); SCSynchronizeWidth(sc, floor(width * (a+d) + 0.5), sc->width, cur_fv); } }
static GTextInfo *AvailableRanges(SplineFont *sf,EncMap *map) { GTextInfo *ret = gcalloc(unicoderange_cnt+3,sizeof(GTextInfo)); int i, cnt, ch, pos; for ( i=cnt=0; unicoderange[i].name!=NULL; ++i ) { ch = unicoderange[i].defined==-1 ? unicoderange[i].first : unicoderange[i].defined; pos = SFFindSlot(sf,map,ch,NULL); if ( pos!=-1 ) { ret[cnt].text = (unichar_t *) _(unicoderange[i].name); ret[cnt].text_is_1byte = true; ret[cnt++].userdata = (void *) (intpt) pos; } } qsort(ret,cnt,sizeof(GTextInfo),alpha); return( ret ); }
static int MapAddEnc(SplineFont *sf,SplineChar *sc,EncMap *basemap, EncMap *map,int baseenc, int gid, FontViewBase *fv) { int any = false, enc; if ( gid>=map->backmax ) { map->backmap = grealloc(map->backmap,(map->backmax+=10)*sizeof(int)); memset(map->backmap+map->backmax-10,-1,10*sizeof(int)); } if ( map->enc->psnames!=NULL ) { /* Check for multiple encodings */ for ( enc = map->enc->char_cnt-1; enc>=0; --enc ) { if ( map->enc->psnames[enc]!=NULL && strcmp(sc->name,map->enc->psnames[enc])==0 ) { if ( !any ) { map->backmap[gid] = enc; any = true; } map->map[enc] = gid; } } } else { enc = SFFindSlot(sf,map,sc->unicodeenc,sc->name); if ( enc!=-1 ) { map->map[enc] = gid; map->backmap[gid] = enc; any = true; } } if ( basemap!=NULL && map->enc==basemap->enc && baseenc!=-1 ) { if ( baseenc>=map->enccount ) { if ( map==fv->map ) FVAddEncodingSlot(fv,gid); else MapAddEncodingSlot(map,gid); } else { map->map[baseenc] = gid; if ( map->backmap[gid]==-1 ) map->backmap[gid] = baseenc; } any = true; } return( any ); }
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 ); }