DJYGUI系列文章五:GK顯示器接口

djyos類腦操作系統 發佈 2022-12-01T23:19:01.091741+00:00

GK的底層硬體標準接口函數大體分為三類,第一類是在位圖中繪圖,第二類是在屏幕上繪圖,第三類是顯示器的控制函數。

1 GK顯示器接口概述

顯示器是圖形顯示的終端,圖形的所有操作都會直接或間接的體現在顯示器上面。DJYGUI支持多顯示器、虛顯示器和鏡像顯示器的功能。應用程式在調用API函數繪圖前,需安裝顯示器,按照GK顯示器標接口實現驅動函數。

GK的底層硬體標準接口函數大體分為三類,第一類是在位圖中繪圖,第二類是在屏幕上繪圖,第三類是顯示器的控制函數。安裝顯示器時,將這三類接口函數註冊到圖形系統,當用戶調用gui Kernel API時,這些驅動函數將以回調函數的方式被調用。

2 鏡像顯示

鏡像顯示就是在遠端計算機上顯示一個與本地顯示器完全一樣的畫面,可用於實現遠程協助和遠程維護。遠程操作多是通過通信口進行的,主要有網絡、USB、串口等。要使用遠程顯示功能,必須在本地先安裝一個顯示器,然後把遠程顯示器當作該顯示器的鏡像顯示器,GK提供API函數用於添加鏡像顯示器。值得注意的是,本地顯示器可以是實際存在的,也可以是虛擬的。對於實際存在的顯示器,需要編寫完整的顯示driver,對於虛擬的,則只需要提供一個框架,driver接口中要求的接口函數,均可以不實現。與本地顯示器一樣,鏡像顯示器同樣需要在本地實現一個display驅動,但不必實現所有接口函數,只需要實現顯示器接口函數集中的四個函數:

set_pixel_screen:在屏幕上繪製一個像素

fill_rect_screen:填充一塊矩形屏幕區域

bm_to_screen:把bitmap輸出到屏幕

line_screnn:在屏幕上面畫一根線

所有的繪製操作,最後都會在GK中變成對screen的輸出操作,GK在執行對screen操作的同時,調用上述四個函數之一,把繪製命令傳送到遠端顯示器,遠端計算機在自己的本地顯示器上實現這幾個函數的功能。鏡像顯示器驅動還需要圖像傳輸協議的配合,典型的是VNCServer,該協議在DJYOS上有移植。使用VNCServer的話,遠端顯示器只需要安裝一個VNC客戶端就可以了。

3 硬體接口

3.1set_pixel_bm:位圖中畫像素

bool_t (*set_pixel_bm)(struct tagRectBitmap *Bitmap, s32 x,s32 y,u32 Color,u32 Rop2Code);

參數:

Bitmap:目標位圖。

x:繪圖位置的橫坐標,相對於位圖。

y:繪圖位置的縱坐標,相對於位圖。

Color:畫圖使用的顏色,顏色格式為真彩色。

Rop2Code:二元光柵操作碼。

返回值:

true:成功;false:失敗。

說明:

在矩形位圖中畫一個像素,若顯示器使用CN_CUSTOM_PF(自定義)格式,或者有硬體加速功能,應該實現這個函數,否則直接返回false。即使有硬體加速,但該加速功能不支持r2_code編碼的話,也返回false。color的格式是CN_SYS_PF_ERGB8888。

3.2 line_bm:位圖中畫直線

bool_t (*line_bm)(struct tagRectBitmap *Bitmap,struct tagRectangle *Limit,

s32 x1,s32 y1,s32 x2,s32 y2,u32 Color,u32 Rop2Code);

參數:

Bitmap:目標位圖。

Limit:限制矩形,只允許在該矩形內繪製。

x1:繪圖起點的橫坐標,相對於位圖。

y1:繪圖起點的縱坐標,相對於位圖。

x2:繪圖終點的橫坐標,相對於位圖。

y2:繪圖終點的縱坐標,相對於位圖。

Color:畫圖使用的顏色,顏色格式為真彩色。

Rop2Code:二元光柵操作碼。

返回值:

true:成功;false:失敗。

說明:

在矩形位圖中畫一條任意細直線,不含端點,若顯示器使用CN_CUSTOM_PF(自定義)格式,或者有硬體加速功能,應該實現這個函數,否則直接返回false。即使有硬體加速,但該加速功能不支持r2_code編碼的話,也返回false。color格式是CN_SYS_PF_ERGB8888。

另外有公交車中畫直線函數line_bm_ie,與line_bm的唯一區別在於,line_bm_ie畫直線包括端點,而line_bm不包含端點。

3.3fill_rect_bm:位圖中填充矩形

bool_t (*fill_rect_bm)(struct tagRectBitmap *DstBitmap,

struct tagRectangle *Target,

struct tagRectangle *Focus,

u32 Color0,u32 Color1,u32 Mode);

參數:

DstBitmap:目標位圖。

Target:目標矩形,填充範圍不能超過該矩形。

Focus:聚焦矩形,當前填充矩形區域。

Color0:漸變顏色0,顏色格式為真彩色。

Color1:漸變顏色1,顏色格式為真彩色,模式為直接填充時無效。

Mode:填充模式,請參照gkernel.h宏定義組CN_FILLRECT_MODE_N。

返回值:

true:成功;false:失敗。

說明:

在矩形位圖中填充矩形,若顯示器使用CN_CUSTOM_PF(自定義)格式,或者有硬體加速功能,應該實現這個函數,否則直接返回false。color格式是CN_SYS_PF_ERGB8888。目標矩形Target是漸變填充的整個矩形區域,聚焦矩形Focus是當前填充的可視域。Target和Focus的關係如圖 41所示。如需要填充Target內的三個focus區域,需要調用該函數三次,每次使用相應的Focus參數。

3.4 blt_bm_to_bm:位圖中顯示矩形

bool_t (*blt_bm_to_bm)( struct tagRectBitmap *DstBitmap,

struct tagRectangle *DstRect,

struct tagRectBitmap *SrcBitmap,

struct tagrectangle *SrcRect,

u32 RopCode,u32 TransparentColor);

參數:

DstBitmap:目標位圖。

DstRect:目標矩形。

SrcBitmap:源位圖。

SrcRect:源矩形。

RopCode:光柵操作碼。

TransparentColor:透明色,為真彩色。

返回值:

true:成功;false:失敗。

說明:

在兩個矩形位圖中位圖塊傳送,如果顯示器使用的像素格式是CN_CUSTOM_PF,或者硬體2d加速支持位圖塊傳送,需實現這個函數,否則直接返回false。對於有硬體加速,但部分RopCode編碼不支持的情況,可以實現支持的RopCode,不支持的部分,返回false。本函數返回false的話,gui kernel會自行用逐像素方法拷貝。目標矩形和源矩形相對坐標不同,但大小相同。

3.5 get_pixel_bm:位圖中讀取像素

u32 (*get_pixel_bm)(struct tagRectBitmap *Bitmap,s32 x,s32 y);

參數:

Bitmap:目標位圖。

x:讀像素的橫坐標,相對於目標位圖。

y:讀像素的縱坐標,相對於目標位圖。

返回值:

讀取的像素值,需轉化為真彩色。

說明:

從矩形位圖中取一像素,並轉換成CN_SYS_PF_ERGB888。只有在bitmap的像素格式為CN_CUSTOM_PF時,才需要讀取。如果顯卡不打算支持自定義格式,本函數直接返回0。

3.6 get_rect_bm:位圖中剪切矩形

bool_t (*get_rect_bm)(struct tagRectBitmap

*Src, struct tagRectangle *Rect, struct tagRectBitmap *Dest);

參數:

Src:源位圖。

Rec:讀取位圖的矩形區域。

Dest:目標位圖。

返回值:

true:成功;false:失敗。

說明:

把src位圖內rect矩形區域的內容複製到dest位圖中,調用前,先設置好dest的FixelFormat,本函數不理會src的FixelFormat,直接使用screen的格式。本函數用於從窗口剪切矩形,而blt_bm_to_bm用於顯示矩形。如果顯示器使用的像素格式是CN_CUSTOM_PF,或者硬體加速支持位圖間拷貝圖形,需實現這個函數,否則直接返回false。由於dest->FixelFormat存在很多可能,即使有硬體加速,也存在只支持部分FixelFormat的情況,對不支持的格式,返回false。

3.7 set_pixel_screen:屏幕上畫像素

bool_t (*set_pixel_screen)(s32 x,s32 y,u32 Color,u32 Rop2Code);

參數:

x:繪製像素的橫坐標,相對於屏幕。

y:繪製像素的縱坐標,相對於屏幕。

Color:繪製像素的顏色,為真彩色。

Rop2Code:二元光柵操作碼。

返回值:

true:成功;false:失敗。

說明:

在screen中畫一個像素,有Frame Buffer的情況下,正常顯示gui不會調用這個函數,如果窗口direct_screen==true,則可能調用本函數。因此,無論是否有frame buffer,driver都必須提供並且必須實現本函數。鏡像顯示器的driver必須實現本函數。color的格式是CN_SYS_PF_ERGB8888,因此繪製前需轉化為本地顏色格式。

3.8 line_screen:屏幕上畫直線

bool_t (*line_screen)( tagRectangle *limit, s32 x1,s32 y1,s32 x2,s32 y2,

u32 Color,u32 Rop2Code);

參數:

limit:限制矩形,只繪製矩形內部的部分。

x1:繪圖起點橫坐標,相對於屏幕。

y1:繪圖起點縱坐標,相對於屏幕。

x2:繪圖終點橫坐標,相對於屏幕。

y2:繪圖終點橫坐標,相對於屏幕。

Color:繪製像素的顏色,為真彩色,因此繪製前需轉化為本地顏色格式。

Rop2Code:二元光柵操作碼。

返回值:

true:成功;false:失敗。

說明:

在screen中畫一條任意直線,不含端點,如硬體加速不支持在screen上畫線,driver可以簡化,直接返回false即可。有frame buffer的情況下,正常顯示gui不會調用這個函數,如果窗口direct_screen==true,則可能調用本函數,本函數返回false的話,會進一步調用set_pixel_screen函數。由於不確定本地顯示器是否有frame_buffer,鏡像顯示器driver必須實現本函數,不能簡單返回false。color的格式是CN_SYS_PF_ERGB8888,因此繪製前需轉化為本地顏色格式。

此外,函數line_screen_ie也是在屏幕上畫直線,但是它畫的直線包含端點。

3.9 fill_rect_screen:屏幕上填充矩形

bool_t (*fill_rect_screen)(struct tagRectangle *Target,

struct tagRectangle *Focus,

u32 Color0,u32 Color1,u32 Mode);

參數:

Target:目標矩形區域。

Focus:聚焦矩形區域。

Color0:漸變顏色0,顏色格式為真彩色。

Color1:漸變顏色1,顏色格式為真彩色。

Mode:漸變填充模式。

返回值:

true:成功;false:失敗。

說明:

screen中矩形填充,如硬體加速不支持在screen上矩形填充,driver可以簡化,直接返回false即可。有frame buffer的情況下,正常顯示gui不會調用這個函數,如果窗口direct_screen==true,則可能調用本函數,本函數返回false的話,會進一步調用set_pixel_screen函數。由於不知道本地顯示器的情況,鏡像顯示器driver必須實現本函數,不能簡單返回false。color的格式是CN_SYS_PF_ERGB8888。Target與Focus的關係如圖 41所示。

3.10 bm_to_screen:屏幕上畫位圖

bool_t (*bm_to_screen)(struct tagRectangle *DstRect,

struct tagRectBitmap *SrcBitmap,s32 xSrc,s32 ySrc);

參數:

DstRect:目標矩形區域。

SrcBitmap:源位圖。

xSrc:源位圖中顯示的區域左上角橫坐標,相對於源位圖。

ySrc:源位圖中顯示的區域左上角縱坐標,相對於源位圖。

返回值:

true:成功;false:失敗。

說明:

從內存緩衝區到screen位塊傳送,只支持塊拷貝,不支持rop操作。如硬體加速不支持在screen上繪製位圖,driver可以簡化,直接返回false即可。有frame buffer的情況下,__GK_OutputRedraw中會調用這個函數。如果窗口direct_screen==true,也可能調用本函數。本函數返回false的話,gui kernel會進一步調用set_pixel_screen函數。即使硬體加速支持,但如果不支持具體的src_bitmap->PixelFormat,也可返回false。由於不知道本地顯示器的情況,鏡像顯示器driver必須實現本函數,不能簡單返回false。

3.11 get_pixel_screen:屏幕上讀像素

u32 (*get_pixel_screen)(s32 x,s32 y);

參數:

x:目標像素的橫坐標,相對於屏幕。

y:目標像素的縱坐標,相對於屏幕。

返回值:

像素值,轉化為真彩色格式。

說明:

從screen中取一像素,並轉換成CN_SYS_PF_ERGB8888。

3.12 get_rect_screen:屏幕上讀位圖

bool_t (*get_rect_screen)(struct tagRectangle *Rect,struct tagRectBitmap *Dest);

參數:

rect:讀取的目標矩形區域。

dest:保存矩形區域讀到的位圖。

返回值:

true:成功;false:失敗。

說明:

把screen內矩形區域的內容複製到bitmap,調用前,先設置好dest的FixelFormat。

3.13 disp_ctrl:控制顯示器

bool_t (*disp_ctrl)(struct display_rsc *Disp);

參數:

disp:顯示器指針。

返回值:

true:成功;false:失敗。

說明:

控制顯示器,這是由driver提供的一個應用程式的入口,該應用程式用於提供一個可視化的方式。設定該顯示器所有可以由用戶設定的參數,比如解析度和和色彩參數。函數的功能不做統一規定,驅動程序的文檔應該提供函數的使用說明。利用本函數,可以提供類似windows中設置顯示器屬性的功能。

4 GK顯示器API說明

4.1 GK_ApiGetPixelFormat:查詢顯卡格式

u16 GK_ApiGetPixelFormat(struct tagDisplayRsc *Display)

頭文件:

gkernel.h

參數:

Display:待查詢的顯卡

返回值:

顯卡格式,也稱顏色格式,如CN_SYS_PF_RGB565。

說明:

查詢顯卡使用的顏色格式,畫位圖時,如果使用跟顯卡相同的顏色格式,將獲得最優性能。

4.2 GK_InstallDisplay:安裝顯示器

bool_t GK_InstallDisplay(struct tagDisplayRsc *Display, char *Name)

頭文件:

gk_display.h

參數:

Display:待安裝的顯示器。

Name:顯示器名稱。

返回值:

true:成功;false:失敗。

說明:

把一台新顯示器登記到顯示器資源隊列中。

4.3 GK_InstallDisplayMirror:安裝鏡像顯示器

bool_t GK_InstallDisplayMirror(struct tagDisplayRsc *BaseDisplay,

struct tagDisplayRsc *MirrorDisplay,char *Name)

頭文件:

gk_display.h

參數:

BaseDisplay:本地顯示器。

MirrorDisplay:待安裝的鏡像顯示器。

Name:顯示器名稱。

返回值:

true:成功;false:失敗。

說明:

把一台鏡像顯示器登記到本地顯示器。

​​​​​​4.3 GK_SetDefaultDisplay:設置默認顯示器

bool_t GK_SetDefaultDisplay(char *Name)

頭文件:

gk_display.h

參數:

Name:顯示器名稱。

返回值:

true:成功;false:失敗。

說明:

設置默認顯示器。

​​​​​​​4.4 GK_GetRootWin:取顯示器的默認設置

struct tagGkWinRsc *GK_GetRootWin(struct tagDisplayRsc *Display)

頭文件:

gk_display.h

參數:

Display:顯示器指針。

返回值:

顯示器桌面指針。

說明:

取一個顯示器的默認顯示設置,實際上就是桌面窗口的資源節點。

​​​​​​​4.5 GK_SwitchFrameBuffer:切換幀緩衝

bool_t GK_SwitchFrameBuffer(struct tagDisplayRsc *Display,

struct tagRectBitmap *FrameBuf)

頭文件:

gk_display.h

參數:

Display:顯示器指針。

FrameBuf:幀緩衝打針。

返回值:

true:成功;false:失敗。

說明:

當一個顯示器有多個Frame Buffer時,用本函數切換當前Frame Buffer。

​​​​​​​4.6 GK_CreateFrameBuffer:創建幀緩衝

struct tagRectBitmap *GK_CreateFrameBuffer(struct tagDisplayRsc *Display)

頭文件:

gk_display.h

參數:

Display:顯示器指針。

返回值:

緩衝區指針。

說明:

為某顯示器創建一個Frame Buffer。

關鍵字: