1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

    <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
    <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
  2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
    現在位置:范文先生網>理工論文>計算機論文>可移植的256色圖形用戶界面的設計

    可移植的256色圖形用戶界面的設計

    時間:2023-02-20 22:49:55 計算機論文 我要投稿
    • 相關推薦

    可移植的256色圖形用戶界面的設計

      摘 要 該文從軟件可移植性的角度指出設計256色圖形用戶界面時應當注意的問題,在對SuperVGA產品進行分析的基礎上,提出了基于表格驅動的程序設計思想,并給出了范例。
    隨著各種超級VGA的出現,同時具有高分辨率和豐富色彩的圖形用戶界面已經成為程序員和用戶共同追求的目標。然而由于各制造商提供的VGA產品之間的差異,使得高分辨率256色圖形界面的兼容性受到影響,常常會出現這樣的情況:在一個顯示系統下運行良好的程序,在另一種顯示系統下變得面目全非,甚至根本不顯示。這表明程序員對程序的可移植性重視不夠,或對各種顯示設備缺乏足夠的了解。
    軟件的可移植性是指軟件產品從一個硬件/軟件環境轉移到另一個硬件/軟件環境的難易與繁簡程度。它從軟件對新環境的適應性這一方面,反映了軟件的質量。為了提高軟件的可移植性,應盡量使軟件與具體的設備無關,即提高軟件的設備獨立性。對于256色圖形界面而言,就是要使程序不依賴于某種特定的顯示器。例如,程序員沒有任何理由假定用戶使用的是TVGA。為此,程序員必須提供顯示卡的常規檢測例程,并能根據檢測的結果決定圖形算法的具體實現。
    提高軟件設備獨立性的方法有很多,表格驅動就是其中一種。所謂表格,就是根據需要設計的數據結構。表格中的數據由檢測例程填寫。表格中包含哪些欄目,應在對各制造商提供的SuperVGA產品足夠了解的基礎上取舍,欄目應體現各產品之間的差異。
    一、SuperVGA編程綜述
    SuperVGA產品在體系結構上和標準的IBM VGA有所不同。但編程思想基本上是一樣的,這些編程方法已有許多文章介紹,這里不再重復。
    影響256色圖形界面可移植性的主要障礙來自各制造商提供的VGA產品的下面幾點差異。
    1.顯示模式的定義不同。如5DH對TVGA而言,代表640×480
    ×256色模式,對PVGA而言卻代
    表1024×768×16色模式。因此,直接用這種模式號初始化顯示系統是不可取的。和顯示模式密切相關的是水平分辨率和垂直分辨率。盡管各VGA的256色顯示模式定義迥異,但大都支持如下幾種流行的分辨率,現用統一的模式號定義見附表。
    @@10A06500.GIF;附表@@
    不同分辨率之間的區別,體現在編程上就是同一屏幕坐標映射到顯存的地址不同,但映射機理卻是一樣的。具體地說,坐標(x,y)對應顯存的偏移地址(相對于A000)為Addr=-vga-width*y+x
    2.分頁機制不同。SuperVGA使用256K、512K或1M
    的顯示存儲器結構。為了使處理器可通過一個64K主窗口來存取這樣大的顯示存儲器,SuperVGA有一個存儲器分頁機制,使得只將顯示存儲器的一部分映射到處理器的地址空間。值得注意的是,不同的VGA產品,其頁的大小不同,頁起始地址的粒度也是可變的。具體的頁選擇算法請查閱制造商提供的資料。
    不同的顯示模式,顯示一屏圖像所需的頁數是不同的。
    除了可移植性外,效率也是一個不可忽視的因素。圖形系統的核心部分應使用匯編語言編程。這不僅是因為匯編語言的效率高,而且還因為匯編語言子程序的可再用性和可協用性也很好。核心部分應十分重視下面幾點:(1)減少不必要的頁邊界檢查次數;(2)只有在必要時才進行頁選擇;(3)選擇高效的機器指令。現舉例說明。程序1是圖像顯示系統中常用的函數,其功能是將解包后的圖像數據送到顯存。為便于閱讀同時給出了C語言調用原型。程序在傳送每一行數據時,提前預測是否會遇到頁邊界,如果沒有,直接傳送;如果有,則將數據分成兩部分,分別傳送,中間插入頁選擇。所有的傳送均用字操作代替字節操作。頁邊界檢查只有一次,分頁操作只有在必要時才發生,圖像的顯示用最高效的指令REP MOVSW。
    程度1:
    ;原型:void LineDump(int x,int y, int num, char far*ptr)
    ;參數:
    ; x,y-屏幕坐標
    ; num-本行的像素個數
    ; ptr-指向像素數據的遠指針
    LineDump proc far
    push bp
    mov bp,sp
    sub sp,2;WORD Reserved for local var.
    push ds
    push es
    push si
    push di
    reserved equ [bp-2];Local var.save seg(DGROUP)
    x equ [bp+6];Large Model
    y equ [bp+8]
    num equ [bp+10]
    offs equ [bp+12]
    pseg equ [bp+14]
    mov reserved,ds
    mov ds,pseg
    mov si,offs ;DS:SI圖像數據所在源地址
    mov ax,0a000h;顯存段址
    mov es,ax ;ES:DI顯存目的地址
    mov ax,y
    push ds
    mov ds,reserved
    mul word ptr DGROUP:-vga-width
    pop ds
    add ax,x
    adc dx,0
    mov di,ax ;DI=-vga-width*y+x
    mov ah,dl ;進位部分(DL)=頁號
    call dword ptr cs:-PageSelect
    mov cx, num ;本行要傳送字節數
    mov bx, cx
    add bx,di ;檢測傳送是否在一個頁內
    jnc Dump-In-One-Page
    sub cx,bx ;CX=本頁字節數,BX=下頁字節數
    shr cx,1 ;CX/2=字數
    rep movsw ;本頁內的傳送
    adc cx,0
    rep movsb ;處理可能的奇數字節數
    inc ah ;調整頁號
    call dword ptr cs:-PageSelect
    mov cx,bx ;新頁內要寫的字節數
    jcxz Dump-Done
    Dump-In-One-Page:
    shr cx,1 ;CX/2=字數
    rep movsw ;圖像傳送
    adc cx,0
    rep movsb ;處理可能的奇數字節數
    Dump-Done:
    pop di
    pop si
    pop es
    pop ds
    mov sp,bp
    pop bp
    ret
    LineDump endp
    二、表格驅動的基本思想
    根據上面的分析,用以驅動顯示系統的表格,至少應當包含下列項目:
    (1)實際顯示模式:vga-mode
    (2)水平分辨率:vga-width
    (3)垂直分辨率:vga-depth
    (4)頁選擇例程的入口地址:PageSelect
    (5)當前顯示方式所使用的最大頁號:vga-pages
    這個表格由圖形初始化例程來填寫。圖形初始化例

    程接收的顯示模式是統一的模式號,這樣可以撇開具體的設備,如InitVGA(TVGA800×600)。該例程調用顯示設備檢測程序DetectVGA來判斷顯示器的類型,從而填寫表格中的各欄目,并初始化圖形系統為所需的圖形方式。所有圖形算法都要查此表。
    除了用上述方法來實現兼容外,視頻電子學標準協會(VESA)為我們提供了另一種方法。
    VESA
    提供了一組附加的BIOS功能,這組功能以標準的方式訪問SuperVGA擴充的模式。VESA的附加功能都是通過BIOS中斷10H的4FH功能來實現的。VESA的子功能01能返回非常有用的SuperVGA模式信息,包括分頁例程的地址。
    因此,程序員可以按照VESA的標準來編寫圖形系統,這樣的程序可以在所有支持VESA的顯示器上運行。由于VESA包括了世界上的主要VGA供應商,寫出來的程序可移植性是很好的。但是,其效率卻可能是最低的。所以最好采用一種折衷的辦法,對于熟悉的產品,可以不用VESA的功能,對于不熟悉(資料不全)或檢測不出來的顯示器嘗試用VESA提供的手段來編程,當然要檢測顯示設備是否支持VESA。
    有時出于某種考慮,不希望支持所有顯示設備的代碼集中在一個程序中,可以為每個顯示設備分別提供驅動模塊,主程序根據檢測的結果選擇一個合適的模塊加載。Borland的C++就是這樣,它有一套BGI驅動程序,各驅動程序提供統一的圖形函數接口。筆者在實際工作中,為每一種顯示設備編寫了一個256色的BGI格式的驅動程序,這樣,在編寫圖形系統時,再也沒有必要考慮用戶的實際顯示設備了。
    三、范 例
    本文附有兩個圖形顯示的例子。ShowGif能顯示16/256色GIF格式圖像,能以任何256色模式啟動,支持多種顯示器。圖像可以漫游,并可隨時通過按鍵切換顯示方式。Main則是一個BGI驅動的鼠標/鍵盤控制的256色漢字圖形菜單。它自己會挑選一個合適的BGI,也可以從命令行指定一個BGI(比如指定VESA256給TVGA顯示器)。
    限于篇幅,這里僅給出有關的數據結構和部分函數的說明(程序2)。然后給出一個初始化顯
    示系統的C語言片斷(程序3)。
    程序2(TVGA256.H):
    /* 統一的模式集 */
    enum TVGA-MODE
    TVGA320x200=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-driver-far[];
    extern int far-Cdecl AVGA256-driver-far[];
    ...
    extern int far-Cdecl VESA256-driver-far[];
    /* 支持的VGA集合 */
    enum VGAs{
    UnKnownVGA,
    TridentVGA,
    ParadiseVGA,
    AheadVGA,
    ...
    VesaVGA
    };
    /* 對應的BGI驅動程序名 */
    unsigned char *Drivers[]={
    "TVGA256",
    "TVGA256",
    "AVGA256",
    ...
    "VESA256",
    };
    extern int DetectVGA(void);
    /* 功 能:檢測顯示卡的型號
    返回值:0-Unknowm1-Trident VGA2-Paradise VGA
    ...
    x-不能檢測出的VGA,但支持VESA
    返回值同時寫入全局變量vga-type */
    extern int VesaFound(void);
    /* 功 能:檢測VESA BIOS的存在性
    返 回:0-不支持VESA;
    其它-VESA版本號(0x0102即1.02版);
    返回值同時寫入全程變量vesa-found. */
    extern void InitVesa(void);
    /* 功 能:初始化VESA.根據-vga-mode模式號換算成VESA的標準模式號填寫頁粒度(WinGranularity),頁大小(WinSize),
    和分頁例程的入口地址(WinFuncPtr)
    VESA的標準模式解釋如下:
    100h-640x400 256
    101h-640x480 256
    102h-800x600 16
    103h-800x600 256
    104h-1024x768 16
    105h-1024x768 256 etc.
    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-pages,PageSelect
    必要時自動調用InitVesa
    */
    extern int vga-type;
    extern int vga-mode;
    extern int vga-width;
    extern int vga-depth;
    extern int vga-pages;
    extern int vga-pages;
    extern char page-number;
    extern int vesa-found;
    ...
    程序3(初始化顯示系統的程序片斷):
    ...
    int GraphDriver, GraphMode;
    unsigned char *bgiDriver="PVGA256";
    bgiDriver=Drivers[DetectVGA()];
    GraphDriver=installuserdriver(bgiDriver,NULL);
    GraphMode=TVGA800x600;
    initgraph(&GraphDriver, &GraphMode," ");...

    參考文獻
    1 來文占等編譯.S

    uper VGA高級編程指南.北京:北京科海培訓中心,1991.5.
    2 張一波編譯.Super VGA與VESA編程指南.北京:海洋出版社,1992.


    【可移植的256色圖形用戶界面的設計】相關文章:

    嵌入式圖形用戶界面在S3C44B0X上的移植08-19

    《假如記憶可以移植》教學設計08-18

    《假如記憶可以移植》的教學設計08-15

    外面的世界教學設計08-15

    《外面的世界》的教學設計08-15

    組合圖形的面積教學設計08-07

    《圖形的拼組》教學設計08-17

    《認識圖形》教學設計08-16

    圖形的變化規律教學設計08-16

    国产福利萌白酱精品tv一区_日韩亚洲中字无码一区二区三区_亚洲欧洲高清无码在线_全黄无码免费一级毛片
    1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

      <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
      <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
    2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
      一及片中文字幕 | 在线观看国产免费一级AV | 色妞亚洲欧美在线 | 亚洲国产美日韩欧美特级 | 热99精品只有这里精视频 | 在线观看人成视频 |