基于FreeType字体引擎的实现字体绘制的方法

文档序号:6627730阅读:468来源:国知局
基于FreeType字体引擎的实现字体绘制的方法
【专利摘要】本发明公开了一种基于FreeType字体引擎的实现字体绘制的方法,包括:初始化FreeType引擎库,加载freetype.lib字体库的步骤;创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤;以及把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。FreeType把字体渲染到纹理上,然后通过纹理贴图显示出来。达到快捷、方便将汉字显示出来的目的。
【专利说明】基于FreeType字体引擎的实现字体绘制的方法

【技术领域】
[0001]本发明涉及信息处理领域,具体地,涉及一种基于FreeType字体引擎的实现字体绘制的方法,即将字符渲染到纹理并显示出来的方法。

【背景技术】
[0002]目前,在软件开发中,通常不需要考虑字体的显示,它是有操作系统作为基础的功能提供,然而计算机系统的发展,高效、快捷,美观的字体已经成为市场的一个需求,尤其在电子设备应用中与人们的生活息息相关,在国内网络游戏中,汉字涵盖了很多游戏所用的语言,但是游戏场景中显卡却不支持汉字的,需要为字体进行解析,而大部分引擎都提供字体处理的接口。
[0003]很多游戏中使用不同的方法来实现字体的显示,却没有统一的规定,但是这些绘制字体的方法显示的效果不完整,视觉差等缺陷。


【发明内容】

[0004]本发明的目的在于,针对上述问题,提出一种基于FreeType字体引擎的实现字体绘制的方法,以实现快捷、方便将汉字显示出来的优点。
[0005]为实现上述目的,本发明采用的技术方案是:
一种基于FreeType字体引擎的实现字体绘制的方法,包括:
初始化FreeType引擎库,加载freetype.1ib字体库的步骤;
创建字体的FT_Face句柄,读取上述freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤;
以及
把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。
[0006]优选的,所述创建字体的FT_Face句柄,读取上述freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括,
设置字体的字号FT_Size的步骤;
以及
创建字体的各个字形FT_GyphSlot,并把字体转化为位图的步骤。
[0007]优选的,上述设置字体的字号FT_Size的步骤具体为:
创建的句柄对象中,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸。
[0008]优选的,所述创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤具体包括:
创建字体本身的Glyph的步骤;
创建字形的边框Glyph的步骤。
[0009]优选的,所述字号FT_Size设置为12号字体。
[0010]本发明的技术方案具有以下有益效果:
本发明的技术方案,基于FreeType字体引擎实现字体绘制的方法。FreeType是一个开源的字体引擎,它支持单色位图、反走样位图的渲染,并且提供统一的接口来访问多种字体格式文件,包括 TrueType、OpenType、CFF> CID、window FONT/FNT/ 等,FreeType 把字体?宣染到纹理上,然后通过纹理贴图显示出来。达到快捷、方便将汉字显示出来的目的。
[0011]下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。

【专利附图】

【附图说明】
[0012]图1为本发明实施例所述的基于FreeType字体引擎的实现字体绘制的方法流程图;
图2为生成的字体的普通贴图示意图;
图3为生成的字形的描边贴图示意图;
图4为图2所示生成的字体的普通贴图对应的字体槽示意图;
图5为图3所示的生成的字形的描边贴图对应的字体槽示意图;
图6为水平布局的度量示意图。

【具体实施方式】
[0013]以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
[0014]如图1所示,一种基于FreeType字体引擎的实现字体绘制的方法,包括:
初始化FreeType引擎库,加载freetype.1ib字体库的步骤;
创建字体的FT_Face句柄,读取freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤;
以及
把位图渲染到纹理缓存中,然后写入贴图中的步骤。
[0015]优选的,仓Il建字体的FT_Face句柄,读取freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括,
设置字体的字号FT_Size的步骤;
以及
创建字体的各个字形FT_GyphSlot,并把字体转化为位图的步骤。
[0016]优选的,设置字体的字号FT_Size的步骤具体为:
创建的句柄对象中,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸。
[0017]优选的,创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤具体包括:
创建字体本身的Glyph的步骤;
创建字形的边框Glyph的步骤。
[0018]以下结合程序对实施方案进行说明:
Freetype是一个操作字体的函数库,不但可以处理点阵字体,也可以处理多种矢量字体,为上层应用程序提供了一个统一的调用接口,本发明技术方案是调用了 FreeType库中的接口来实现的。具体步骤如下:
第一 Jl^MtFreeType 引擎库,加载 freetype.1ib 字体库;
在程序设计中,通过以下来声明:
FT_Library ftlibrary;创建库的实例
FT_Init_FreeType (&ftlibrary) //创建新的库对象,这种创建的模式要简单方便点,而模块列表在构建时可以动态的计算。
[0019]创建库对象时所有FT是其他对象的父亲,例如:FT_FACE,FT_module都是它的子对象。当销毁这些子对象时,父对象就无意义。在做任何的操作之前都要创建一个新的库实例,这个库的实例中包含内存管理对象、对象列表、保存外观对象属于字体驱动、库实例。
[0020]第二:创建字体的FT_Face句柄;
在程序设计中,句柄是一种特殊的智能指针,当一个应用程序中要引用其他的系统所管理的内存块或者对象时就需要句柄。那么创建字体句柄就是一个字体的外观,一个外观对象用FT_New_Memory_Fac ()创建,它通常描述全局字体数据的属性。可以被程序直接访问,因为本发明是基于FreeTYpe引擎的对字体的实现,所以需要引入字体引擎中的对象。通过下述代码可以创建字体FT_Face句柄:FT_New_Memory_Face (_ftLibrary, _fontBuffer, (FT_Long)fontBufferSize, facelndex, &result),
其中的参数意义为:_ftLibrary字库句柄,_fontBuffer读取的字体文件的缓存buffer, fontBufferSize读取的字体文件的缓存尺寸,facelndex默认为O,就是取字形文件中的第一个字形(有些字形文件可能带多个字形),result返回是否加载成功。
[0021]FT_New_Memory_Face ()这个函数可以用来直接从内存中读取的数据创建或打开一个FT_FACE对象。
[0022]a)设置字体的字号FT_Size ;
创建的句柄对象,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,一个尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸,其设置字体的字号函数为:
FT_Set_Char_Size(result, ftSize, O, mResolut1n, mResolut1n)
其中result返回是否加载成功,ftSize字号的尺寸,通常我们设置为12号字体,mResolut1n, mResolut1n分辨率参数,采用默认值分别为72,72。
[0023]b)创建字体的各个字形FT_GyphSlot,并把字体的字形转化为位图;
字符的映像叫做字形,根据书写、用法和上下文,当个字符能够有多个不同的映像,即:多个字形,单个字符也可以由一个字形。
[0024]在装载一个字形的设置的大小时,字形之间排版也是很重要的,为了排版更加美观,本发明技术方案引用字体引擎中的横向排版字形来讲述字体水平排版格式:
如图6所示:水平方向的箭头表示基线,可以使水平的或者是竖直的。为了渲染文本,在基线上有一个虚拟到的点叫原点,它用来定位字形。
[0025]其中Width为字形图像的边框的宽度,Height为字形图像的边框高度,bearingX是从当前光标位置到字形图像最左边的边界的水平距离,bearingY为从基线到上边界框的垂直距离,Advance为步进宽度,当字形作为字符串的一部分被绘制时,用来增加笔位置的水平距离。
[0026]通过字形度量来描述该距离来排版文本,通常一个字形有两个度量集:用来排版水平文本排列的字形和用来排版垂直文本排列的字形,但是只有很少的字体格式提供了垂直度量,这样字体的度量可以方便检索,更容易管理字形图像。
[0027]每个FT_Face对象包含一组字形,这些字形可以任意顺序存在字体文件中。而字体文件中又包含一个或者多个表,叫做字符表(Charmap )。
[0028]当动态创建一个FT_Face对象时,通常带有一个字体的映射表,用来把字符编码映射到对应的glyph slot (字形槽)索引值,这个字形槽提供的是一个存放字体的地方,可以一个个装入字形的映像,一旦一个字形槽创建后,任何字形映像可以装入其中而无需其他的内存分配,同时需要为字体本身的Glyph和字体的边框Glyph创建2套贴图来保存。
[0029]bl)、创建字体本身的Glyph ;
首先加载一个字形Glyph,
FT_Load_Char(mFace, _id, FT_LOAD_DEFAULT) != 0
其中mFace为字体句柄FT_Face,_id为一个字体转化过来的字体编码格式
其次渲染这个字形glyph
FT_Render_Glyph(mFace->glyph, mMono ? FT_RENDER_M0DE_M0N0: FT_RENDER_M0DE_N0RMAL)
其中Mono模式(点阵字体),并判断使用什么样的渲染方式:
是否用点阵字体渲染还是用freetype字体生成的256位灰度图带Alpha通道的数据渲染。
[0030]b2)、创建字形的边框Glyph ;
边框的创建和上述普通字体Glyph的差不多,只是调用的freetype的API有些不同: 其实现过程如下:
FT_Get_Glyph(mFace->glyph, &glyph) ;// 得到之前创建的字形FT_Stroker_New(FontManager::getlnstanceO ■ getFTLibraryO,&stroker);FT_Stroker_Set(stroker, mStrokeSize * 64, FT_STR0KER_LINECAP_R0UND, FT_STR0KER_LINEJ0IN_R0UND, 0);FT_RENDER_M0DE_M0N0: FT_RENDER_M0DE_N0RMAL, 0,0);
FT_Glyph_Stroke(&glyph, stroker, 0);
FT_Stroker_Done(stroker);
FT_Glyph_To_Bitmap(&glyph, mMono ? FT_RENDER_M0DE_M0N0: FT_RENDER_M0DE_NORMAL, 0,0);
FT_Bitmap &bitmap = ((FT_BitmapGIyph)glyph)->bitmap;
上述是利用freetype自带的api生成边框信息的buffer。
[0031]第三:把字体本身的glyph和字形的边框渲染到纹理缓存中,然后写入贴图中; 取得保存在freetype中的图像信息:实现过程如下:
FT_Bitmap &bitmap = slot->bitmap; 并把这些信息写到贴图中,记录这个字形Glyph相应的信息包括这张贴图上的UV,字形的宽度,字形的高度,字体的横向偏移,字形的纵向偏移。具体如图2至图5所示。
[0032]本技术方案权利要求中的英文均为编程中常用用语,对于本领域技术人员是其意思是公知的。
[0033]最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种基于FreeType字体引擎的实现字体绘制的方法,其特征在于,包括: 初始化FreeType引擎库,加载freetype.1ib字体库的步骤; 创建字体的FT_Face句柄,读取上述freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤; 以及 把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。
2.根据权利要求1所述的基于FreeType字体引擎的实现字体绘制的方法,其特征在于,所述创建字体的FT_Face句柄,读取上述freetype.1ib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括, 设置字体的字号FT_Size的步骤; 以及 创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤。
3.根据权利要求2所述的基于FreeType字体引擎的实现字体绘制的方法,其特征在于,上述设置字体的字号FT_Size的步骤具体为: 创建的句柄对象中,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸。
4.根据权利要求2所述的基于FreeType字体引擎的实现字体绘制的方法,其特征在于,所述创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤具体包括: 创建字体本身的Glyph的步骤; 创建字形的边框Glyph的步骤。
5.根据权利要求2至4任一所述的基于FreeType字体引擎的实现字体绘制的方法,其特征在于,所述字号FT_Size设置为12号字体。
【文档编号】G06F17/30GK104298504SQ201410485483
【公开日】2015年1月21日 申请日期:2014年9月22日 优先权日:2014年9月22日
【发明者】张翼 申请人:无锡梵天信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1