static SplineChar *_SFMakeChar(SplineFont *sf,EncMap *map,int enc) { SplineChar dummy, *sc; SplineFont *ssf; int j, real_uni, gid; extern const int cns14pua[], amspua[]; if ( enc>=map->enccount ) gid = -1; else gid = map->map[enc]; if ( sf->subfontcnt!=0 && gid!=-1 ) { ssf = NULL; for ( j=0; j<sf->subfontcnt; ++j ) if ( gid<sf->subfonts[j]->glyphcnt ) { ssf = sf->subfonts[j]; if ( ssf->glyphs[gid]!=NULL ) { return( ssf->glyphs[gid] ); } } sf = ssf; } if ( gid==-1 || (sc = sf->glyphs[gid])==NULL ) { if (( map->enc->is_unicodebmp || map->enc->is_unicodefull ) && ( enc>=0xe000 && enc<=0xf8ff ) && ( sf->uni_interp==ui_ams || sf->uni_interp==ui_trad_chinese ) && ( real_uni = (sf->uni_interp==ui_ams ? amspua : cns14pua)[enc-0xe000])!=0 ) { if ( real_uni<map->enccount ) { SplineChar *sc; /* if necessary, create the real unicode code point */ /* and then make us be a duplicate of it */ sc = _SFMakeChar(sf,map,real_uni); map->map[enc] = gid = sc->orig_pos; SCCharChangedUpdate(sc,ly_all); return( sc ); } } SCBuildDummy(&dummy,sf,map,enc); /* Let's say a user has a postscript encoding where the glyph ".notdef" */ /* is assigned to many slots. Once the user creates a .notdef glyph */ /* all those slots should fill in. If they don't they damn well better*/ /* when the user clicks on one to edit it */ /* Used to do that with all encodings. It just confused people */ if ( map->enc->psnames!=NULL && (sc = SFGetChar(sf,dummy.unicodeenc,dummy.name))!=NULL ) { map->map[enc] = sc->orig_pos; return( sc ); } sc = SFSplineCharCreate(sf); sc->unicodeenc = dummy.unicodeenc; sc->name = copy(dummy.name); sc->width = dummy.width; sc->orig_pos = 0xffff; /*SCLigDefault(sc);*/ SFAddGlyphAndEncode(sf,sc,map,enc); } return( sc ); }
static SplineChar *SFMakeGlyphLike(SplineFont *sf, int gid, SplineFont *base) { SplineChar *sc = SFSplineCharCreate(sf), *bsc = base->glyphs[gid]; sc->orig_pos = gid; sf->glyphs[gid] = sc; sc->width = bsc->width; sc->widthset = true; sc->vwidth = bsc->vwidth; free(sc->name); sc->name = copy(bsc->name); sc->unicodeenc = bsc->unicodeenc; return( sc ); }