freetype研究笔记二

加载字形图像过程

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_charmapscharmaps(Tips:'s')访问,第一个是该字体包含的charmps数量,第二个是charmps指针。
每个charmap都有一些可见的字段来更精确地描述它。最重要的是 charmap->platform_idcharmap->encoding_id,定义一对以相当通用的方式描述charmap的值:每个值对对应于给定的编码。例如,对(3,1)对应于Unicode。具体对应值为下图摘录于Apple TrueType Reference Manual

cmap对应表

可以根据特定的编码选择不同的 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] );

你可能感兴趣的:(freetype研究笔记二)