可移植的256色图形用户界面的设计

上传人:ldj****22 文档编号:33119546 上传时间:2018-02-13 格式:DOC 页数:13 大小:33KB
返回 下载 相关 举报
可移植的256色图形用户界面的设计_第1页
第1页 / 共13页
可移植的256色图形用户界面的设计_第2页
第2页 / 共13页
可移植的256色图形用户界面的设计_第3页
第3页 / 共13页
可移植的256色图形用户界面的设计_第4页
第4页 / 共13页
可移植的256色图形用户界面的设计_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《可移植的256色图形用户界面的设计》由会员分享,可在线阅读,更多相关《可移植的256色图形用户界面的设计(13页珍藏版)》请在金锄头文库上搜索。

1、可移植的 256 色图形用户界面的设计摘 要 该文从软件可移植性的角度指出设计 256 色图形用户界面时应当注意的问题,在对 SuperVGA 产品进行分析的基础上,提出了基于表格驱动的程序设计思想,并给出了范例。随着各种超级 VGA 的出现,同时具有高分辨率和丰富色彩的图形用户界面已经成为程序员和用户共同追求的目标。然而由于各制造商提供的 VGA 产品之间的差异,使得高分辨率 256 色图形界面的兼容性受到影响,常常会出现这样的情况:在一个显示系统下运行良好的程序,在另一种显示系统下变得面目全非,甚至根本不显示。这表明程序员对程序的可移植性重视不够,或对各种显示设备缺乏足够的了解。软件的可移

2、植性是指软件产品从一个硬件/软件环境转移到另一个硬件/软件环境的难易与繁简程度。它从软件对新环境的适应性这一方面,反映了软件的质量。为了提高软件的可移植性,应尽量使软件与具体的设备无关,即提高软件的设备独立性。对于 256 色图形界面而言,就是要使程序不依赖于某种特定的显示器。例如,程序员没有任何理由假定用户使用的是 TVGA。为此,程序员必须提供显示卡的常规检测例程,并能根据检测的结果决定图形算法的具体实现。提高软件设备独立性的方法有很多,表格驱动就是其中一种。所谓表格,就是根据需要设计的数据结构。表格中的数据由检测例程填写。表格中包含哪些栏目,应在对各制造商提供的 SuperVGA 产品足

3、够了解的基础上取舍,栏目应体现各产品之间的差异。一、SuperVGA 编程综述SuperVGA 产品在体系结构上和标准的 IBM VGA 有所不同。但编程思想基本上是一样的,这些编程方法已有许多文章介绍,这里不再重复。影响 256 色图形界面可移植性的主要障碍来自各制造商提供的 VGA 产品的下面几点差异。1.显示模式的定义不同。如 5DH 对 TVGA 而言,代表640480256 色模式,对 PVGA 而言却代表 102476816 色模式。因此,直接用这种模式号初始化显示系统是不可取的。和显示模式密切相关的是水平分辨率和垂直分辨率。尽管各 VGA 的 256 色显示模式定义迥异,但大都支

4、持如下几种流行的分辨率,现用统一的模式号定义见附表。;附表不同分辨率之间的区别,体现在编程上就是同一屏幕坐标映射到显存的地址不同,但映射机理却是一样的。具体地说,坐标(x,y)对应显存的偏移地址(相对于 A000)为Addr=-vga-width*y+x2.分页机制不同。SuperVGA 使用 256K、512K 或 1M的显示存储器结构。为了使处理器可通过一个 64K 主窗口来存取这样大的显示存储器,SuperVGA 有一个存储器分页机制,使得只将显示存储器的一部分映射到处理器的地址空间。值得注意的是,不同的 VGA 产品,其页的大小不同,页起始地址的粒度也是可变的。具体的页选择算法请查阅制

5、造商提供的资料。不同的显示模式,显示一屏图像所需的页数是不同的。除了可移植性外,效率也是一个不可忽视的因素。图形系统的核心部分应使用汇编语言编程。这不仅是因为汇编语言的效率高,而且还因为汇编语言子程序的可再用性和可协用性也很好。核心部分应十分重视下面几点:(1)减少不必要的页边界检查次数;(2)只有在必要时才进行页选择;(3)选择高效的机器指令。现举例说明。程序 1 是图像显示系统中常用的函数,其功能是将解包后的图像数据送到显存。为便于阅读同时给出了 C 语言调用原型。程序在传送每一行数据时,提前预测是否会遇到页边界,如果没有,直接传送;如果有,则将数据分成两部分,分别传送,中间插入页选择。所

6、有的传送均用字操作代替字节操作。页边界检查只有一次,分页操作只有在必要时才发生,图像的显示用最高效的指令 REP MOVSW。程度 1:;原型:void LineDump(int x,int y, int num, char far*ptr);参数:; x,y-屏幕坐标; num-本行的像素个数; ptr-指向像素数据的远指针LineDump proc farpush bpmov bp,spsub sp,2;WORD Reserved for local var.push dspush espush sipush direserved equ bp-2;Local seg(DGROUP)x e

7、qu bp+6;Large Modely equ bp+8num equ bp+10offs equ bp+12pseg equ bp+14mov reserved,dsmov ds,psegmov si,offs ;DS:SI 图像数据所在源地址mov ax,0a000h;显存段址mov es,ax ;ES:DI 显存目的地址mov ax,ypush dsmov ds,reservedmul word ptr DGROUP:-vga-widthpop dsadd ax,xadc dx,0mov di,ax ;DI=-vga-width*y+xmov ah,dl ;进位部分(DL)= 页号ca

8、ll dword ptr cs:-PageSelectmov cx, num ;本行要传送字节数mov bx, cxadd bx,di ;检测传送是否在一个页内jnc Dump-In-One-Pagesub cx,bx ;CX=本页字节数,BX=下页字节数shr cx,1 ;CX/2=字数rep movsw ;本页内的传送adc cx,0rep movsb ;处理可能的奇数字节数inc ah ;调整页号call dword ptr cs:-PageSelectmov cx,bx ;新页内要写的字节数jcxz Dump-DoneDump-In-One-Page:shr cx,1 ;CX/2=字数

9、rep movsw ;图像传送adc cx,0rep movsb ;处理可能的奇数字节数Dump-Done:pop dipop sipop espop dsmov sp,bppop bpretLineDump endp二、表格驱动的基本思想根据上面的分析,用以驱动显示系统的表格,至少应当包含下列项目:(1)实际显示模式:vga-mode(2)水平分辨率:vga-width(3)垂直分辨率:vga-depth(4)页选择例程的入口地址:PageSelect(5)当前显示方式所使用的最大页号:vga-pages这个表格由图形初始化例程来填写。图形初始化例程接收的显示模式是统一的模式号,这样可以撇开

10、具体的设备,如 InitVGA(TVGA800600)。该例程调用显示设备检测程序DetectVGA 来判断显示器的类型,从而填写表格中的各栏目,并初始化图形系统为所需的图形方式。所有图形算法都要查此表。除了用上述方法来实现兼容外,视频电子学标准协会(VESA)为我们提供了另一种方法。VESA提供了一组附加的 BIOS 功能,这组功能以标准的方式访问 SuperVGA 扩充的模式。VESA 的附加功能都是通过BIOS 中断 10H 的 4FH 功能来实现的。VESA 的子功能 01能返回非常有用的 SuperVGA 模式信息,包括分页例程的地址。因此,程序员可以按照 VESA 的标准来编写图形

11、系统,这样的程序可以在所有支持 VESA 的显示器上运行。由于VESA 包括了世界上的主要 VGA 供应商,写出来的程序可移植性是很好的。但是,其效率却可能是最低的。所以最好采用一种折衷的办法,对于熟悉的产品,可以不用 VESA的功能,对于不熟悉(资料不全)或检测不出来的显示器尝试用 VESA 提供的手段来编程,当然要检测显示设备是否支持 VESA。有时出于某种考虑,不希望支持所有显示设备的代码集中在一个程序中,可以为每个显示设备分别提供驱动模块,主程序根据检测的结果选择一个合适的模块加载。Borland的 C+就是这样,它有一套 BGI 驱动程序,各驱动程序提供统一的图形函数接口。笔者在实际

12、工作中,为每一种显示设备编写了一个 256 色的 BGI 格式的驱动程序,这样,在编写图形系统时,再也没有必要考虑用户的实际显示设备了。三、范 例本文附有两个图形显示的例子。ShowGif 能显示 16/256色 GIF 格式图像,能以任何 256 色模式启动,支持多种显示器。图像可以漫游,并可随时通过按键切换显示方式。Main 则是一个 BGI 驱动的鼠标/ 键盘控制的 256 色汉字图形菜单。它自己会挑选一个合适的 BGI,也可以从命令行指定一个 BGI(比如指定 VESA256 给 TVGA 显示器)。限于篇幅,这里仅给出有关的数据结构和部分函数的说明(程序 2)。然后给出一个初始化显示

13、系统的 C 语言片断(程序 3)。程序 2():/* 统一的模式集 */enum TVGA-MODETVGA320x200=0,TVGA640x400=1,TVGA640x480=2,TVGA800x600=3,TVGA1024x768=4,;void TVGA256-driver(void);void PVGA256-driver(void);void AVGA256-driver(void);.void VESA256-driver(void);extern int far-Cdecl TVGA256-driver-far;extern int far-Cdecl PVGA256-driv

14、er-far;extern int far-Cdecl AVGA256-driver-far;.extern int far-Cdecl VESA256-driver-far;/* 支持的 VGA 集合 */enum VGAsUnKnownVGA,TridentVGA,ParadiseVGA,AheadVGA,.VesaVGA;/* 对应的 BGI 驱动程序名 */unsigned char *Drivers=“TVGA256”,“TVGA256”,“AVGA256”,.“VESA256”,;extern int DetectVGA(void);/* 功 能:检测显示卡的型号返回值:0-Unk

15、nowm1-Trident VGA2-Paradise VGA.x-不能检测出的 VGA,但支持 VESA返回值同时写入全局变量 vga-type */extern int VesaFound(void);/* 功 能:检测 VESA BIOS 的存在性返 回:0-不支持 VESA;其它-VESA 版本号 (0x0102 即版);返回值同时写入全程变量 vesa-found. */extern void InitVesa(void);/* 功 能:初始化 VESA.根据-vga-mode 模式号换算成VESA 的标准模式号填写页粒度(WinGranularity),页大小(WinSize),和

16、分页例程的入口地址(WinFuncPtr)VESA 的标准模式解释如下:100h-640x40056101h-640x48056102h-800x600 16103h-800x60056104h-1024x7616105h-1024x7625etc.InitVesa 供给 InitVGA 调用 */extern void InitVGA(int mode);/* 功 能:初始化显示系统(自动调用 DetectVGA 检测显示卡)参 数:mode=TVGA320x200(0)TVGA640x400(1)TVGA640x480(2)TVGA800x600(3)TVGA1024x768(4)返 回:InitVGA 没有显式的返回值,但它初始化下列全程变量:vga-mode,vga-width,vga-depth,vga

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 社科论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号