• 沒有找到結果。

畫面命令結構分析

在文檔中 終端服務的桌面影像壓縮 (頁 78-84)

第五章 實驗數據與畫面分析

5.2 畫面命令結構分析

瞭解命令的傳送方式與 rdesktop 的操作流程,接下來以登入畫面為例,說明實際 的命令分析,關於 bitmap cache、memory order、font cache 和 text order 的結構組成,

如下圖所示,其中紅色框為 memory order 顯示的部份,綠色為 text order 部分。 S: Secondary order

P: Primary order

Bit-map

Bitmap updates

首先說明 bitmap cache 和 memory order 的處理程序,由 bitmap cache order 先將 bitmap 傳送到 client,之後 RDP Server 在傳送 memory order 將圖片從 bitmap cache 取 出後,顯示在畫面上。瞭解了程序之後,實際依畫面的 bitmap cache 資料和 memory blt 資料說明,一個 bmpcache 定義了參數結構如下:

uint8 cache_id;

uint8 Bpp;

uint8 width;

uint8 height;

unit16 buffersize;

uint8 cache_index;

variable length data;

根據定義的參數開啟大小為 width*height*Bpp 的資料空間,將 data 寫入隨著指標 一筆筆寫入,利用 XLib 函數將圖繪出,根據 cache_id 和 cache_index 存入 bmpcache 中,底下列出圖 55.紅色框的實際暫存在 bmpcache 資料

cx=64,cy=24,id=2,idx=17,Bpp=2,buffersize=1803 cx=64,cy=24,id=2,idx=18,Bpp=2,buffersize=685 cx=64,cy=24,id=2,idx=19,Bpp=2,buffersize=1734 cx=64,cy=24,id=2,idx=20,Bpp=2,buffersize=757

總共使用了 bmpcache1:7 個 bmpcache2:21 個,這部份共計有 28 個 bitmap 暫 存在 client cache 中,瞭解 bitmap 暫存機制後,接下來看 memory blt 如何將資料取出 並顯示在畫面上,首先看 memory blt 的參數結構

uint8 colour_table; //colormap uint8 cache_id; // cache id sint16 x; //圖的座標位置 X sint16 y; // 圖的座標位置 Y

sint16 cx; //width sint16 cy; //height uint8 opcode; //ROP

sint16 srcx; //source X,複製圖片的 Block 內部起始位置 X sint16 srcy; //source Y,複製圖片的 Block 內部起始位置 Y

uint16 cache_idx; // cache index

當 client 收到一個 memory blt,先利用 cache_id 和 cache_idx 將 bitmap 從 cache 中 取出,之後根據 x 和 y 座標以及指定的長寬進行 ROP 操作將圖片顯示在指定的位置,

這裡要特別說明 sourceX 和 sourceY。假設圖(a)是原本儲存於 cache 中的 64x64 bitmap,

圖(b)是 bitmap 顯示於畫面的部份,灰色部份在螢幕上沒有顯示出來,則 memory blt 這部份的(sourceX,sourceY)=(19,0),就是說複製的 bitmap 從 block 內座標(19,0)

開始,在一般情形下 block 沒有被切割,(sourceX,sourceY)都是(0,0)。

圖(a).儲存於 bmpcache 中 64x64 的 bitmap

圖(b).黑色為顯示於畫面的 bitmap 從 block 座標(19,0)開始 圖 60. memory blt 中 sourceX 和 sourceY 參數說明

瞭解了 memory blt 操作方式後,接下來將圖 59.紅色框線部分實際接收到的

由 memory blt 和 bmpcache 兩筆資料可以看出,兩邊的 bitmap cache_id 和 cache_idx 完全對應。瞭解了 bitmap 的更新方式後,接下來說明文字的更新部份。第四章提到文 字的更新部份是利用 fontcache 和 text order 來更新,我們先說明文字的暫存處理,一 個 fontcache order 定義了以下參數結構,

uint8 font; //字型

uint8 nglyphs; //文字數目,glyph 數目 uint16 character; //fontcache 的 index uint16 offset;

uint16 baseline; //定義文字是否為 baseline 型態 uint16 width; //文字的寬

uint16 height; //文字的高 variable length data;

當 client 收到 fontcache order 後,根據 width、height 及 data 指標,將 glyph 繪製 出來,這裡的 glyph 就是點陣字型,一個文字都根據 font 和 character 分別儲存於 fontcache 中,這樣的程序為處理一個 glyph 的流程,一個 fontcache 處理 glyph 次數由 nglyph 參數決定,nglyph 就是一個 fontcache order 所傳送的文字數目。底下我們可以 看到圖 59.實際傳送的 fontcache 資料。

FONTCACHE(font=6,n=1) //一個 fontcache order

font= 6,height=1 width=1,character=0//一個文字的長寬以及儲存在 fontcache 的位置 FONTCACHE(font=6,n=5)

font= 6,height=11 width=11,character=1 font= 6,height=11 width=10,character=2 font= 6,height=11 width=11,character=3

font= 6,height=11 width=10 glyph=5,character=4 font= 6,height=11 width=11 glyph=5,character=5 FONTCACHE(font=6,n=1) font= 6,height=12 width=4 glyph=1,character=6 FONTCACHE(font=6,n=1) font= 6,height=12 width=7 glyph=1,character=7 FONTCACHE(font=6,n=2) font= 6,height=12 width=3 glyph=2,character=8 font= 6,height=12 width=2 glyph=2,character=9 FONTCACHE(font=6,n=2) font= 6,height=11 width=11 glyph=2,character=10 font= 6,height=11 width=11 glyph=2,character=11 FONTCACHE(font=6,n=1) font= 6,height=12 width=5 glyph=1,character=12

說明了 glyph 如何儲存於 fontcache 後,接下來說明 RDP Server 如何利用 text order 將文字從 fontcache 取出,並顯示在畫面上。一個 text order 的參數結構包含以下,

sint16 cliptop; /*文字區塊座標*/

uint8 text[MAX_TEXT];/*文字的代號*/

當 RDP Client 收到 text order 之後,根據 font 和 text[i]將文字從 fontcache 取出,

透過 Xlib 函數將文字顯示在指定位置(x,y),一個 text order 可以取出多個文字,文字 的數目由 length 參數決定,但是一個 text order 根據 font 參數只能從同一個 fontcache 中取出文字,如果是不同的 font 參數,必須傳送另一個 text order,以下列出圖 59.中,

實際接收到的個 text order 資料結構,

x=203,y=241,cl=203,ct=231,cr=282,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=1,n=2 x=203,y=241,cl=203,ct=231,cr=263,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=13 x=263,y=241,cl=263,ct=231,cr=267,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=267,y=241,cl=267,ct=231,cr=268,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=267,y=241,cl=267,ct=231,cr=275,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=275,y=241,cl=275,ct=231,cr=282,cb=243,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=4 x=203,y=270,cl=203,ct=260,cr=244,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=1,n=2 x=203,y=270,cl=203,ct=260,cr=227,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=4 x=227,y=270,cl=227,ct=260,cr=231,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=231,y=270,cl=231,ct=260,cr=232,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=231,y=270,cl=231,ct=260,cr=237,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=2 x=237,y=270,cl=237,ct=260,cr=244,cb=272,bg=0xef5b,fg=0x0,font=6,fl=0x2,mix=0,n=4 n 為 length,bg 代表背景,fg 代表前景,由於 operation code 沒有用到,因此這裡不列 出來,另外 boxtop、boxright 等座標都為 0,這裡也省略。

畫面中文字和 bitmap 的更新方式,主要都是利用 secondary order 傳送資料到 client 暫存,primary order 將文字或是點陣圖取出,這樣的方式進行資料的傳送與更新,但 是文字和 bitmap 還是有點差異,在於 bitmapcache 和 memory order 一次只傳送一筆資 料,而 fontcache 和 text order 一次可以傳送一個或是多個文字,說明了 text 和 bitmap 的更新方式後,接下來的章節進行資料量的分析。

在文檔中 終端服務的桌面影像壓縮 (頁 78-84)