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

上传人:m**** 文档编号:563755747 上传时间:2024-03-19 格式:DOC 页数:4 大小:19.50KB
返回 下载 相关 举报
可移植的256色图形用户界面的设计_第1页
第1页 / 共4页
可移植的256色图形用户界面的设计_第2页
第2页 / 共4页
可移植的256色图形用户界面的设计_第3页
第3页 / 共4页
可移植的256色图形用户界面的设计_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

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

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

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

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

4、同分辨率之间的区别,表达在编程上就是同一屏幕坐标映射到显存的地址不同,但映射机理却是一样的。详细地说,坐标(x,y)对应显存的偏移地址(相对于A000)为Addr=-vga-idth*y+x2.分页机制不同。SuperVGA使用256K、512K或1的显示存储器构造。为了使处理器可通过一个64K主窗口来存取这样大的显示存储器,SuperVGA有一个存储器分页机制,使得只将显示存储器的一局部映射到处理器的地址空间。值得注意的是,不同的VGA产品,其页的大小不同,页起始地址的粒度也是可变的。详细的页选择算法请查阅制造商提供的资料。不同的显示形式,显示一屏图像所需的页数是不同的。除了可移植性外,效率

5、也是一个不可无视的因素。图形系统的核心局部应使用汇编语言编程。这不仅是因为汇编语言的效率高,而且还因为汇编语言子程序的可再用性和可协用性也很好。核心局部应非常重视下面几点:(1)减少不必要的页边界检查次数;(2)只有在必要时才进展页选择;(3)选择高效的机器指令。现举例说明。程序1是图像显示系统中常用的函数,其功能是将解包后的图像数据送到显存。为便于阅读同时给出了语言调用原型。程序在传送每一行数据时,提早预测是否会遇到页边界,假如没有,直接传送;假如有,那么将数据分成两局部,分别传送,中间插入页选择。所有的传送均用字操作代替字节操作。页边界检查只有一次,分页操作只有在必要时才发生,图像的显示用

6、最高效的指令REPVS。程度1:;原型:vidLineDup(intx,inty,intnu,harfar*ptr);参数:;x,y-屏幕坐标;nu-本行的像素个数;ptr-指向像素数据的远指针LineDupprfarpushbpvbp,spsubsp,2;RDReservedfrlalvar.pushdspushespushsipushdireservedequbp-2;Lalvar.saveseg(DGRUP)xequbp+6;Largedelyequbp+8nuequbp+10ffsequbp+12psegequbp+14vreserved,dsvds,psegvsi,ffs;DS:SI

7、图像数据所在源地址vax,0a000h;显存段址ves,ax;ES:DI显存目的地址vax,ypushdsvds,reservedulrdptrDGRUP:-vga-idthppdsaddax,xaddx,0vdi,ax;DI=-vga-idth*y+xvah,dl;进位局部(DL)=页号alldrdptrs:-PageSeletvx,nu;本行要传送字节数vbx,xaddbx,di;检测传送是否在一个页内jnDup-In-ne-Pagesubx,bx;X=本页字节数,BX=下页字节数shrx,1;X/2=字数repvs;本页内的传送adx,0repvsb;处理可能的奇数字节数inah;调整页

8、号alldrdptrs:-PageSeletvx,bx;新页内要写的字节数jxzDup-DneDup-In-ne-Page:shrx,1;X/2=字数repvs;图像传送adx,0repvsb;处理可能的奇数字节数Dup-Dne:ppdippsippesppdsvsp,bpppbpretLineDupendp二、表格驱动的根本思想根据上面的分析,用以驱动显示系统的表格,至少应当包含以下工程:(1)实际显示形式:vga-de(2)程度分辨率:vga-idth(3)垂直分辨率:vga-depth(4)页选择例程的入口地址:PageSelet(5)当前显示方式所使用的最大页号:vga-pages这个

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

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

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

12、GA256.H):/*统一的形式集*/enuTVGA-DETVGA320x200=0,TVGA640x400=1,TVGA640x480=2,TVGA800x600=3,TVGA1024x768=4,;vidTVGA256-driver(vid);vidPVGA256-driver(vid);vidAVGA256-driver(vid);.vidVESA256-driver(vid);externintfar-delTVGA256-driver-far;externintfar-delPVGA256-driver-far;externintfar-delAVGA256-driver-far;.

13、externintfar-delVESA256-driver-far;/*支持的VGA集合*/enuVGAsUnKnnVGA,TridentVGA,ParadiseVGA,AheadVGA,.VesaVGA;/*对应的BGI驱动程序名*/unsignedhar*Drivers=TVGA256,TVGA256,AVGA256,.VESA256,;externintDetetVGA(vid);/*功能:检测显示卡的型号返回值:0-Unkn1-TridentVGA2-ParadiseVGA.x-不能检测出的VGA,但支持VESA返回值同时写入全局变量vga-type*/externintVesaFu

14、nd(vid);/*功能:检测VESABIS的存在性返回:0-不支持VESA;其它-VESA版本号(0x0102即1.02版);返回值同时写入全程变量vesa-fund.*/externvidInitVesa(vid);/*功能:初始化VESA.根据-vga-de形式号换算成VESA的标准形式号填写页粒度(inGranularity),页大小(inSize),和分页例程的入口地址(inFunPtr)VESA的标准形式解释如下:100h-640x400256101h-640x480256102h-800x60016103h-800x600256104h-1024x76816105h-1024x7

15、68256et.InitVesa供给InitVGA调用*/externvidInitVGA(intde);/*功能:初始化显示系统(自动调用DetetVGA检测显示卡)参数:de=TVGA320x200(0)TVGA640x400(1)TVGA640x480(2)TVGA800x600(3)TVGA1024x768(4)返回:InitVGA没有显式的返回值,但它初始化以下全程变量:vga-de,vga-idth,vga-depth,vga-pages,PageSelet必要时自动调用InitVesa*/externintvga-type;externintvga-de;externintvga

16、-idth;externintvga-depth;externintvga-pages;externintvga-pages;externharpage-nuber;externintvesa-fund;.程序3(初始化显示系统的程序片断):.intGraphDriver,Graphde;unsignedhar*bgiDriver=PVGA256;bgiDriver=DriversDetetVGA();GraphDriver=installuserdriver(bgiDriver,NULL);Graphde=TVGA800x600;initgraph(GraphDriver,Graphde,);.参考文献1来文占等编译.SuperVGA高级编程指南.北京:北京科海培训中心,1991.5.2张一波编译.SuperVGA与VESA编程指南.北京:海洋出版社,1992.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

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