使用FreeType制作嵌入式(WINCE)使用字体文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_dodo/article/details/8031400
在产品设计初期,本人只想实现一下字体的使用,不想过多依赖于平台提供的API,为日后移植到Linux等其他系统也可通用,于是乎开始Google,接触到了FreeType,通过对FreeType的剪裁,让它只支持TrueType的字体,的确FreeType库体积小了许多,使用代码如下:
	/*直接指定字体像素大小  */
	ft_error = FT_Set_Pixel_Sizes(face, //face对象句柄
				      0,    //象素宽度
				      size); //象素高度 
以上是设置字体的信息,可以设置字号。
		unsigned short fontCode = 0x4F60;
		FT_GlyphSlot slot = face->glyph;
		ft_error = FT_Load_Char( face, fontCode, FT_LOAD_NO_BITMAP | FT_LOAD_RENDER );
以上是取得一个“你”字的信息,之后即可从slot->bitmap.buffer中取得这个字号的“你”灰度值,然后进行绘制。当然使用这个两个函数之前,需要对FreeType进行初始化,
	ft_error = FT_Init_FreeType( &ft_Lib );
	if ( ft_error )
	{
		FT_Done_FreeType(ft_Lib);
		return 0; 
	}ft_error = FT_New_Memory_Face( ft_Lib,
 				       , /* 缓存的第一个字节 */
 				       , /* 缓存的大小(以字节表示) */
 				       0, /* face 索引 */);

当然也可以使用FT_New_Face,Whatever,能用就行。但是,问题来了,使用之后,发现CE的CPU使用率急速上升,猜想可能是FreeType内部解压花费太多,随后开始琢磨用FreeType提取自己需要的字号,然后数据打包到文件,然后放到项目中进行绘制,比如12,14号字之类的,于是开始了制作文件之旅。

UNICODE码,中文是从0X4E00开始,我使用了2万多个汉字,一直到0X9FA0,当然还有一些Ascii与全角字符等,全角字符UNICODE编码从0xFF01开始,于是乎开始设计结构体,把需要的信息全部填充,例如字码,宽高,在文件的位移,size,left,top等信息,索引文件使用字码升序排列,易于用二分搜索,这样在使用时,效率就体现出来了,用FreeType读取出来之后,然后把数据信息压缩至文件,比如font.dat,使用的是zlib,然后在项目中,读取数据,zlib解压之后,通过pitch同样可以读取到灰度值,然后进行绘制,这样,即使放大缩小也不会像字体点阵那样,失真较大,想用什么字体,在制作文件,new face的时候,就用那种字体初始化FreeType,比如用微软雅黑。字体文件的大小与所使用的字号多少相关,如果实在每种字号都需要使用,那么建议还是用FreeType,如果只用5种以内,则可以考虑该实现方法,在win系统用FileMapping或Linux的mmap,速率一样很不错。

设计出来的字体文件,已经在WINCE,WINXP,LINUX上使用过。

没有更多推荐了,返回首页