微機UNIX直接視訊圖形程式設計理工論文

才智咖 人氣:1.56W

一、圖形程式設計

微機UNIX直接視訊圖形程式設計理工論文

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的訊號處理例程

=VT_PROCESS; //設定程序控制方式

ig=SIGUSR1;

ig=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

#include

#include

#include

#include

#include

分配空間時還應加上#include

參考文獻

1 仲萃豪等系統V/386第4版-整合軟體開發指南.北京:電子工業出版社,1992.8.

2 張福炎等.微型計算機IBM PC的原理與應用(續二)-圖形顯示器及其程式設計.南京:南京大學出版社,1990.7.