UEFI开发探索15 – 图形模式下文字显示

UEFI中提供了HII(Human Interface Infrastructure)用来处理图形界面的文字显示,这一块我一直没有去仔细研究。到目前为止,显示汉字和字符,我都没有采用这种方法。

比如之前博客中演示了测试样卡的界面,图形中用到了各种英文和汉字,都是采用我自己的方法来实现的。

HII的思考方式不大直接,当时我面临着要在几周内完成UEFI Option ROM的开发,需要克服的困难太多,图形模式下的汉字和英文字符的显示,我采用了Foxdisk中的显示方法。

具体来说,在前面的博客中,已经实现了画点函数(putpixel)函数,那么把所有汉字及英文字符看做一个个的字模,画出来就行了。所有的核心思想皆源于此。

关于Foxdisk编程的博客中,已经介绍了这部分的一些内容,主要是关于汉字的提取和显示,可以对照着看。 因为没有使用HII,编译器无法识别源代码中的unicode字符。因此,所有我使用的汉字字符串,都是这样的:

图1 字符串(摘自Mainmenu.c)

也即把汉字的编码直接用两个8位字符表示(汉字编码是16位宽),英文字符就是ASCII码(8位)。工具程序自动根据编码去提取字模。

Foxdisk下的工具程序也得做一些简单的改动,以适应目前的程序要求。

1 工具程序

英文字符的字模是不用提取的,我一直使用8×16像素的英文字符,直接拷贝到程序中一起编译即可。

主要是做提取汉字字模的工具。我写的工具是运行在16位dos下的,因此一般只能在32位winxp的cmd中运行,win7 32位应该也可以,工具程序主要都是处理文件内容,没有调用硬件相关代码。使用Borland C++ 3.1编译。

64位的操作系统就别想使用了。本想用Visual Studio编写以适应64位OS,日常工作中又没有必要,总是提不起劲,一直拖到现在没有付诸行动。

最近在考虑用python重写这些工具软件,方便直接在x64下直接运行。也许会做,也许不会做,谁知道呢。

主要使用的工具程序有两个:DistillHZ和DisTillLOGO。这两个程序都是从Foxdisk的工具程序改造而来,以适应UEFI开发的需求。 DistillHZ改造成可以自动生成UEFI字符串的形式(我所需要的字符串,非UEFI官方所说的字符串),看下程序的记录就知道了:

图2 DisTillHZ程序说明

简单来说,相比于Foxdisk的原始工具,除了自动生成字模文件,还会自动将所需要的字符串进行转换。

假如将需要转换的字符串放在t1.c中,则运行:efihz xx.h t1.c,则会自动将汉字库提取到xx.h中,同时自动生成一个dst_t1.c的文件,里面是uefi程序使用的字符串。

DisTillLOGO则完全是从Foxdisk工具程序中拿过来的,没有修改。Logo的提取还不是很完善,需要手动在代码中修改大小,而且也没有去考虑各种情况的影响(如bmp的对齐问题)。

具体的看代码和代码内的说明。

2 显示汉字

其实在Foxdisk的博客中,已经很清楚的说明了显示汉字的原理,我采用的是完全相同的机制,就不重复说明了。 不同的地方在于,UEFI程序的字符串的表示,而这块也通过上面所说的工具程序解决了。

图3 代码列表

通过distillhz将需要显示的汉字字模以及字符串提取出来,字模文件拷贝到Font.c中,Font.h中包含了汉字以及英文字符显示的数据结构,以及相关的显示函数,基本上不用动。

所谓的Logo,其实是程序中标题栏上显示所需要的,类似于window下的程序的logo。我采用的是从256色bmp图中提取,按像素点的形式存储。显示的时候再使用putpixel逐点显示,还是比较简单的。

千言不如一图,程序显示的效果如下:

图4 程序的显示效果

从代码列表中可以看到,很多源代码的名字和Foxdisk中是一致的。实际上,汉字的显示函数以及各种图形的显示函数,与Foxdisk是完全一致的。因此,在Foxdisk中实现的一些有趣的效果,比如渐隐效果、透明效果等,都是可以直接用在UEFI中。

就是因为这种乐趣,我才会对这种研究乐此不疲。

这篇博客是在深圳翻身地铁站旁边的七天快捷酒店写好的,我借用了酒店的电视屏,有点搞笑,拍下来做个纪念。

图5 留个纪念

估计没有人会像我这样用酒店的电视机吧^_^

百度云链接:https://pan.baidu.com/s/1gccSosw8_UAGTI5gZPnLCA
提取码:dx23
代码在 X3 UEFI界面开发以及工具程序 下。

88 total views, 2 views today

发表评论

电子邮件地址不会被公开。 必填项已用*标注