int FTPickMapping(char *xlfd, int length, char *filename, FT_Face face, FTMappingPtr tm) { FontEncPtr encoding; FontMapPtr mapping; FT_CharMap cmap; int ftrc; int symbol = 0; const char *enc, *reg; char *encoding_name = 0; char buf[20]; if(xlfd) encoding_name = FontEncFromXLFD(xlfd, length); if(!encoding_name) encoding_name = "iso8859-1"; symbol = FTEncFontSpecific(encoding_name); #if XFONT_BDFFORMAT ftrc = FT_Get_BDF_Charset_ID(face, &enc, ®); #else ftrc = -1; #endif if(ftrc == 0) { /* Disable reencoding for non-Unicode fonts. This will currently only work for BDFs. */ if(strlen(enc) + strlen(reg) > 18) goto native; strcpy(buf, enc); strcat(buf, "-"); strcat(buf, reg); ErrorF("%s %s\n", buf, encoding_name); if(strcasecmp(buf, "iso10646-1") != 0) { if(strcasecmp(buf, encoding_name) == 0) goto native; return BadFontFormat; } } else if(symbol) { ftrc = FT_Select_Charmap(face, ft_encoding_adobe_custom); if(ftrc == 0) goto native; } encoding = FontEncFind(encoding_name, filename); if(symbol && encoding == NULL) encoding = FontEncFind("microsoft-symbol", filename); if(encoding == NULL) { ErrorF("FreeType: couldn't find encoding '%s' for '%s'\n", encoding_name, filename); return BadFontName; } if(FT_Has_PS_Glyph_Names(face)) { for(mapping = encoding->mappings; mapping; mapping = mapping->next) { if(mapping->type == FONT_ENCODING_POSTSCRIPT) { tm->named = 1; tm->base = 0; tm->mapping = mapping; return Successful; } } } for(mapping = encoding->mappings; mapping; mapping = mapping->next) { if(find_cmap(mapping->type, mapping->pid, mapping->eid, face, &cmap)) { tm->named = 0; tm->cmap = cmap; if(symbol) { /* deal with an undocumented ``feature'' of the Microsft-Symbol cmap */ TT_OS2 *os2; os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2); if(os2) tm->base = os2->usFirstCharIndex - 0x20; else tm->base = 0; } else tm->base = 0; tm->mapping = mapping; return Successful; } } return BadFontFormat; native: tm->named = 0; tm->cmap = face->charmap; tm->base = 0; tm->mapping = NULL; return Successful; }
char * font_encoding_from_xlfd(const char * name, int length) { return FontEncFromXLFD(name, length); }