#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/fonts/fontmisc.h>
#include <ctype.h>
#include <string.h>
#include <X11/fonts/font.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_SFNT_NAMES_H
#include FT_TRUETYPE_IDS_H
#include "ft.h"
#ifndef LSBFirst
#define LSBFirst 0
#define MSBFirst 1
#endif
#define LOBYTE(s,byte) ((byte)==LSBFirst?*(char*)(s):*((char*)(s)+1))
#define HIBYTE(s,byte) ((byte)==LSBFirst?*((char*)(s)+1):*(char*)(s))
int FTtoXReturnCode(int rc)
{
if(rc == 0x40)
return AllocError;
else return BadFontName;
}
static int
FTu2a(int slen, FT_Byte *from, char *to, int byte, int max)
{
int i, n;
n = 0;
for (i = 0; i < slen; i += 2) {
if(n >= max - 1)
break;
if(HIBYTE(from+i, byte)!=0)
*to++='?';
else
*to++ = LOBYTE(from+i,byte);
n++;
}
*to = 0;
return n;
}
static int
FTGetName(FT_Face face, int nid, int pid, int eid, FT_SfntName *name_return)
{
FT_SfntName name;
int n, i;
n = FT_Get_Sfnt_Name_Count(face);
if(n <= 0)
return 0;
for(i = 0; i < n; i++) {
if(FT_Get_Sfnt_Name(face, i, &name))
continue;
if(name.name_id == nid &&
name.platform_id == pid &&
(eid < 0 || name.encoding_id == eid)) {
switch(name.platform_id) {
case TT_PLATFORM_APPLE_UNICODE:
case TT_PLATFORM_MACINTOSH:
if(name.language_id != TT_MAC_LANGID_ENGLISH)
continue;
break;
case TT_PLATFORM_MICROSOFT:
if(name.language_id != TT_MS_LANGID_ENGLISH_UNITED_STATES &&
name.language_id != TT_MS_LANGID_ENGLISH_UNITED_KINGDOM)
break;
continue;
break;
default:
break;
}
*name_return = name;
return 1;
}
}
return 0;
}
int
FTGetEnglishName(FT_Face face, int nid, char *name_return, int name_len)
{
FT_SfntName name;
int len;
if(FTGetName(face, nid,
TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, &name) ||
FTGetName(face, nid,
TT_PLATFORM_APPLE_UNICODE, -1, &name))
return FTu2a(name.string_len, name.string, name_return,
MSBFirst, name_len);
if(FTGetName(face, nid, TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, &name)) {
len = name.string_len;
if(len > name_len - 1)
len = name_len - 1;
memcpy(name_return, name.string, len);
name_return[len] = '\0';
return len;
}
return -1;
}