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

(请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365)

已经实现了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本地化开发的话,这几篇博客正好是不错的起点。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/12 HiiGraphics-Font下。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值