MiniGUI字体显示原理

2 篇文章 0 订阅

数据结构

数据结构我先从别人的博客拉一张过来吧:
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文件中匹配字体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值