VTK汉字显示问题

转自 https://blog.csdn.net/xlong_t/article/details/41646041

做项目需要用到VTK的汉字显示功能,经过笔者多日调试,最后找到了一个非常简单的解决方法。

文章首发:http://blog.csdn.net/xlong_t/article/details/41646041

1、VTK是支持Freetype的字体的,编译VTK必须开启Freetype,这是VTK显示汉字的基础。

2、VTK显示汉字,必须指定Freetype字体文件,VTK默认字体是内嵌的英文字符字体。设置字体代码如下:

[cpp]  view plain  copy
  1. vtkTextProperty::SetFontFamily( VTK_FONT_FILE )  
  2. vtkTextProperty::SetFontFile( path_to_freetype_font )  
3、传递给VTK字符串需要使用utf8编码。如果不是,需要调用相关API转换成utf8编码。

4、修改vtkFreeTypeTools::GetGlyphIndex()的实现。可能大家都尝试过以上几个步骤,然后VTK仍然无法显示汉字。原因就是vtkFreeTypeTools::GetGlyphIndex默认使用字体文件的第一个字符映射表去查找字体图形(Glyph),了解过Freetype的童鞋都知道这是不严谨的。因为Freetype可以拥有多个字符映射表,并且不同的映射表支持的编码不同。

[cpp]  view plain  copy
  1. 需要将  
  2.   // Lookup the glyph index  
  3.   *gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, 0, c);  
  4.   return *gindex ? true : false;  
  5.     
  6. 替换为  
  7.   // Lookup the glyph index  
  8.   FT_Face face = NULL;  
  9.   if( 0==FTC_Manager_LookupFace(*CacheManager, face_id, &face))  
  10.   {  
  11.       for (unsigned i=0; i<face->num_charmaps; i++)  
  12.       {  
  13.           if(face->charmaps[i]->encoding == FT_ENCODING_UNICODE)  
  14.           {  
  15.               *gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, i, c);  
  16.               break;  
  17.           }   
  18.       }  
  19.   }  
  20.   else  
  21.   {  
  22.       *gindex = FTC_CMapCache_Lookup(*cmap_cache, face_id, 0, c);  
  23.   }  
  24.   
  25.   return *gindex ? true : false;  

总结:

笔者在找解决方法时,也参考过网上的教程,但是感觉都很复杂,需要修改的代码很多。最后仔细思考下,感觉既然VTK能够使用Freetype字体,理论上应该就能显示汉字,笔者就是以这个为基础,耐心寻找原因,最后找到了一条非常省力的解决方法。


猜你喜欢

转载自blog.csdn.net/project4gogo/article/details/80350159
今日推荐