判断 ttf 字体文件是否包含某个字

来源:互联网 发布:鞋子价格,淘宝 编辑:程序博客网 时间:2024/06/06 02:29

在Unity中,如果指定的字体不包含某个字,Unity就会从 自带的 Arial 中读取字形来创建这个字,本意是好的,但是总是会有问题。



在我们游戏中就有这样的问题,自己制作的微软雅黑字库不包含繁体字,Unity 就会用 Arial 来补全显示。这样看起来很怪。

文章转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

我一开始是猜测 我们字库不包含繁体字的。想起来之前做过 Freetype ,于是拿起 Freetype 来做一个验证,通过 Freetype 返回的数据 是否为空,来判断这个 字 在字库中是否存在。


主要是这段代码

//读取一个字,创建Character;bool getCharacter(wchar_t ch){if (m_character[ch].x0 == 0 &&m_character[ch].y0 == 0 &&m_character[ch].x1 == 0 &&m_character[ch].y1 == 0){//Glyph:字形,图形字符 [glif];//加载这个字的字形,加载到 m_FTFace上面去;FT_Load_Glyph(m_FTFace, FT_Get_Char_Index(m_FTFace, ch), FT_LOAD_DEFAULT);//从 m_FTFace上面读取这个字形  到 glyph 变量;FT_Glyph glyph;FT_Get_Glyph(m_FTFace->glyph, &glyph);//根据字体大小决定是否启用反锯齿;//字体较小建议使用FT_Render_Mode_Mono;//>12建议使用FT_Render_Mode_Normal; if (!(ch >= L'0' && ch <= L'9')){FT_Glyph_To_Bitmap(&glyph, ft_render_mode_normal, 0, 1);}else{FT_Glyph_To_Bitmap(&glyph, ft_render_mode_mono, 0, 1);}FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;//返回引用;FT_Bitmap& bitmap = bitmapGlyph->bitmap;FT_Bitmap targetBitmap;//创建了新的 FT_Bitmap;FT_Bitmap_New(&targetBitmap);if (bitmap.pixel_mode == FT_PIXEL_MODE_MONO){//如果Convert成功;if (FT_Bitmap_Convert(m_FTLibrary, &bitmap, &targetBitmap, 1) == 0){for (unsigned char* p = targetBitmap.buffer, *endP = p + targetBitmap.width*targetBitmap.rows; p != endP;++p){*p ^= -*p ^ *p;}bitmap = targetBitmap;}}//如果没有数据;if (bitmap.width == 0 || bitmap.rows == 0){return false;}else{return true;}}}

工程打包下载:

http://pan.baidu.com/s/1jHyJirO


0 0