UEFI开发探索19 – 使用HII显示汉字4

(请保留->发布地址: http://yiiyee.cn/blog/author/luobing/ )

已经实现了UEFI Shell下使用SimpleFont和Font,在Graphics模式下来实现就相对容易很多了。

我大部分的工作都是在整理文件,以及按照之前的代码结构,专为Hii构建了源代码文件,把一些细节封装起来,以备后用。

图1 整理好的源代码

可以讲解的地方不多,主要是在开发中遇到的一些问题:

  1. FontName的作用。在创建Font Package以及使用StringToImage的时候,会遇到需要设置FontName。我都是随便给了个名字,具体有什么作用,目前没有发现,也许方便调试?
  2. 变长数组。使用StringToImagge的时候,EFI_FONT_INFO的结构体成员CHAR16 FontName[…]是变长数组。这应该是C99支持的特性,申请内存的时候没有注意到,直接使用sizeof获取结构体长度去申请的,明显不够用,导致系统崩溃了。
  3. 这篇博客的代码中,使用了SimpleFont和Font两种字体。SimpleFont的字模存在于example.data中,均为Unicode汉字编码。而Font也使用了这个字模,另外还增加了Ascii码的字模。记录下来,防止以后忘记了。
  4. StringToImage用到了好几个数据结构,在UEFI Spec中都能找到。目前所写的代码只够用来演示,有很多细节都没有考虑,包括处理细节的封装、接口的处理等。这些代码用在Option ROM的商用开发上有点不够,需要的时候再来整理吧。
  5. 还是StringToImage,参数Flags有很多值可以选。我调试的时候没有注意,发现参考的代码中,文字的背景色怎么都修改不了。浪费了半个小时候,才找到是赋值不对,应该去掉EFI_HII_OUT_FLAG_TRANSPARENT。这些常量定义应该好好抠一抠。
  6. 文字显示其实还有许多的效果需要去探索,比如文字的缩放、斜体、阴影等。我觉得很多效果只要稍微改几个参数就能实现了。
  7. 相比于我用画点函数实现汉字的显示,Hii的方法灵活很多,相对应的代码量也很难控制。当然,如果只是使用英文的话,采用Hii会更好。另外,它也可以很方便的实现语言的切换,这很适合开发一个通用的GUI库。
  8. 最让我喜欢的是,采用Hii后,可以直接在代码中使用L”xxxx”型的Unicode字符串了。之前我的画点实现汉字显示,采用的是国标码寻找字模,无法使用Unicode字符串。这倒提醒我了,我可以将以前的方法进行改进。
  9. 汉字的逗号好像没有提取出来,小问题,先放放吧。

将代码编译,执行的效果如下:

图2 程序运行效果

代码中定义的字符串是这样的:

const CHAR16* TestStr=(const CHAR16 *)L”君不见黄河之水天上来,奔流到海不复回。”;    
const CHAR16* TestStr1=(const CHAR16 *)L”君不见高堂明镜悲白发,朝如青丝暮成雪。”;   

图2中,可以很明显看到中文的逗号不见了。

到此为止,关于Hii多文字显示(主要针对汉字)的内容就全部探索完成了。虽然还有很多细节需要去深入,但已经不存在结构性的理解盲点了。

未来如果需要UEFI BIOS本地化开发的话,这几篇博客正好是不错的起点。

百度云链接:https://pan.baidu.com/s/1gccSosw8_UAGTI5gZPnLCA
提取码:dx23
代码在 12 HiiGraphics-Font下。

3,813 total views, 1 views today

《UEFI开发探索19 – 使用HII显示汉字4》有6个想法

    1. 没有深究,估计如此。提取字库的工具,回头重写一个,现在用的是 UEFI原理与编程 的代码。

  1. 你好,我添加中文字库后,EDK在BIOS setup下,中文只显示出一半的长度出来,比如本来应该是“选择语言”,实际显示出来的是“选择”,你知道这是什么原因吗?

  2. 你好,我使用HII Font,导入字体后,可以显示,不过想通过EFI_FONT_INFO_RESIZE修改字体大小,一直没有成功,可能是什么原因?

发表评论

电子邮件地址不会被公开。