(请保留 -> 作者:罗冰 )

刚从大学毕业那会,对操作系统极其入迷,总想搞清楚底层是怎么运行的。其中最感兴趣的是图形的显示,BIOS对硬件的控制等。找了很多资料看,正好公司的一些项目上也需要用到,就这么磕磕碰碰地实现了各种显示的代码。

Foxdisk的代码中,Vesa.c和Vesa.h就包含了显示的所有信息。主要是遵循了vesa的标准进行显示,采用C嵌汇编的方式来编写。目前,几乎所有的机器都支持VESA标准,而在X86平台下编程就是基于此标准的。VESA标准在原有BIOS提供的API的基础上,提供了一组扩展BIOS功能调用。对于标准VGA下的模式,仍然可以使用基本BIOS调用,但对于扩展模式,其许多操作如模式设置及视频缓冲读写等,则只能通过VESA标准提供的扩展BIOS来实现。

在VESA标准下,视频缓冲是以分页映射的方式进行操作。其基窗口一般为在0xA0000处,每页为64K。整个视频缓冲都通过映射到此窗口而得以直接存取。一般的图形编程步骤如下:

  • 设置显示模式(如0x103为 800×600 256色的配置)
  • 设置颜色寄存器
  • 按照图形显示的原理编写画点、画线、画圆等基本函数。

过多的细节不用纠结,Vesa.c中提供了画点函数putpixel256()。把屏幕当做一个大画布,设置模式的时候知道这块画布多大,用画点函数绘制即可。Foxdisk使用的是模式0x105,也即1024×768,256色。想像一下,有张宽1024像素点,长768像素点的画布,有支可在画布任何坐标处画点的笔,应该是什么画都可以画出来了,包括汉字。

Foxdisk中显示汉字,大致可以分为两步:

  1. 提取需要的汉字字模,保存到程序内部;
  2. 调用Font.c中显示汉字的函数,将需要的汉字显示在屏幕上。

Vesa.c和Font.c中屏蔽了很多显示的细节,特别是对各种字体及字体大小的处理。在设计之初,考虑去兼容各种不同的字体,比如黑体、楷体、宋体等等。代码中针对不同的字体,提供了各种编译用的开关。实际程序中,主要用了16×16宋体和24×24楷体,从提取汉字库的批处理命令可以看出来。

在博客“Foxdisk09-工具篇”中,已经初略的介绍了提取汉字库的工具了。我是为了能自动针对所有用到汉字的代码,自动提取汉字字模,开发的这些小工具。下面具体介绍下如何提取字库。

所谓无字库技术,就是在程序中建立一个类似字库的字库数组来代替字库。程序中建立的字库某种意义上独立于程序中显示程序。也就是存在这样的可能:单独对字库数组进行压缩,在使用的时候重新解压。这个特性在嵌入式的应用中非常有用,可以节约不少的程序空间。

一般说来,提取汉字字库的步骤应该是这样的:

1) 对包含需要提取汉字的源文件进行文法分析,析取出需要提取字模的汉字

2) 对提取出的汉字再次分析,并去除重复的汉字打开相应的汉字库,提取需要的字模,并按规则形成新的字库数组

3) 对照上一篇博客的说明,设计16×16及24×24的汉字字模结构体。

struct       hzk16_typ{         /*  汉字字模结构体  */

unsigned int code;

unsigned int array[16];

};

struct       hzk24_typ{         /*  汉字字模结构体  */

unsigned int code;

unsigned char array[3*24];

};

最终会将字模以上述数据结构的方式存储,Foxdisk中存储生成的文件为HZTABLE.H和HZK24.H。

具体的提取代码可以参照ehz24.c和etrhz.c,这两个文件的代码量都在400行左右。核心工作在于分析指定的文件,从中提取出需要转换字模的汉字。

为了便于分析,也为了程序编写简单,对指定的文件是有要求的。必须保证在提取的文件中字符串中没有//和/* 字符,否则可能会提取错误。提取程序并没有去进行字符串内部的语义分析,否则要处理的情况太多了。 代码就不贴出来了,放不下。对照编程的想法,以及代码,还是比较容易看明白运作的机制的。

Foxdisk11-小字库显示汉字2相关推荐

  1. 【STM32F429】第18章 ThreadX GUIX汉字显示(小字库)

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第18章       ThreadX GUIX汉字显示(小字库) ...

  2. stm32汉字字库显示实验与OLED的使用(开始于2021-09-01)

    stm32汉字字库显示实验与OLED的使用 1.字库的使用 GBK字库的简介: GBK库的由两部分组成,如下图: 高位从0x81开始是为了兼容ASII字符,因为未扩展的ASII字符是从0-128,即0 ...

  3. 在.Net Micro Framework中显示汉字

    摘要:MF平台支持的字体是专有格式,扩展名为tinyfnt,需要用专门的转化工具才能把windows平台上的字体转换为tinyfnt字体.在.Net Micro Framework SDK中提供了一个 ...

  4. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...

    1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...

  5. 在3D场景中显示汉字

    2019独角兽企业重金招聘Python工程师标准>>> TWaver 3D for Flex本身支持3D文字的显示,但是用户必须嵌入一套字库才可以.使用传统的方式,显示3D文字. [ ...

  6. emWin—显示汉字

    emWin-显示汉字 最近接触了emWin,需要做一个简单的界面,尝试在基于stm32f429的触摸屏上显示汉字,根据例程里面的操作,字库取模得到了C文件,添加到keil工程里面,最后在触摸屏上却没有 ...

  7. DGUS屏如何实现超大点阵字库显示?

    有个别需求要实现超大的汉字显示,DGUS屏内部字库空间比较小,一个大点阵全编码字体占用的空间太大,甚至有时候生成超过了32M,对于其他字库空间需要利用的就非常不方便,而且点阵越大生成字库特别浪费时间. ...

  8. 使用Tslib在触摸屏上显示汉字

    终于到了在触摸屏上显示汉字了,真正写代码.测试的时间是1天,在此之前的一切准备.学习花费约2周到3周时间.而为了获取触摸屏上显示的图像,花费约2天.由于网络驱动已经接近于放弃状态,NFS用不了,只好用 ...

  9. 点阵字体显示系列之三:使用ncurses显示汉字

    ncurses这个库,最早听说应该是当年刚接触Linux的时候,当时,我们宿舍就一个人在鼓捣Linux,他是我们后来的班长,如今在ZLG混,也不知混得怎么样了.我也不知道哪条神经线路出现故障了,竟然傻 ...

最新文章

  1. 【PAT乙级】1081 检查密码 (15 分)
  2. BZOJ-1024 生日快乐 DFS+一丝sb的数学思考
  3. Linux C 内存管理
  4. 别再拿div+css误导人了
  5. spring test---restful与文件上传
  6. Mac笔记本安装Webstrom
  7. 不相交轮换的乘积怎么求_浅谈两种求条件极值的方法
  8. 【java学习之旅】——JSP入门
  9. Python Excel教程之如何将多个 excel 文件合并为一个文件(教程含源码)
  10. 从键盘上输入10个数,求其平均值。
  11. 成功之路散文连载之笨人论
  12. 一犯人在执行死刑前三天供出祖传治癌奇方
  13. MHT代码阅读(1)
  14. HTML5轻松实现全屏视频背景
  15. 2023年清华大学电子与通信工程考研上岸前辈备考经验
  16. [ASP.NET网站开发] web程序设计,期末作业,问卷填写与学生选课管理系统(超简单,容易懂!课程考核必过)(使用内置数据库)
  17. CRM下午茶(十)-从淘江湖说起
  18. 软件缺陷分析-软件测试之犯罪心理学
  19. Linux对一个目录及其子目录所有文件添加权限
  20. unity显示当前帧数的脚本

热门文章

  1. 怎么做ssl证书配置?
  2. 前端优化中的防抖与截流
  3. 最低销售量计算机公式,最低、最高、安全库存量的计算公式
  4. 【javaScript】原生实现窗口拖动效果
  5. 关于BeanUtils.populate
  6. 人工智能AI学习路线01-AI概念
  7. 深圳招银java社招都有hr面吗,深圳招银网络科技
  8. 物联网卡零售应用的真实案例
  9. 更改PPT的模板名称
  10. 未知USB设备(设备描述符请求失败)