CN104298504A - 基于FreeType字体引擎的实现字体绘制的方法 - Google Patents
基于FreeType字体引擎的实现字体绘制的方法 Download PDFInfo
- Publication number
- CN104298504A CN104298504A CN201410485483.9A CN201410485483A CN104298504A CN 104298504 A CN104298504 A CN 104298504A CN 201410485483 A CN201410485483 A CN 201410485483A CN 104298504 A CN104298504 A CN 104298504A
- Authority
- CN
- China
- Prior art keywords
- font
- freetype
- size
- bitmap
- engine
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Controls And Circuits For Display Device (AREA)
Abstract
本发明公开了一种基于FreeType字体引擎的实现字体绘制的方法,包括:初始化FreeType引擎库,加载freetype.lib字体库的步骤;创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤;以及把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。FreeType把字体渲染到纹理上,然后通过纹理贴图显示出来。达到快捷、方便将汉字显示出来的目的。
Description
技术领域
本发明涉及信息处理领域,具体地,涉及一种基于FreeType字体引擎的实现字体绘制的方法,即将字符渲染到纹理并显示出来的方法。
背景技术
目前,在软件开发中,通常不需要考虑字体的显示,它是有操作***作为基础的功能提供,然而计算机***的发展,高效、快捷,美观的字体已经成为市场的一个需求,尤其在电子设备应用中与人们的生活息息相关,在国内网络游戏中,汉字涵盖了很多游戏所用的语言,但是游戏场景中显卡却不支持汉字的,需要为字体进行解析,而大部分引擎都提供字体处理的接口。
很多游戏中使用不同的方法来实现字体的显示,却没有统一的规定,但是这些绘制字体的方法显示的效果不完整,视觉差等缺陷。
发明内容
本发明的目的在于,针对上述问题,提出一种基于FreeType字体引擎的实现字体绘制的方法,以实现快捷、方便将汉字显示出来的优点。
为实现上述目的,本发明采用的技术方案是:
一种基于FreeType字体引擎的实现字体绘制的方法,包括:
初始化FreeType引擎库,加载freetype.lib字体库的步骤;
创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤;
以及
把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。
优选的,所述创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括,
设置字体的字号FT_Size的步骤;
以及
创建字体的各个字形FT_GyphSlot,并把字体转化为位图的步骤。
优选的,上述设置字体的字号FT_Size的步骤具体为:
创建的句柄对象中,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸。
优选的,所述创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤具体包括:
创建字体本身的Glyph的步骤;
创建字形的边框Glyph的步骤。
优选的,所述字号FT_Size设置为12号字体。
本发明的技术方案具有以下有益效果:
本发明的技术方案,基于FreeType字体引擎实现字体绘制的方法。FreeType是一个开源的字体引擎,它支持单色位图、反走样位图的渲染,并且提供统一的接口来访问多种字体格式文件,包括TrueType、OpenType、CFF、CID、window FONT/FNT/等,FreeType把字体渲染到纹理上,然后通过纹理贴图显示出来。达到快捷、方便将汉字显示出来的目的。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
附图说明
图1为本发明实施例所述的基于FreeType字体引擎的实现字体绘制的方法流程图;
图2为生成的字体的普通贴图示意图;
图3为生成的字形的描边贴图示意图;
图4为图2所示生成的字体的普通贴图对应的字体槽示意图;
图5为图3所示的生成的字形的描边贴图对应的字体槽示意图;
图6为水平布局的度量示意图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
如图1所示,一种基于FreeType字体引擎的实现字体绘制的方法,包括:
初始化FreeType引擎库,加载freetype.lib字体库的步骤;
创建字体的FT_Face句柄,读取freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤;
以及
把位图渲染到纹理缓存中,然后写入贴图中的步骤。
优选的,创建字体的FT_Face句柄,读取freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括,
设置字体的字号FT_Size的步骤;
以及
创建字体的各个字形FT_GyphSlot,并把字体转化为位图的步骤。
优选的,设置字体的字号FT_Size的步骤具体为:
创建的句柄对象中,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸。
优选的,创建字体的各个字形FT_GyphSlot,并把字体字形转化为位图的步骤具体包括:
创建字体本身的Glyph的步骤;
创建字形的边框Glyph的步骤。
以下结合程序对实施方案进行说明:
Freetype是一个操作字体的函数库,不但可以处理点阵字体,也可以处理多种矢量字体,为上层应用程序提供了一个统一的调用接口,本发明技术方案是调用了FreeType库中的接口来实现的。具体步骤如下:
第一:初始化FreeType引擎库,加载freetype.lib字体库;
在程序设计中,通过以下来声明:
FT_Library ftlibrary;创建库的实例
FT_Init_FreeType(&ftlibrary)//创建新的库对象,这种创建的模式要简单方便点,而模块列表在构建时可以动态的计算。
创建库对象时所有FT是其他对象的父亲,例如:FT_FACE,FT_module都是它的子对象。当销毁这些子对象时,父对象就无意义。在做任何的操作之前都要创建一个新的库实例,这个库的实例中包含内存管理对象、对象列表、保存外观对象属于字体驱动、库实例。
第二:创建字体的FT_Face句柄;
在程序设计中,句柄是一种特殊的智能指针,当一个应用程序中要引用其他的***所管理的内存块或者对象时就需要句柄。那么创建字体句柄就是一个字体的外观,一个外观对象用FT_New_Memory_Fac()创建,它通常描述全局字体数据的属性。可以被程序直接访问,因为本发明是基于FreeTYpe引擎的对字体的实现,所以需要引入字体引擎中的对象。通过下述代码可以创建字体FT_Face句柄:FT_New_Memory_Face(_ftLibrary, _fontBuffer, (FT_Long)fontBufferSize, faceIndex, &result),
其中的参数意义为:_ftLibrary字库句柄, _fontBuffer读取的字体文件的缓存buffer, fontBufferSize读取的字体文件的缓存尺寸,faceIndex默认为0,就是取字形文件中的第一个字形(有些字形文件可能带多个字形),result 返回是否加载成功。
FT_New_Memory_Face()这个函数可以用来直接从内存中读取的数据创建或打开一个FT_FACE对象。
a)设置字体的字号FT_Size;
创建的句柄对象,每个句柄对象都有一个或者多个设置字体大小的类FT_Size对象,一个尺寸对象用来存放指定字符的宽度和高度数据,每个新创建的外观对象都对应一个尺寸,其设置字体的字号函数为:
FT_Set_Char_Size(result, ftSize, 0, mResolution, mResolution)
其中result返回是否加载成功,ftSize字号的尺寸,通常我们设置为12号字体,mResolution,mResolution分辨率参数,采用默认值分别为72,72。
b)创建字体的各个字形FT_GyphSlot,并把字体的字形转化为位图;
字符的映像叫做字形,根据书写、用法和上下文,当个字符能够有多个不同的映像,即:多个字形,单个字符也可以由一个字形。
在装载一个字形的设置的大小时,字形之间排版也是很重要的,为了排版更加美观,本发明技术方案引用字体引擎中的横向排版字形来讲述字体水平排版格式:
如图6所示:水平方向的箭头表示基线,可以使水平的或者是竖直的。为了渲染文本,在基线上有一个虚拟到的点叫原点,它用来定位字形。
其中Width为字形图像的边框的宽度,Height为字形图像的边框高度,bearingX是从当前光标位置到字形图像最左边的边界的水平距离,bearingY为从基线到上边界框的垂直距离,Advance为步进宽度,当字形作为字符串的一部分被绘制时,用来增加笔位置的水平距离。
通过字形度量来描述该距离来排版文本,通常一个字形有两个度量集:用来排版水平文本排列的字形和用来排版垂直文本排列的字形,但是只有很少的字体格式提供了垂直度量,这样字体的度量可以方便检索,更容易管理字形图像。
每个FT_Face对象包含一组字形,这些字形可以任意顺序存在字体文件中。而字体文件中又包含一个或者多个表,叫做字符表(Charmap)。
当动态创建一个FT_Face对象时,通常带有一个字体的映射表,用来把字符编码映射到对应的 glyph slot(字形槽)索引值,这个字形槽提供的是一个存放字体的地方,可以一个个装入字形的映像,一旦一个字形槽创建后,任何字形映像可以装入其中而无需其他的内存分配,同时需要为字体本身的Glyph和字体的边框Glyph创建2套贴图来保存。
b1)、创建字体本身的Glyph;
首先加载一个字形Glyph,
FT_Load_Char(mFace, _id, FT_LOAD_DEFAULT) != 0
其中mFace 为字体句柄FT_Face,_id 为一个字体转化过来的字体编码格式
其次渲染这个字形glyph
FT_Render_Glyph(mFace->glyph, mMono ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_NORMAL)
其中Mono模式(点阵字体),并判断使用什么样的渲染方式:
是否用点阵字体渲染还是用freetype字体生成的256位灰度图带Alpha通道的数据渲染。
b2)、创建字形的边框Glyph;
边框的创建和上述普通字体Glyph的差不多,只是调用的freetype的API有些不同:
其实现过程如下:
FT_Get_Glyph(mFace->glyph, &glyph);// 得到之前创建的字形
FT_Stroker_New(FontManager::getInstance().getFTLibrary(), &stroker);
FT_Stroker_Set(stroker, mStrokeSize * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0);FT_RENDER_MODE_MONO : FT_RENDER_MODE_NORMAL, 0, 0);
FT_Glyph_Stroke(&glyph, stroker, 0);
FT_Stroker_Done(stroker);
FT_Glyph_To_Bitmap(&glyph, mMono ? FT_RENDER_MODE_MONO : FT_RENDER_MODE_NORMAL, 0, 0);
FT_Bitmap &bitmap = ((FT_BitmapGlyph)glyph)->bitmap;
上述是利用freetype自带的api生成边框信息的buffer。
第三:把字体本身的glyph和字形的边框渲染到纹理缓存中,然后写入贴图中;
取得保存在freetype中的图像信息:实现过程如下:
FT_Bitmap &bitmap = slot->bitmap;
并把这些信息写到贴图中, 记录这个字形Glyph相应的信息包括这张贴图上的UV,字形的宽度,字形的高度,字体的横向偏移,字形的纵向偏移。具体如图2至图5所示。
本技术方案权利要求中的英文均为编程中常用用语,对于本领域技术人员是其意思是公知的。
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种基于FreeType字体引擎的实现字体绘制的方法,其特征在于,包括:
初始化FreeType引擎库,加载freetype.lib字体库的步骤;
创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤;
以及
把上述位图渲染到纹理缓存中,然后写入贴图中的步骤。
2.根据权利要求1所述的基于FreeType字体引擎的实现字体绘制的方法,其特征在于,所述创建字体的FT_Face句柄,读取上述freetype.lib字体库的对象,并将读取的对象进行处理转化为位图的步骤中具体包括,
设置字体的字号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号字体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410485483.9A CN104298504A (zh) | 2014-09-22 | 2014-09-22 | 基于FreeType字体引擎的实现字体绘制的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410485483.9A CN104298504A (zh) | 2014-09-22 | 2014-09-22 | 基于FreeType字体引擎的实现字体绘制的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104298504A true CN104298504A (zh) | 2015-01-21 |
Family
ID=52318247
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410485483.9A Pending CN104298504A (zh) | 2014-09-22 | 2014-09-22 | 基于FreeType字体引擎的实现字体绘制的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104298504A (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105513108A (zh) * | 2015-12-11 | 2016-04-20 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于纹理贴图的字库绘制方法 |
CN105654541A (zh) * | 2015-12-31 | 2016-06-08 | 网易(杭州)网络有限公司 | 窗口图像处理方法和装置 |
CN106384373A (zh) * | 2016-08-31 | 2017-02-08 | 广州博冠信息科技有限公司 | 一种文字显示方法及装置 |
CN106683189A (zh) * | 2016-11-29 | 2017-05-17 | 浙江科澜信息技术有限公司 | 一种在三维场景中渲染文字的方法 |
CN107221020A (zh) * | 2017-05-27 | 2017-09-29 | 北京奇艺世纪科技有限公司 | 一种文字纹理绘制方法及装置 |
CN108986193A (zh) * | 2018-07-10 | 2018-12-11 | 武汉国遥新天地信息技术有限公司 | 一种三维文字描边绘制方法 |
CN111105474A (zh) * | 2019-12-19 | 2020-05-05 | 广州酷狗计算机科技有限公司 | 字体绘制方法、装置、计算机设备及计算机可读存储介质 |
CN112652046A (zh) * | 2020-12-18 | 2021-04-13 | 完美世界(重庆)互动科技有限公司 | 游戏画面的生成方法、装置、设备及存储介质 |
US11928419B2 (en) | 2020-09-21 | 2024-03-12 | Boe Technology Group Co., Ltd. | Information display method and apparatus, and storage medium and electronic device |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101008939A (zh) * | 2007-01-25 | 2007-08-01 | 深圳创维-Rgb电子有限公司 | 一种嵌入式***的点阵字库的实现方法 |
-
2014
- 2014-09-22 CN CN201410485483.9A patent/CN104298504A/zh active Pending
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101008939A (zh) * | 2007-01-25 | 2007-08-01 | 深圳创维-Rgb电子有限公司 | 一种嵌入式***的点阵字库的实现方法 |
Non-Patent Citations (1)
Title |
---|
黄秀珍,何加铭,邰晓英: "《基于freetype嵌入式矢量字体引擎的研究》", <宁波大学学报> * |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105513108A (zh) * | 2015-12-11 | 2016-04-20 | 中国航空工业集团公司西安航空计算技术研究所 | 一种基于纹理贴图的字库绘制方法 |
CN105654541A (zh) * | 2015-12-31 | 2016-06-08 | 网易(杭州)网络有限公司 | 窗口图像处理方法和装置 |
CN105654541B (zh) * | 2015-12-31 | 2018-09-14 | 网易(杭州)网络有限公司 | 窗口图像处理方法和装置 |
CN106384373A (zh) * | 2016-08-31 | 2017-02-08 | 广州博冠信息科技有限公司 | 一种文字显示方法及装置 |
CN106384373B (zh) * | 2016-08-31 | 2019-06-21 | 广州博冠信息科技有限公司 | 一种文字显示方法及装置 |
CN106683189B (zh) * | 2016-11-29 | 2019-09-27 | 浙江科澜信息技术有限公司 | 一种在三维场景中渲染文字的方法 |
CN106683189A (zh) * | 2016-11-29 | 2017-05-17 | 浙江科澜信息技术有限公司 | 一种在三维场景中渲染文字的方法 |
CN107221020A (zh) * | 2017-05-27 | 2017-09-29 | 北京奇艺世纪科技有限公司 | 一种文字纹理绘制方法及装置 |
CN108986193A (zh) * | 2018-07-10 | 2018-12-11 | 武汉国遥新天地信息技术有限公司 | 一种三维文字描边绘制方法 |
CN111105474A (zh) * | 2019-12-19 | 2020-05-05 | 广州酷狗计算机科技有限公司 | 字体绘制方法、装置、计算机设备及计算机可读存储介质 |
US11928419B2 (en) | 2020-09-21 | 2024-03-12 | Boe Technology Group Co., Ltd. | Information display method and apparatus, and storage medium and electronic device |
CN112652046A (zh) * | 2020-12-18 | 2021-04-13 | 完美世界(重庆)互动科技有限公司 | 游戏画面的生成方法、装置、设备及存储介质 |
CN112652046B (zh) * | 2020-12-18 | 2024-03-22 | 完美世界(重庆)互动科技有限公司 | 游戏画面的生成方法、装置、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104298504A (zh) | 基于FreeType字体引擎的实现字体绘制的方法 | |
EP4198909A1 (en) | Image rendering method and apparatus, and computer device and storage medium | |
US10789770B1 (en) | Displaying rich text on 3D models | |
KR102523843B1 (ko) | 폰트 렌더링 방법, 장치 및 컴퓨터 판독 가능 저장매체 | |
US8959431B2 (en) | Low resolution placeholder content for document navigation | |
CN111221596B (zh) | 字体渲染方法、装置及计算机可读存储介质 | |
KR20150091132A (ko) | 페이지 렌더링 방법 및 장치 | |
CN101699426A (zh) | 文档格式转化***及方法 | |
CN109636885B (zh) | 一种用于h5页面的序列帧动画制作方法和*** | |
CN104809123B (zh) | 一种网页渲染方法及*** | |
CN107707965B (zh) | 一种弹幕的生成方法和装置 | |
CN111324381B (zh) | 开发***、方法、装置、计算机设备及存储介质 | |
CN108986193A (zh) | 一种三维文字描边绘制方法 | |
US10311060B2 (en) | Glyph management in texture atlases | |
CN108961361B (zh) | 生成特效文字图像的方法及***、计算机设备 | |
US11367231B2 (en) | System for generating snapping guides for a multi-path glyph | |
CN101593171B (zh) | 一种可通过内存映射方式访问的字体文件及其访问方法 | |
CN111399788B (zh) | 媒体文件播放方法和媒体文件播放装置 | |
CN114049424A (zh) | 一种基于三维渲染引擎的文字高效绘制显示方法 | |
CN114625990A (zh) | 用于对网页端网格数据渲染的方法、装置、设备和介质 | |
CN114090666A (zh) | 幻灯片显示方法、装置、设备以及存储介质 | |
CN100405293C (zh) | 点阵图形界面开发方法 | |
US20180189251A1 (en) | Automatic multi-lingual editing method for cartoon content | |
CN110647352B (zh) | 一种数据移植的方法、终端及存储介质 | |
CN116341490A (zh) | 一种基于FreeType在汽车仪表HMI中实现可变字体方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20150121 |
|
RJ01 | Rejection of invention patent application after publication |