linux轻量级的图形库,基于Microwindows的嵌入式Linux轻量级图形应用库的设计

本文引用地址:http://www.eepw.com.cn/article/201809/388534.htm

这里基于Linux2.4.19和Microwindows0.89进行讨论,主要难点:一是将Microwindows层次打乱后如何进行代码的重构,用最少的代码实现最有效的功能,二是提供中文显示和中文输入的支持。

2.1 结构重构

(1)底层驱动层

整个系统的核心是键盘和屏幕数据结构,它们在Linux系统中都是被当作文件来进行访问,其C代码主要在src/drivers和src/engine目录下。

键盘是通过fd=open(/dev/tty,O_NONBLOCK)打开,利用ioctl来进行操作的,涉及到的文件有kbd_ttyscan.c(提供键盘的打开、关闭等支持)。

屏幕驱动是基于Linux内核中framebuffer,这要求在编译内核的时候选择支持framebuffer编译参数选项。它是通过fd=open(env=/dev/fb0)打开,用SCREENDEVICE的指针PSD指向这片显存,然后对这片显存根据屏幕的不同位色设置情况为中间引擎层提供相应的图形操作支持,包括画点线、图片显示、屏幕拷贝以及中西文字的显示等等。其涉及到的文件较多,类型定义与函数声明的头文件有fb.h、genfont.h和genmem.h,C代码文件有src_fb.c(提供基本的framebuffer打开和关闭等支持)、fb*.c(*为2、4、8、16、24、32,提供对应不同灰度级别和不同位色屏幕的支持)、genmem.c(提供显存分配)和genfont.c(提供中西文字体显示支持)。

(2)中间引擎层

这一层是在底层驱动层提供的设备对象支持下,完成图形在实虚屏之间的转换(以PSD指针作为参数来进行),实现各种图形功能函数(以Gd...为开头)。相关的类型定义与函数声明头文件有include目录下的mwtypes.h、swap.h和winkbd.h,C代码主要有src/engine目录下的devarc.c(提供弧线和椭圆绘制支持)、devclip.c(提供剪贴支持)、devdraw.c(提供基本的绘图支持)、devfont.c(提供字体字库支持)、devimage(提供图片绘制拷贝支持)、devkbd.c(提供键盘控制支持)、devrgn.c(提供区域操作动态分配支持)和devpal*.c(*为1、2、4、8,提供调色板支持)。

在分析完驱动层和引擎层后,将它们的相关文件放在同一个目录下,利用gcc编译器编译,链接生成目标文件,然后用ar归档命令即可生成库文件(动态库和静态库),只需要将这个库文件提交给二次开发人员即可进行图形应用程序的开发。

2.2 中文支持

在嵌入式Linux应用系统中,控制台驱动程序和Framebuffer驱动程序对字符的处理都是以单字节为基础的,所以需要进行中文化的改造。

(1)中文显示的支持

这里采用16×16点阵的GB2312字库,字模文件hzk.bin存放在/font/chinese目录下。对于一个需要显示的字符串,首先判断其是属于哪种编码集,如果是ASCII码,就调用Microwindows提供的GdText函数进行显示;如果是汉字,则根据其机内码得到区位码,计算该汉字字模在字模文件中的偏移量,读出该汉字字模,调用底层DrawPixel函数的像素点,并显示这个汉字。

(2)中文输入的支持

由于Microwindows对输入法没有任何支持,所以这一块几乎所有的代码都需要重新编写。目前只提供GB2312字库的拼音输入方法,且只能逐字输入(见图2),同时也默认字模文件hzk.bin存放在/fonts/chinese目录下。

先定义一个拼音结构体:

struct PY_index

{ char PY[6];//拼音的韵母

char *PY_mb;//对应的汉字机内码

};

然后根据GB2312字库和汉字的声母、韵母定义拼音输入法查询码表。查询码表分两部分,第一部分是二级索引表,它将每个拼音和汉字对应起来:

stmct PY_index PY_index_a[5]={

{,阿啊呵腌嗄锕吖},

……

{i,爱哀挨碍埃癌艾唉矮哎皑蔼隘暖霭捱嗳瑷嫒锿嗌砹”},

{o,奥澳傲熬敖凹袄懊坳嗷拗鏖骜鳌翱岙廒遨獒聱媪螯鏊}};

……

strucet PY_index PY_index_z[36]={{a,杂扎砸咋咂匝拶},

{ai,在再载灾仔宰哉栽崽甾),

{an,咱赞暂攒簪糌瓒拶昝趱錾),

……

{un,尊遵樽鳟撙“},

{uo,作做坐座左昨琢佐凿撮柞嘬怍胙唑笮阼祚酢}};

street PY_index PY_index_end [1] = {{,

PY_mb_space}

};

其中PY_mb_space为常量0xffff,它用于两个地方,一是i,v,u三个字母不能作为声母,所以它们没有对应的汉字,这里就以0xffff来约定;二是表示拼音表的结束。2302da7ff0e085beee58f6aa6f148d9f.png

第二部分是一级索引表,它将26个首字母(即声母)和其韵母对应起来:

street PY_index code *code PY_index_headletter[27]=

{

PY_index_a,

PY_index_b,

PY_index_z,

PY_ index_end

};

有了上面定义的两个索引表,就可以进行汉字的输入了。

3 结论

图形应用库提供了图形系统的初始化、键盘操作、区域块拷贝、中西文的输入显示、基本图形绘制等共计40多个API功能函数,很好的满足了低端嵌入式Linux系统的图形应用程序开发的需要。该图形应用库只有70多KB大小,占用资源少,性能稳定,很好的满足了低端信息终端和控制系统等嵌入式Linux产品设计的需要, 目前已经成功应用于嵌入式税控收款机(pos)、自动柜员机(ATM)等嵌入式产品中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值