教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> 微机UNIX直接视频图形程序设计

微机UNIX直接视频图形程序设计

上传者:网友
|
翻新时间:2023-06-23

微机UNIX直接视频图形程序设计

微机UNIX直接视频图形程序设计 微机UNIX直接视频图形程序设计 微机UNIX直接视频图形程序设计 UNIX操作系统提供了X-Window图形窗口系统和OPENLOOK图形用户界面,这些系统不仅昂贵、庞大,而且不便于移植以前开发的DOS图形应用程序。本文介绍利用微机内部硬件控制,针对EGA/VGA图形适配器,进行直接视频图形程序设计。对于比较熟悉PC-AT体系结构和视频程序设计知识的程序员来说,更喜欢后者,因为能有效地利用硬件特性,加快图形处理速度。

进行图形程序设计时,还须考虑视频接口的一个重要特性——虚拟终端功能,因为它允许控制几个独立的图形应用窗口,允许多个应用程序在同一个终端上进行切换。本文提供针对IBM标准终端对虚拟终端进行有效管理的手段。

微机UNIX直接视频图形程序设计有两种方法,一种是利用设备驱动程序(见参考文献

1),另一种是针对IBM标准终端进行编程,本文介绍后者。

一、图形程序设计

1.检测视频适配器

视频显示器是由视频适配器硬件控制的,视频适配器决定了图形方式下显示图形的分辨率及可能的颜色[2]。利用系统调用ioctl中的CONS-CURRENT命令可以检测到当前的视频适配器,即:

ioctl(0,CONS-CURRENT,NULL)

返回-1时表示出错,即没有相应的视频适配器硬件,如果检测到VGA卡则返回值为VGA,如果检测到EGA卡则返回值为EGA,……。

2.初始化图形系统

初始化图形必须完成下列任务。

(1) 获取当前的视频显示方式

ioctl的CONS-GET命令用来判断当前适配器的显示方式,即:

ioctl(0,CONS-GET,NULL)

它返回显示方式的值,这些值在包含文件vtkd.h中均有定义,如:SW-VAG640x480C为VGA适配器设置成640x480分辨率彩色图形模式。

(2) 设置图形模式

直接将图形模式值放入ioctl中的命令项即可设置相应的图形模式,如ioctl(0,SW-VGA640x480C,NULL)

将VGA适配器设置成640x480分辨率的彩色图形模式。

(3) 获取图形模式下视频缓冲区物理地址

利用ioctl的MAPCONS命令可以实现此功能,即:

char *scrnmem;

scrnmem=(char *)ioctl(0,MAPCONS,NULL)

所有实现基本图素的操作都将针对scrnmem进行,scrnmem就是EGA/VGA相应的四个位平面的重叠地址,有关EGA/VGA的结构可参阅[2]。

3.实现基本图素

DOS操作系统下,对EGA/VGA的各种视频I/O寄存器进行操作是很方便的,可以直接使用汇编语言in和out指令进行读写。然而,UNIX操作系统下,对物理硬件的访问都是由UNIX系统核心和设备驱动程序管理的,要访问EGA/VGA的各种I/O寄存器,必须获得对其访问的特权,为了实现这种功能要求,可以使用下列ioctl系统调用方式:

ioctl(0,VGA-IOPRIVL,

1) 获取VGA的各种I/O寄存器的访问特权

ioctl(0,EGA-IOPRIVL,

1) 获取EGA的各种I/O寄存器的访问特权

UNIX操作系统基本上是采用C语言编写的,只是在低层的系统内核方面才使用低级的汇编语言,遵循这一原则,对EGA/VGA的I/O寄存器的访问可以采用汇编语言,而实现图形系统的基本图素则采用C语言。

如果用户的UNIX系统中已有inb()和outb()函数(嵌入在/usr/include/sys/inline.h中),则可以直接使用它们完成对各种I/O寄存器的读写,否则,必须编写下列低级汇编语言例程:

/*向一端口输出一字节*/

/*从一端口输入一字节 */

void outb(int port,uchar value)

{

-asm push edx

-asm mov edx,port

-asm mov al,value

-asm out dx,al

-asm pop edx

}

uchar inb(int port)

{

-asm push edx

-asm mov edx,port

-asm in al,dx

-asm pop edx

}

基本图素一般包括:设置颜色,对调色板的操作,画点、线、弧、矩形、圆、椭圆、多边形、画扇形、饼图,任意图形填充,多边形填充,保存屏幕,恢复屏幕等,这些操作均可用C语言实现,细节问题可参阅[2]。

4.关闭图形系统

退出图形系统之前必须恢复EGA/VGA各I/O寄存器的值,并将显示模式恢复到进入图形模式之前的模式。采用下列ioctl调用实现:

ioctl(0,MODESWITCH | oldmode,NULL)

oldmode是进入图形方式之前获取的方式,UNIX系统中,获取的方式和设置的方式之间的关系为:

设置方式值=获取方式值|MODESWITCH

二、虚拟终端的使用

虚拟终端(Virtual Terminal,简称VT)加强了UNIX系统V/386的接口功能,它不仅允许单个用户开发一个图形应用软件,而且允许多用户、多道程序在同一个物理终端上运行,在开始一个用户的应用程序之前不必停止另一个应用程序,而且各个用户之间可以互相切换。

虚拟终端有两种操作方式[1],一种是自动操作方式(VT-AUTO),这是默认情况,比较简单,应用程序并不了解终端用户接受或放弃当前VT的请求,这意味着被切换掉的进程的任何输入输出都可能丢失。另一种方式是进程控制方式(VT-PROCESS),该方式支持应用程序与其它正在使用VT的进程之间同步,应用程序可以负责接受或放弃使用VT。

[1]中介绍了以进程方式控制VT的过程,并以设备驱动程序方式介绍了接受和放弃对VT控制的信号处理例程。本文给出针对IBM标准终端编制VT的程序和相应的信号处理例程。

/* 设置虚拟终端 */

void setvirtualterm(void)

{

struct vt-mode vtmode;

signal(SIGUSR1,release-disp); //release-disp为放弃VT的信号处理例程

signal(SIGUSR2,acquire-disp); //acquire-disp为接受VT的信号处理例程

vtmode.mode=VT_PROCESS; //设置进程控制方式

vtmode.relsig=SIGUSR1;

vtmode.acqsig=SIGUSR2;

if (ioctl(0,VT-SETMODE,&vtmode)==-

1) exit

(1);//出错即终止此进程

}

/* 放弃VT的信号处理例程 */

void release-disp(void)

{

signal(SIGUSR1,release-disp);

保存整个图形屏幕于内部缓冲区videobuf中;

ioctl(0),MODESWITCH | oldmode,NULL);

//oldmode为进入图形模式之前的显示方式

ioctl(0,VT-RELDISP,VT-TRUE);

//VT-TRUE表明同意放弃VT,如果此项为0,则表示拒绝放弃VT.

}

/* 接受VT的信号处理例程 */

void acquire-disp(void)

{

signal(SIGUSR2,acquire-disp);

ioctl(0,newmode,NULL);//newmode为应用程序所处的图形模式

scrnmem=(char *)ioctl(0,MAPCONS,NULL);

//重新获取图形缓冲区的物理地址

从videobuf中恢复整个图形屏幕,并释放videobuf;

ioctl(0,VT-RELDISP,VT-ACKACQ); //VT-ACKACQ表明接受VT

}

在微机UNIX操作系统下,针对EGA/VGA进行直接视频程序设计,独立开发一个图形程序包,不仅小巧方便,而且可以重用以前在DOS下开发的图形应用程序。笔者在SCO UNIX系统下开发了一个小的低层图形软件包,许多以前的DOS图形应用程序都可以移植到UNIX系统下来。

另外,本文介绍的程序在使用前还应包含下列文件,即:

#include<stdio.h>

#include<sys/types.h>

#include<sys/console.h>

#include<sys/vtkd.h>

#include<termio.h>

#include<sys/signal.h>

分配空间时还应加上#include<malloc.h>

参考文献2 张福炎等.微型计算机IBM PC的原理与应用(续二)-图形显示器及其程序设计.南京:南京大学出版社,1990.7.

下载文档

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

网友最新关注

追寻音响世界
走进奇妙的音响世界
我是大自然中的一员
回顾暑假生活
回顾暑假生活——包饺子
我是大自然中的一员
声音是最美的
我是大自然中的一员
我是大自然中的一员
我爱祖国
回忆多彩的暑假生活
音响世界声音的美
回忆快乐暑假
拜访音响世界
我是大自然中的一员
会议管理制度
会议记录范例
对会议记录者的要求
会议记录的功能与误区
公司项目论证会议记录
会议纪律常见条款
编写会议记录的体会
团省委会议纪律范文
中法文化会议议程
学术会议通知
民航会议议程
学术研讨会会议通知
学生会会议纪律制定
远程教育会议议程
会议记录介绍
园林施工定额管理
现代企业管理体系下的国有企业思想政治工作
图书馆员职业倦怠心理透视
国有金融企业客户关系创新-市场营销管理论文(1)论文
探讨无线传感器网络LEACH路由协议的变化
国企管理应符合所有制性质
我国民营企业负债筹资探析-市场营销管理论文(1)论文
浅议商业银行成本控制
对现代企业管理中5S管理应用的探讨
关于优化劳务派遣管理的探讨
企业管理会计现状与发展策略之我见
群塔防碰撞方案
测量放线施工方案
从三江并流想国企管理
论法约尔管理理论在油田HSE监督工作中的应用
《胖乎乎的小手》第一讲义
《胖乎乎的小手》写作训练 一双胖乎乎的小手
《胖乎乎的小手》作者简介及主要作品
《胖乎乎的小手》考点练兵
《胖乎乎的小手》随堂练习 【巩固篇】
《胖乎乎的小手》写作训练 我只要一颗红气球
《胖乎乎的小手》写作训练 分享快乐
《胖乎乎的小手》趣闻故事 孝顺的小乌鸦
《胖乎乎的小手》重点句品读
《胖乎乎的小手》重点字词的意思
《胖乎乎的小手》整体阅读感知
《胖乎乎的小手》重点字词梳理
《胖乎乎的小手》第二讲义
《胖乎乎的小手》随堂练习 【提高篇】
《胖乎乎的小手》重难点分析