做项目需要用到VTK的汉字显示功能,经过笔者多日调试,最后找到了一个非常简单的解决方法。
文章首发:http://blog.csdn.net/xlong_t/article/details/41646041
1、VTK是支持Freetype的字体的,编译VTK必须开启Freetype,这是VTK显示汉字的基础。
2、VTK显示汉字,必须指定Freetype字体文件,VTK默认字体是内嵌的英文字符字体。设置字体代码如下:
vtkTextProperty::SetFontFamily( VTK_FONT_FILE )
vtkTextProperty::SetFontFile( path_to_freetype_font )
3、传递给VTK字符串需要使用utf8编码。如果不是,需要调用相关API转换成utf8编码。
4、修改vtkFreeTypeTools::GetGlyphIndex()的实现。可能大家都尝试过以上几个步骤,然后VTK仍然无法显示汉字。原因就是vtkFreeTypeTools::GetGlyphIndex默认使用字体文件的第一个字符映射表去查找字体图形(Glyph),了解过Freetype的童鞋都知道这是不严谨的。因为Freetype可以拥有多个字符映射表,并且不同的映射表支持的编码不同。
需要将
// Lookup the glyph index
*gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, 0, c);
return *gindex ? true : false;
替换为
// Lookup the glyph index
FT_Face face = NULL;
if( 0==FTC_Manager_LookupFace(*CacheManager, face_id, &face))
{
for (unsigned i=0; i<face->num_charmaps; i++)
{
if(face->charmaps[i]->encoding == FT_ENCODING_UNICODE)
{
*gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, i, c);
break;
}
}
}
else
{
*gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, 0, c);
}
return *gindex ? true : false;
总结:
笔者在找解决方法时,也参考过网上的教程,但是感觉都很复杂,需要修改的代码很多。最后仔细思考下,感觉既然VTK能够使用Freetype字体,理论上应该就能显示汉字,笔者就是以这个为基础,耐心寻找原因,最后找到了一条非常省力的解决方法。