资源描述:
《可移植的256色图形用户界面的设计(1)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、可移植的256色图形用户界面的设计(1)摘要该文从软件可移植性的角度指出设计256色图形用户界面时应当注意的问题,在对SuperVGA产品进行分析的基础上,提出了基于表格驱动的程序设计思想,并给出了范例。随着各种超级VGA的出现,同时具有高分辨率和丰富色彩的图形用户界面已经成为程序员和用户共同追求的目标。然而由于各制造商提供的VGA产品之间的差异,使得高分辨率256色图形界面的兼容性受到影响,常常会出现这样的情况:在一个显示系统下运行良好的程序,在另一种显示系统下变得面目全非,甚至根本不显示。这表明程序员对程序的可移植性重视不够,或对各种显示设备缺乏足够
2、的了解。软件的可移植性是指软件产品从一个硬件/软件环境转移到另一个硬件/软件环境的难易与繁简程度。它从软件对新环境的适应性这一方面,反映了软件的质量。为了提高软件的可移植性,应尽量使软件与具体的设备无关,即提高软件的设备独立性。对于256色图形界面而言,就是要使程序不依赖于某种特定的显示器。例如,程序员没有任何理由假定用户使用的是TVGA。为此,程序员必须提供显示卡的常规检测例程,并能根据检测的结果决定图形算法的具体实现。提高软件设备独立性的方法有很多,表格驱动就是其中一种。所谓表格,就是根据需要设计的数据结构。表格中的数据由检测例程填写。表格中包含哪些
3、栏目,应在对各制造商提供的SuperVGA产品足够了解的基础上取舍,栏目应体现各产品之间的差异。一、SuperVGA编程综述SuperVGA产品在体系结构上和标准的IBMVGA有所不同。但编程思想基本上是一样的,这些编程方法已有许多文章介绍,这里不再重复。影响256色图形界面可移植性的主要障碍来自各制造商提供的VGA产品的下面几点差异。1.显示模式的定义不同。如5DH对TVGA而言,代表640×480×256色模式,对PVGA而言却代表1024×768×16色模式。因此,直接用这种模式号初始化显示系统是不可取的。和显示模式密切相关的是水平分辨率和垂直分辨
4、率。尽管各VGA的256色显示模式定义迥异,但大都支持如下几种流行的分辨率,现用统一的模式号定义见附表。@@;附表@@不同分辨率之间的区别,体现在编程上就是同一屏幕坐标映射到显存的地址不同,但映射机理却是一样的。具体地说,坐标(x,y)对应显存的偏移地址(相对于A000)为Addr=-vga-width*y+x2.分页机制不同。SuperVGA使用256K、512K或1M的显示存储器结构。为了使处理器可通过一个64K主窗口来存取这样大的显示存储器,SuperVGA有一个存储器分页机制,使得只将显示存储器的一部分映射到处理器的地址空间。值得注意的是,不同的
5、VGA产品,其页的大小不同,页起始地址的粒度也是可变的。具体的页选择算法请查阅制造商提供的资料。不同的显示模式,显示一屏图像所需的页数是不同的。除了可移植性外,效率也是一个不可忽视的因素。图形系统的核心部分应使用汇编语言编程。这不仅是因为汇编语言的效率高,而且还因为汇编语言子程序的可再用性和可协用性也很好。核心部分应十分重视下面几点:(1)减少不必要的页边界检查次数;(2)只有在必要时才进行页选择;(3)选择高效的机器指令。现举例说明。程序1是图像显示系统中常用的函数,其功能是将解包后的图像数据送到显存。为便于阅读同时给出了C语言调用原型。程序在传送每一
6、行数据时,提前预测是否会遇到页边界,如果没有,直接传送;如果有,则将数据分成两部分,分别传送,中间插入页选择。所有的传送均用字操作代替字节操作。页边界检查只有一次,分页操作只有在必要时才发生,图像的显示用最高效的指令REPMOVSW。程度1:;原型:voidLineDump(intx,inty,intnum,charfar*ptr);参数:;x,y-屏幕坐标;num-本行的像素个数;ptr-指向像素数据的远指针LineDumpprocfarpushbpmovbp,spsubsp,2;WORDReservedforlocalvar.pushdspushes
7、pushsipushdireservedequ[bp-2];Localseg(DGROUP)xequ[bp+6];LargeModelyequ[bp+8]numequ[bp+10]offsequ[bp+12]psegequ[bp+14]movreserved,dsmovds,psegmovsi,offs;DS:SI图像数据所在源地址movax,0a000h;显存段址moves,ax;ES:DI显存目的地址movax,ypushdsmovds,reservedmulwordptrDGROUP:-vga-widthpopdsaddax,xadcdx,0mov
8、di,ax;DI=-vga-width*y+xmovah,dl;进位部分(DL)