MiniGUI字体显示原理
程序员文章站
2022-05-30 14:17:51
...
MiniGUI字体显示原理
数据结构
数据结构我先从别人的博客拉一张过来吧:
这里包含了,逻辑字体和设备字体(多字符集以及单字符集),以及字符集操作集之间的关系。
可以看到:一个逻辑字体对应一个字符设备,一个字符设备对应一个字符集
也就是说一种逻辑字体只能专门显示某种特定的字符集的字符串。比如专门显示utf-8字符集的字符串,或者gb2312字符集的字符串。
字符集操作集(charset_ops)
在调用createLogFont接口创建逻辑字体时,会传入charset字符集名称,该参数用于将逻辑字体与字符集操作集进行绑定,如果创建过程中匹配到对应的设备字体,则charset参数不起作用,真是charset按照devfont来。
字符集操作集提供几个接口,用于该字符集的操作,譬如判断字符串是否为当前字符集。各个接口具体说明参考博客:
https://www.cnblogs.com/b2tang/archive/2009/06/12/1502035.html
设备字体
在MiniGUI初始化过程中,mg_InitGDI函数会根据MiniGUI.cfg配置文件读取逻辑字体文件,进行初始化,生成设备字体对象DevFont。
并通过AddDevFont函数将devfont对象保存到全局列表中(mb_dev_font_head)。
初始化devfont时,设备字体中的font_ops将被赋值为全局对象__mg_fontops_infos->fontops, 字符集操作集按照配置文件的配置进行初始化
CreateLogFont函数创建逻辑字体对象时,会通过get_matched_devfont获取匹配的设备字体,并通过dbc_font_ops->new_instance创建一个新的devfont,并绑定到逻辑字体中
逻辑字体
给对应控件的设备环境设置好逻辑字体后调用DrawText进行绘制。
DrawText最终会调用到devfont->font_ops->get_glyph_bbox函数获取字体显示区域。然后devfont->font_ops->get_glyph_bbox会调用devfont->charset_ops->conv_to_uc32将字符串转换为UNICODE编码,去ttf文件中匹配字体。