加载字形图像过程
1.转换 Character Code 到 Glyph Index
通常,应用程序希望基于其字符代码加载字形图像,字符代码是定义给定编码的字符的唯一值。例如,代码65(0x41)表示ASCII编码中的字符“A”。
face对象包含一个或多个表,称为 charmaps
。一个用于将Unicode字符代码转换为字形索引,另一个用于将Apple Roman编码转换为字形索引。然后可以在Windows(使用Unicode)和旧MacOS版本(使用Apple Roman)上使用此类字体。另请注意,给定的charmap
可能不会映射到字体中存在的所有字形
默认Unicode charmap表选择Glyph Index
glyph_index = FT_Get_Char_Index(face,charcode);
默认情况下,创建新的面部对象时,FreeType会尝试选择Unicode charmap。如果字体不包含基于字形名称的charmap
,它会模拟Unicode charmap。默认情况下使用UTF-32表示形式; 例如,如果要加载字符U + 1F028,请使用值0x1F028作为值charcode。如果返回值为0,它始终对应于称为缺失字形的特殊字形图像,通常显示为框或空格。
手动选择charmap
有两周方法可供选择一种是通过枚举来制定选择的charmap
error = FT_Select_Charmap(
face, /* target face object */
FT_ENCODING_BIG5 ); /* encoding */
如下为可选项
typedef enum FT_Encoding_
{
FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),
FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),
/* for backwards compatibility */
FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,
FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),
FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
} FT_Encoding;
另一种方法是手动解析FT_Face-> charmaps
列表,可以通过num_charmaps
和 charmaps
(Tips:'s')访问,第一个是该字体包含的charmps数量,第二个是charmps
指针。
每个charmap
都有一些可见的字段来更精确地描述它。最重要的是 charmap->platform_id
和charmap->encoding_id
,定义一对以相当通用的方式描述charmap的值:每个值对对应于给定的编码。例如,对(3,1)对应于Unicode。具体对应值为下图摘录于Apple TrueType Reference Manual
可以根据特定的编码选择不同的
champ
FT_CharMap found = 0;
FT_CharMap charmap;
int n;
for ( n = 0; n < face->num_charmaps; n++ )
{
charmap = face->charmaps[n];
if ( charmap->platform_id == my_platform_id &&
charmap->encoding_id == my_encoding_id )
{
found = charmap;
break;
}
}
if(!found){...}
无论通过上述哪种方法选择了chmap
表,需要执行
error = FT_Set_Charmap(face,found);
if(error){...}
执行后讲改变后续函数调用
/* retrieve glyph index from character code */
glyph_index = FT_Get_Char_Index( face, text[n] );