圖形驅(qū)動(dòng)程序資料4_第1頁
圖形驅(qū)動(dòng)程序資料4_第2頁
圖形驅(qū)動(dòng)程序資料4_第3頁
圖形驅(qū)動(dòng)程序資料4_第4頁
圖形驅(qū)動(dòng)程序資料4_第5頁
已閱讀5頁,還剩370頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1 第第 4 4 卷卷 圖形驅(qū)動(dòng)程序設(shè)計(jì)指南圖形驅(qū)動(dòng)程序設(shè)計(jì)指南 第第 1 1 部分部分 圖形驅(qū)動(dòng)程序圖形驅(qū)動(dòng)程序 第第 2 2 部分部分 顯示器及視頻微端口驅(qū)動(dòng)程序顯示器及視頻微端口驅(qū)動(dòng)程序 第第 3 3 部分部分 打印機(jī)驅(qū)動(dòng)程序及假脫機(jī)打印部件打印機(jī)驅(qū)動(dòng)程序及假脫機(jī)打印部件 2 第第 1 1 部分部分 圖形驅(qū)動(dòng)程序圖形驅(qū)動(dòng)程序 第 1 章 圖形系統(tǒng)概述 第 2 章 GDI 支持的圖形驅(qū)動(dòng)程序 第 3 章 對(duì) DDI 的支持 第第 1 1 章章 圖形系統(tǒng)概述圖形系統(tǒng)概述 Microsoft Windows NT/Windows 2000 提供了一個(gè)健壯的圖形體系結(jié)構(gòu),使第三方 圖形硬件公司能

2、很容易地集成其視頻顯示器和打印設(shè)備。本書為編寫有效的圖形驅(qū)動(dòng)程序 提供了設(shè)計(jì)指南??煞譃橐韵聨讉€(gè)部分: Part 1:圖形驅(qū)動(dòng)程序 Part 1 描述了圖形驅(qū)動(dòng)程序接口(GDI)和設(shè)備驅(qū)動(dòng)程序接口(DDI) ,討論了顯示器 和打印機(jī)驅(qū)動(dòng)程序公共的設(shè)計(jì)和實(shí)現(xiàn)細(xì)節(jié)。 Part 2:顯示器和視頻微端口驅(qū)動(dòng)程序 Part 2 描述了 Windows NT/Windows 2000 的視頻顯示器環(huán)境,為顯示器和視頻微端 口驅(qū)動(dòng)程序編寫者提供了設(shè)計(jì)和實(shí)現(xiàn)細(xì)節(jié)。 Part 3:打印機(jī)驅(qū)動(dòng)程序和假脫機(jī)打印部件 Part 3 描述了構(gòu)成 Windows NT/Windows 2000 打印環(huán)境的驅(qū)動(dòng)程序和假脫機(jī)

3、打印部 件,解釋了如何提供驅(qū)動(dòng)程序和假脫機(jī)打印部件的定制,以提供對(duì)新的打印機(jī)硬件和網(wǎng)絡(luò) 配置的支持。 Part 4:靜態(tài)映像驅(qū)動(dòng)程序 Part 4 可以在在線 DDK 上找到,描述了用 Microsoft 靜態(tài)映像體系結(jié)構(gòu)(Microsoft STI)定義的 COM 接口,這對(duì)提供平板掃描儀和數(shù)字靜態(tài)映像相機(jī)這些靜態(tài)映像硬件的供應(yīng) 商是有用的。 圖形驅(qū)動(dòng)程序的術(shù)語表,在在線 DDK 上Design Guide的結(jié)尾可以找到,對(duì)圖形子系 統(tǒng)和驅(qū)動(dòng)程序設(shè)計(jì)定義了詳細(xì)的術(shù)語和縮略語。 圖形驅(qū)動(dòng)程序函數(shù)參考可以在在線 DDK 的Graphics Driver Reference中找到。 1.11.1

4、文檔約定文檔約定 本書使用的字體約定和所有其他的 Microsoft Windows 2000 DDK 書中的約定是一 樣的。這些約定在驅(qū)動(dòng)程序編寫者指南中描述。 許多 DDK 視頻和打印機(jī)代碼例子中使用了匈牙利命名規(guī)則。匈牙利命名規(guī)則在平臺(tái) SDK 文檔中描述。 3 第第 2 2 章章 對(duì)圖形驅(qū)動(dòng)程序的對(duì)圖形驅(qū)動(dòng)程序的 GDIGDI 支持支持 本章描述了 Microsoft Windows NT/Windows 2000 圖形設(shè)備接口(GDI) ,詳細(xì)說明 了 GDI 提供的對(duì)圖形驅(qū)動(dòng)程序的支持。 本書中術(shù)語“GDI”指的是核心模式 GDI(也稱作圖形引擎) ;對(duì) Microsoft Win

5、32 DDI 的引用是顯式的。核心模式 GDI 也稱作圖形引擎。 在線 Windows 2000 DDK Graphics Driver Reference中記錄了 GDI 函數(shù)和結(jié)構(gòu)參考。 大多數(shù) GDI 函數(shù)聲明和結(jié)構(gòu)定義在winddi.h中。對(duì)于顯示器驅(qū)動(dòng)程序,DirectDraw 堆管 理器函數(shù)在dmemmgr.h中聲明。這兩個(gè)文件都和 Windows 2000 DDK 一起發(fā)布。 2.12.1 從驅(qū)動(dòng)程序的觀點(diǎn)看從驅(qū)動(dòng)程序的觀點(diǎn)看 GDIGDI GDI 是 Windows NT/Windows 2000 圖形驅(qū)動(dòng)程序和應(yīng)用之間的中介支持。應(yīng)用程 序調(diào)用 Win32 GDI 函數(shù)進(jìn)行圖

6、形輸出請(qǐng)求,這個(gè)請(qǐng)求通過核心模式 GDI 發(fā)送。然后核心 模式 GDI 把這些請(qǐng)求發(fā)送到相應(yīng)的圖形驅(qū)動(dòng)程序,如顯示器驅(qū)動(dòng)程序或打印機(jī)驅(qū)動(dòng)程序。 核心模式 GDI 是一個(gè)不能被替代的系統(tǒng)提供的模塊。 GDI 通過一系列設(shè)備驅(qū)動(dòng)程序接口(DDI)函數(shù)和圖形驅(qū)動(dòng)程序通信。這些函數(shù)用其 前綴 DrvDrv 標(biāo)識(shí)。信息通過這些入口點(diǎn)的輸入/輸出參數(shù)在 GDI 和驅(qū)動(dòng)程序之間傳遞。驅(qū)動(dòng)程 序必須支持某些 DrvDrvXxx函數(shù)用于 GDI 調(diào)用。在返回 GDI 之前,驅(qū)動(dòng)程序通過執(zhí)行在其相關(guān) 硬件上相應(yīng)的操作來支持 GDI 請(qǐng)求。 GDI 本身包括許多圖形輸出能力,去除驅(qū)動(dòng)程序中支持這些能力的需求就能減小

7、驅(qū)動(dòng) 程序的大小。GDI 也輸出驅(qū)動(dòng)程序能夠調(diào)用的服務(wù)函數(shù),進(jìn)一步減小了驅(qū)動(dòng)程序必須提供 支持的圖形輸出能力。GDI 服務(wù)函數(shù)用其 EngEng 前綴標(biāo)識(shí),而提供訪問 GDI 維護(hù)的結(jié)構(gòu)的函 數(shù)用XxxOBJOBJ_Xxx的形式命名。 圖 2.1 顯示了這個(gè)通信流。 圖 2.1 圖形驅(qū)動(dòng)程序和 GDI 的相互作用 2.1.12.1.1 作為應(yīng)用圖形語言的作為應(yīng)用圖形語言的 GDIGDI Win32 GDI 和圖形引擎都是完全與設(shè)備無關(guān)的。因此,應(yīng)用不需要直接訪問硬件。基 于一個(gè)應(yīng)用圖形請(qǐng)求,GDI 與設(shè)備無關(guān)的驅(qū)動(dòng)程序一起工作,為一組圖形設(shè)備提供高品質(zhì) 的圖形輸出。打印和顯示設(shè)備使用相同的 G

8、DI 代碼路徑。 2.1.22.1.2 作為繪制引擎的作為繪制引擎的 GDIGDI 對(duì)于繪圖操作,驅(qū)動(dòng)程序首先必須對(duì)每個(gè)已經(jīng)有效的 PDEV 結(jié)構(gòu)啟用一個(gè)表面。PDEV 是一個(gè)物理設(shè)備的邏輯表示。如果硬件能夠用 GDI 標(biāo)準(zhǔn)格式的位圖建立,GDI 就能用來進(jìn) 4 行一些或所有的位圖表面的繪制。GDI 也能處理高級(jí)的過渡調(diào)色技術(shù)。 對(duì)于啟用 PDEV和表面的信息,參考圖形驅(qū)動(dòng)程序參考中的 DrvEnablePDEVDrvEnablePDEV 和 DrvEnableSurfaceDrvEnableSurface 函數(shù)。 2.1.2.12.1.2.1 GDIGDI 管理的位圖管理的位圖 GDI 全部

9、用設(shè)備無關(guān)位圖(DIB)格式管理位圖,包括每個(gè)像素 1 位、4 位、8 位、16 位、24 位和 32 位。在這些位圖上,GDI 能進(jìn)行所有的繪制直線、填充、文本輸出以及位塊 傳輸(bitblt)操作。這使得驅(qū)動(dòng)程序用 GDI 進(jìn)行所有的圖形繪制,或者使用實(shí)現(xiàn)函數(shù)都 是可能的,因?yàn)橛布峁┝颂貏e支持。 如果設(shè)備在 DIB 格式中有幀緩沖區(qū),GDI 能夠直接把一些或所有的圖形輸出到幀緩沖 區(qū),因而減小了驅(qū)動(dòng)程序的大小。如果設(shè)備使用了非標(biāo)準(zhǔn)格式的幀緩沖區(qū),驅(qū)動(dòng)程序就必 須實(shí)現(xiàn)所有要求的繪圖函數(shù)。GDI 還能模擬大多數(shù)繪圖函數(shù),盡管提高了性能上的代價(jià): 像素在被 GDI 操作之前必須拷貝到一個(gè)標(biāo)準(zhǔn)格

10、式的位圖中,并且在繪圖完成后必須拷貝回 原來的格式。 2.1.2.22.1.2.2 GDIGDI 管理的直線和曲線管理的直線和曲線 GDI 提供了改進(jìn)的直線和曲線的定義。在 DEVICE 坐標(biāo)中直線端點(diǎn)的坐標(biāo)不要求是整 數(shù),就像 Windows 3.x 一樣。這允許驅(qū)動(dòng)程序不進(jìn)行大致的取舍就傳送圖形對(duì)象。在 GDI 中基本的曲線是貝塞爾曲線(立方體鋸齒)而不是一個(gè)橢圓。所有的 GDI 內(nèi)部操作是用貝 塞爾曲線處理的,它們被大多數(shù)高端的設(shè)備支持。對(duì)那些不處理貝塞爾曲線的設(shè)備,GDI 在調(diào)用驅(qū)動(dòng)程序繪制它們之前把曲線分割成直線段。 GDI 能夠下載用路徑形式填充的區(qū)域,還有矩形的形式。驅(qū)動(dòng)程序能夠

11、把路徑分解成 梯形或區(qū)間進(jìn)行填充。 2.1.2.32.1.2.3 GDIGDI 管理的屬性:畫刷管理的屬性:畫刷 GDI 也管理所有的屬性。GDI 把屬性作為畫刷傳遞給驅(qū)動(dòng)程序:驅(qū)動(dòng)程序通過把畫刷 轉(zhuǎn)換成有用的內(nèi)部格式來實(shí)現(xiàn)它們。GDI 為驅(qū)動(dòng)程序維護(hù)這些轉(zhuǎn)換信息。GDI 還維護(hù)畫刷所 有的狀態(tài):包括范圍、相關(guān)性、當(dāng)前位置和線型。驅(qū)動(dòng)程序能夠緩存信息但不用來維護(hù)任 何狀態(tài)。除了初始化和畫刷實(shí)現(xiàn),GDI 僅調(diào)用驅(qū)動(dòng)程序在設(shè)備上繪圖。在調(diào)用驅(qū)動(dòng)程序之 前,GDI 關(guān)心轉(zhuǎn)換、區(qū)域鎖定以及指針與非操作。 當(dāng)驅(qū)動(dòng)程序要求使用還未實(shí)現(xiàn)的畫刷,就需要回調(diào) GDI。GDI 為畫刷分配存儲(chǔ)器并調(diào) 用驅(qū)動(dòng)程序來實(shí)

12、現(xiàn)它,如果需要,可以進(jìn)行抖動(dòng)處理。 2.1.2.42.1.2.4 GDIGDI 過渡調(diào)色功能過渡調(diào)色功能 GDI 的過渡調(diào)色功能產(chǎn)生了高品質(zhì)的抖動(dòng)或顏色過渡調(diào)色映像,提供給沒有內(nèi)置這些 功能的打印設(shè)備和顯示設(shè)備。顏色過渡調(diào)色能提供: 5 在給定的設(shè)備上提供最高品質(zhì)的可再現(xiàn)的彩色和灰度級(jí)別 在一組有限的強(qiáng)度級(jí)別上提高可視分辨率 在不同的輸出設(shè)備之間改進(jìn)彩色相關(guān)性 傳統(tǒng)的模擬過渡調(diào)色是一個(gè)使用過渡調(diào)色屏幕的單元過程。這個(gè)屏幕由相等大小的 單元組成,中心到中心是固定的單元間隔。固定單元間隔調(diào)節(jié)墨水的濃度,而點(diǎn)的尺寸可 以改變,用來產(chǎn)生連續(xù)色調(diào)的印記。 在計(jì)算機(jī)上大多數(shù)打印或屏幕陰影也使用固定單元的像

13、素尺寸。為模擬點(diǎn)大小的變 化,用一束像素的組合來模擬過渡調(diào)色屏幕。在 Windows NT/Windows 2000 中,GDI 包 括提供一個(gè)好的第一近似的過渡調(diào)色缺省參數(shù)。額外的設(shè)備指定信息能加進(jìn)系統(tǒng)以改進(jìn)輸 出。 2.22.2 GDI/GDI/驅(qū)動(dòng)程序的分工驅(qū)動(dòng)程序的分工 為了理解圖形驅(qū)動(dòng)程序設(shè)計(jì),弄懂 GDI 和驅(qū)動(dòng)程序的角色以及它們?nèi)绾螀f(xié)調(diào)是重要 的。具有增強(qiáng)能力的 GDI 能夠處理很多圖形驅(qū)動(dòng)程序預(yù)先要求的操作。GDI 對(duì)于管理一些 對(duì)圖形操作很關(guān)鍵的數(shù)據(jù)結(jié)構(gòu),例如表面,也是有效的,盡管每個(gè)圖形驅(qū)動(dòng)程序必須訪問 它們。 2.2.12.2.1 GDIGDI 和驅(qū)動(dòng)程序的通信和驅(qū)動(dòng)程序

14、的通信 驅(qū)動(dòng)程序?qū)τ?GDI 僅輸出一個(gè)函數(shù):DrvEnableDriverDrvEnableDriver。所有其他的驅(qū)動(dòng)程序支持的 函數(shù),包括 DrvDisableDriverDrvDisableDriver 函數(shù),是 GDI 通過一個(gè)指針數(shù)組來輸出的。GDI 調(diào)用 DrvEnableDriverDrvEnableDriver 初始化驅(qū)動(dòng)程序并返回驅(qū)動(dòng)程序支持的 DDI 函數(shù)列表。因?yàn)橛幸恍?qū)動(dòng) 程序必須支持的函數(shù),所以 GDI 處理操作不包括在驅(qū)動(dòng)程序的 DrvEnableDriverDrvEnableDriver 例程的函 數(shù)表中。當(dāng)驅(qū)動(dòng)程序被卸載時(shí),GDI 調(diào)用 DrvDisableD

15、riverDrvDisableDriver。DDI 函數(shù)在第 3 章“支持 DDI”中深入討論。 GDI 使大量的服務(wù)對(duì)于驅(qū)動(dòng)程序是可用的。這些服務(wù)分為兩類:用戶對(duì)象和服務(wù)例程。 2.2.1.12.2.1.1 GDIGDI 用戶對(duì)象用戶對(duì)象 GDI 保護(hù)重要的內(nèi)部數(shù)據(jù)結(jié)構(gòu),但通過把它們作為用戶對(duì)象傳遞使驅(qū)動(dòng)程序能訪問這 些結(jié)構(gòu)的公共域。用戶對(duì)象是中間數(shù)據(jù)結(jié)構(gòu),在 GDI 數(shù)據(jù)結(jié)構(gòu)和需要訪問這些結(jié)構(gòu)內(nèi)的信 息的驅(qū)動(dòng)程序之間提供了接口。驅(qū)動(dòng)程序能把指向用戶對(duì)象的指針傳遞回 GDI,用以詢問 消息信息或請(qǐng)求各種服務(wù)。帶有公共域的用戶對(duì)象有下列優(yōu)點(diǎn): 排除了直接訪問內(nèi)部 GDI 數(shù)據(jù)結(jié)構(gòu)相關(guān)的問題。

16、為驅(qū)動(dòng)程序提供了一個(gè)空間保存 GDI 數(shù)據(jù)。例如,PATHOBJ 結(jié)構(gòu)能保存計(jì)算一個(gè) 復(fù)雜對(duì)象(如路徑)要求的所有額外數(shù)據(jù)。 下列用戶對(duì)象是可用的: 6 對(duì)象描述 BRUSHOBJ 為圖形函數(shù)定義了畫刷對(duì)象,輸出直線、文本或填充。 驅(qū)動(dòng)程序能調(diào)用 BRUSHOBJ 服務(wù)來實(shí)現(xiàn)畫刷或找到 GDI 預(yù)先緩存的實(shí)現(xiàn)方 法。 CLIPOBJ 為繪圖或填充提供能訪問裁剪區(qū)的驅(qū)動(dòng)程序。這個(gè)區(qū)域能用一系列矩形 計(jì)算。 FLOATOBJ 允許圖形驅(qū)動(dòng)程序模擬浮點(diǎn)操作。浮點(diǎn)操作不適用所有其他的核心模式 驅(qū)動(dòng)程序。 FONTOBJ 使驅(qū)動(dòng)程序訪問字體的一個(gè)特別的實(shí)例(或?qū)崿F(xiàn))的信息。 PALOBJ 包含 RGB

17、調(diào)色板顏色的結(jié)構(gòu);通過 PALOBJ_cGetColors 和 DrvSetPalette 函數(shù)可以訪問。 PATHOBJ 定義路徑指定要繪制什么(直線或貝塞爾曲線) 。PATHOBJ 結(jié)構(gòu)傳遞給驅(qū) 動(dòng)程序用以描述要繪制或填充的一系列直線和貝塞爾曲線。 STROBJ 為驅(qū)動(dòng)程序計(jì)算輪廓處理和位置的列表,描述如何繪制文本字符串。 SURFOBJ 識(shí)別一個(gè)表面,它可以是 GDI 位圖、設(shè)備相關(guān)位圖或設(shè)備管理的表面。 更多的信息參見表面類型。 XFORMOBJ 描述一個(gè)任意的線性二維變換,如幾何寬度直線(geometric wide line) 。 XLATEOBJ 定義從源表面格式到目的表面格式轉(zhuǎn)

18、換像素所需要的變換。 2.2.1.22.2.1.2 GDIGDI 服務(wù)例程服務(wù)例程 GDI 輸出許多服務(wù)例程,其名字的形式是 EngXxx。驅(qū)動(dòng)程序動(dòng)態(tài)地連接到 win32k.sys來直接訪問這些例程。GDI 服務(wù)例程包括表面管理、繪圖模擬以及路徑、調(diào)色 板、字體和文本服務(wù)。這些服務(wù)在GDI 支持的服務(wù)中詳細(xì)討論。 2.2.22.2.2 PDEVPDEV 協(xié)商協(xié)商 任何圖形驅(qū)動(dòng)程序的首要任務(wù)之一是在驅(qū)動(dòng)程序初始化期間使 PDEV 有效。PDEV 是物 理設(shè)備的邏輯表現(xiàn)。這個(gè)表現(xiàn)由驅(qū)動(dòng)程序定義,一般是私有的數(shù)據(jù)結(jié)構(gòu)。啟用 PDEV 的更多 的信息參考 DrvEnablePDEVDrvEnable

19、PDEV。 通過 DrvEnablePDEVDrvEnablePDEV 函數(shù),驅(qū)動(dòng)程序必須給 GDI 提供信息,描述請(qǐng)求的設(shè)備及其能 力。驅(qū)動(dòng)程序給 GDI 的一條重要信息是 DEVINFO 結(jié)構(gòu)的 flGraphicsCapsflGraphicsCaps 和 flGraphicsCaps2flGraphicsCaps2 成員中的一組圖形能力標(biāo)志(GCAPS_Xxx 和 GCAPS2_Xxx 標(biāo)志) 。 能力標(biāo)志允許 GDI 確定那些操作是 PDEV 支持的。例如,GDI 測試能力標(biāo)志,指示在 GDI 嘗試用這些基本的類型調(diào)用 DrvStrokePathDrvStrokePath 函數(shù)來繪制路

20、徑之前,PDEV 是否能處理貝 塞爾曲線和幾何寬度直線。如果能力標(biāo)志指示 PDEV 不能處理這些基本類型,GDI 斷開直線 或曲線,使 GDI 能簡化對(duì)驅(qū)動(dòng)程序的調(diào)用。 從驅(qū)動(dòng)程序一側(cè)來看,無論何時(shí)驅(qū)動(dòng)程序從 GDI 獲得一個(gè)高級(jí)的路徑相關(guān)的調(diào)用, 如果路徑或裁剪區(qū)對(duì)設(shè)備進(jìn)行的處理過于復(fù)雜,它可返回 FALSE。 當(dāng)驅(qū)動(dòng)程序處理一條裝飾線(cosmetic line)時(shí)它不能從 DrvStrokePathDrvStrokePath 返回 FALSE,因?yàn)樗仨殲檠b飾線處理任意復(fù)雜的裁剪區(qū)或造型。然而,如果路徑是貝塞爾曲線 或幾何直線,DrvStrokePathDrvStrokePath 能夠返

21、回 FALSE。當(dāng)這種情況出現(xiàn)時(shí),GDI 把調(diào)用分割成簡單 7 的調(diào)用。就像能力標(biāo)志位沒有置 1 一樣。例如,如果當(dāng) DrvStrokePathDrvStrokePath 發(fā)送一個(gè)幾何直線 時(shí)返回 FALSE,GDI 簡化直線并調(diào)用 DrvFillPathDrvFillPath 函數(shù)。 如果 DrvStrokePathDrvStrokePath 被報(bào)告一個(gè)錯(cuò)誤,它必須返回 DDI_ERROR。 在 GDI 和驅(qū)動(dòng)程序之間的這種協(xié)商,對(duì)依賴于 PDEV 的函數(shù),允許 GDI 和驅(qū)動(dòng)程序產(chǎn) 生高質(zhì)量的輸出而無須過多的通信。 2.2.32.2.3 表面協(xié)商表面協(xié)商 繪圖和文本輸出要求一個(gè)繪制的表面。

22、這個(gè)表面由 DrvEnableSurfaceDrvEnableSurface 函數(shù)創(chuàng)建并稱 作主表面(primary surface) 。它也被稱作屏幕上的表面(on-screen surface) ,因?yàn)樗?出現(xiàn)在視頻顯示器上。每個(gè) PDEV 只能啟用一個(gè)主表面,盡管一個(gè)驅(qū)動(dòng)程序能夠支持幾個(gè) PDEV。支持 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函數(shù)的驅(qū)動(dòng)程序能夠創(chuàng)建和使用其他的表面。這些位 圖表面稱作次要表面(secondary surface)或屏幕外的表面(off-screen surface) 。對(duì) 任一種類型的表面,驅(qū)動(dòng)程序負(fù)責(zé)確定它

23、支持的繪圖操作的類型。 2.2.3.12.2.3.1 表面坐標(biāo)表面坐標(biāo) 設(shè)備表面是 228*228像素?cái)?shù)組的子集。這些像素是由一對(duì) 28 位的帶符號(hào)數(shù)尋址的。設(shè) 備表面左上角的像素坐標(biāo)是(0,0) 。設(shè)備表面位于這個(gè)坐標(biāo)空間的右下象限,兩個(gè)坐標(biāo)都 是非負(fù)的。 2.2.3.22.2.3.2 DCDC 原點(diǎn)原點(diǎn) 應(yīng)用程序要求在 227*227像素的數(shù)組范圍內(nèi)保存其圖形。設(shè)備空間在 DDI 級(jí)有其他的 尺寸,因?yàn)榇翱诠芾砥骺赡苡靡粋€(gè)帶符號(hào)的 27 位的坐標(biāo)即DC 原點(diǎn)偏移應(yīng)用程序的坐標(biāo)。 DC 原點(diǎn)對(duì)驅(qū)動(dòng)程序是不可見的,驅(qū)動(dòng)程序在偏移執(zhí)行之后才識(shí)別圖形坐標(biāo)。 2.2.3.32.2.3.3 FIXFI

24、X 坐標(biāo)坐標(biāo) DDI 使用分?jǐn)?shù)坐標(biāo),能夠在設(shè)備表面上 1/16 像素的范圍內(nèi)表示一個(gè)位置。 (在矢量設(shè) 備上,分?jǐn)?shù)坐標(biāo)比設(shè)備分辨率精確 16 倍。 )分?jǐn)?shù)坐標(biāo)用 32 位數(shù)字表示,是帶符號(hào)的 28.4 位 FIX 表示法。在這種表示法中,高 28 位表示坐標(biāo)的整數(shù)部分,最低的 4 位表示分?jǐn)?shù)部分。 例如,0 x0000003C 等于+3.7500,0 xFFFFFFE8 等于-1.5000。 FIX 坐標(biāo)表示直線和貝塞爾曲線的控制點(diǎn)。對(duì)某一對(duì)象,如矩形裁剪區(qū),GDI 用帶符 號(hào)的 32 位整數(shù)表示坐標(biāo)。因?yàn)樽鴺?biāo)是 28 位數(shù),整數(shù)坐標(biāo)最高的 5 位或者全清 0 或者全置 1。 2.2.3.42

25、.2.3.4 表面類型表面類型 8 表面類型在如何處理它們的上下文中可以看到。這些類型如下: 引擎管理的表面 設(shè)備管理的表面(標(biāo)準(zhǔn)格式位圖) 設(shè)備管理的表面(非標(biāo)準(zhǔn)表面) 引擎管理的表面引擎管理的表面 引擎管理的表面有以下特征: 由 GDI 創(chuàng)建和管理。 用一種標(biāo)準(zhǔn)的 DIB 格式作為 DIB 創(chuàng)建:從上至下,原點(diǎn)位于左上角,或者從底 向上,原點(diǎn)位于左下角。 類型為 STYPE_BITMAP。 表面沒有相應(yīng)的設(shè)備句柄。 標(biāo)準(zhǔn)格式位圖是單平面、壓縮像素(每個(gè)像素的數(shù)據(jù)用連續(xù)的方式存儲(chǔ))格式的位 圖。位圖的每條掃描線在 4 字節(jié)的邊界排列。 在 EngCreateBitmapEngCreateBi

26、tmap 函數(shù)中創(chuàng)建的位圖是 DIB 格式。為了使引擎能管理位圖,必須 是 DIB 格式。 設(shè)備管理的表面(標(biāo)準(zhǔn)格式位圖)設(shè)備管理的表面(標(biāo)準(zhǔn)格式位圖) 設(shè)備管理的表面有以下特征: 通過對(duì)設(shè)備驅(qū)動(dòng)程序的 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函數(shù)的調(diào)用創(chuàng)建。 有一個(gè)表面的相關(guān)設(shè)備句柄(DHSURF;參見在線 DDK Graphics Driver Reference中的 SURFOBJ。 ) 可以是透明的或不透明的。 不透明的設(shè)備管理表面是一種 GDI 既沒有任何有關(guān)位圖格式的信息,也沒有位圖中 位的參考信息的表面。因?yàn)檫@些原因,驅(qū)動(dòng)程序最少必須

27、支持 DrvBitBltDrvBitBlt、DrvTextOutDrvTextOut 和 DrvStockePathDrvStockePath 函數(shù)。這樣的表面的類型是 STYPE_DEVICE。 透明的設(shè)備管理表面是一種 GDI 含有有關(guān)位圖格式的信息并知道位圖中位的位置的 表面。因?yàn)檫@個(gè)原因,驅(qū)動(dòng)程序不需要實(shí)現(xiàn)任何繪圖操作,并使它們都服從 GDI。這樣的 表面的類型是 STYPE_BITMAP。 驅(qū)動(dòng)程序?yàn)榱宿D(zhuǎn)換不透明的位圖到透明的位圖,它必須調(diào)用 EngModifySurfaceEngModifySurface 函數(shù)。 通過這一調(diào)用,驅(qū)動(dòng)程序通知 GDI 位圖格式和在存儲(chǔ)器中位圖的位置。

28、 設(shè)備管理的 DIB 表面允許驅(qū)動(dòng)程序回調(diào) GDI 使 GDI 在表面繪圖。管理其自身表面的 驅(qū)動(dòng)程序,也能通過在其表面周圍封裝 DIB(用 EngCreateBitmapEngCreateBitmap 創(chuàng)建)而引用到 GDI 的 回調(diào),使用 DIB 除外。 設(shè)備管理的表面(非標(biāo)準(zhǔn)格式位圖)設(shè)備管理的表面(非標(biāo)準(zhǔn)格式位圖) 通過調(diào)用 EngCreateDeviceSurfaceEngCreateDeviceSurface 函數(shù)使 GDI 創(chuàng)建表面并返回一個(gè)句柄,驅(qū)動(dòng)程序 可以啟用一個(gè)設(shè)備管理的非 DIB 表面。GDI 依賴驅(qū)動(dòng)程序訪問和控制繪制到何處,并從設(shè) 備管理的表面讀出。 設(shè)備相關(guān)位圖(

29、DDB) ,有時(shí)稱作設(shè)備格式位圖,是另一種類型的非 DIB、設(shè)備管理的 表面。DDB 支持某些驅(qū)動(dòng)程序,如 VGA 驅(qū)動(dòng)程序,實(shí)現(xiàn)快速的位圖到屏幕的塊傳送。DDB 也 允許驅(qū)動(dòng)程序在屏幕外的顯示存儲(chǔ)器繪制非 DIB 位圖。如果請(qǐng)求了 DDB,驅(qū)動(dòng)程序能支持 DrvCreateDeviceBitmapDrvCreateDeviceBitmap 函數(shù)并調(diào)用 EngCreateDeviceBitmapEngCreateDeviceBitmap 函數(shù)使引擎返回一個(gè)到位圖 的句柄。 9 2.2.3.52.2.3.5 GDIGDI 彩色空間轉(zhuǎn)換彩色空間轉(zhuǎn)換 GDI 使用三個(gè) RGB 顏色空間描述它的位圖。

30、在每個(gè)顏色空間中,三個(gè)位域,或顏色通 道,在給定的顏色中分別用來指定紅、綠、藍(lán)使用的位的數(shù)量。為了能匹配 GDI 的位圖能 力,顯示器驅(qū)動(dòng)程序必須能從一個(gè) RGB 顏色空間轉(zhuǎn)換到另一個(gè)。 GDI 能識(shí)別下列的顏色空間。 5,5,5RGB:紅、綠、藍(lán)都是 5 位顏色通道。 5,6,5RGB:紅色是 5 位顏色通道,綠色是 6 位顏色通道,藍(lán)色是 5 位顏色通 道。 8,8,8RGB:紅、綠、藍(lán)都是 8 位顏色通道。 通常,當(dāng)從一個(gè)多位的顏色通道向少位的顏色通道轉(zhuǎn)換時(shí),GDI 丟棄掉低位。當(dāng)從一 個(gè)少位的顏色通道向多位的通道轉(zhuǎn)換時(shí),較小通道的所有位全部拷貝到較大的通道。為了 填充較大通道的剩余位,

31、較小通道的某些位將再次拷貝到較大的通道。下表概述了 GDI 從 一個(gè) RGB 顏色空間轉(zhuǎn)換到另一個(gè)所使用的規(guī)則。在這個(gè)表中,轉(zhuǎn)換過程中值發(fā)生改變的顏 色通道用黑體黑體表示。 GDI 顏色空間轉(zhuǎn)換規(guī)則 FromTo 規(guī)則例子 5,5,55,6,5 源的綠色通道的最高有效位 (MSB)加到目標(biāo)的綠色通道 的低位最后。 (0 x15,0 x190 x19,0 x1D)變成 (0 x15,0 x330 x33,0 x1D) 。 注意只有綠色通道改變。 源的 5 位通道的值是二進(jìn)制 11001,轉(zhuǎn)換成 6 位值, 110011。 5,5,58,8,8 對(duì)每個(gè)通道,源通道的 3 個(gè) MSB 加到目標(biāo)通道的

32、最低位 的最后。 (0 x150 x15,0 x190 x19,0 x1D0 x1D)變成 (0 xAD0 xAD,0 xCE0 xCE,0 xEF0 xEF) 。 在紅色通道中,10101 變成 10101101。類似的變化也出 現(xiàn)在綠色和藍(lán)色通道。 5,6,55,5,5 丟棄源綠色通道的最低有效 位(LSB) 。 (0 x15,0 x330 x33,0 x1D)變成 (0 x15,0 x190 x19, 0 x1D) 。 注意只有綠色通道改變。 丟棄 110011 的最低位,得到 11001。 5,6,58,8,8 對(duì)源的 5 位通道(紅色和藍(lán) 色) ,從源通道拷貝 3 個(gè) MSB 加到目

33、標(biāo)通道的最低位的最 后。對(duì) 6 位的綠色通道,從 源通道拷貝 2 個(gè) MSB 加到目 標(biāo)通道的最低位的最后。 (0 x150 x15,0 x330 x33,0 x1D0 x1D)變成 (0 xAD0 xAD,0 xCE0 xCE,0 xEF0 xEF) 。 在紅色通道中,10101 變成 10101101。在綠色通道中, 110011 變成 11001111。藍(lán)色 通道的變化和紅色通道類似。 8,8,85,5,5 丟棄源通道的 3 個(gè)最低有效 位(LSB) 。 (0 xAB0 xAB,0 xCD0 xCD,0 xEF0 xEF)變成 (0 x150 x15,0 x190 x19,0 x1D0

34、x1D) 。 在紅色通道中,10101101 變 成 10101。類似的變化也出 現(xiàn)在其他兩個(gè)通道。 10 8,8,85,6,5 丟棄紅色和藍(lán)色通道的 3 個(gè) 最低有效位(LSB) 。丟棄綠 色通道的 2 個(gè)最低有效位 (LSB) 。 (0 xAB0 xAB,0 xCD0 xCD,0 xEF0 xEF)變成 (0 x150 x15,0 x330 x33,0 x1D0 x1D) 。 在綠色通道中,11001101 變 成 110011。紅色和藍(lán)色通道 的變化與前面列出的變換相 同。 2.2.3.62.2.3.6 HookingHooking 和和 PuntingPunting 術(shù)語Hooking

35、和Punting指的是驅(qū)動(dòng)程序決定是否提供標(biāo)準(zhǔn)的位圖繪畫操作,或依 賴 GDI 提供這些操作。如果驅(qū)動(dòng)程序?qū)崿F(xiàn)了引擎管理的表面,GDI 能處理所有的繪圖操作。 然而,如果硬件能加速這些操作,驅(qū)動(dòng)程序能提供一個(gè)或更多的繪圖函數(shù)。通過實(shí)現(xiàn),或 Hooking DrvXxx函數(shù)來做到這一點(diǎn)。 也許只想實(shí)現(xiàn)繪圖操作的一個(gè)子集,實(shí)現(xiàn)一個(gè)特殊的 DDI 接口點(diǎn)。對(duì)它不支持的任 何操作,驅(qū)動(dòng)程序能調(diào)用相應(yīng)的 GDI 函數(shù)來實(shí)現(xiàn)。這稱作 Punting 到 GDI。有一些情形是 操作必須在驅(qū)動(dòng)程序內(nèi)實(shí)現(xiàn)。例如,如果驅(qū)動(dòng)程序?qū)崿F(xiàn)了一個(gè)設(shè)備管理的表面,某些繪圖 函數(shù)必須在顯示器驅(qū)動(dòng)程序內(nèi)完成。 HookingHo

36、oking 缺省情況下,當(dāng)繪圖表面是引擎管理的表面時(shí),GDI 處理繪畫(繪圖)操作。驅(qū)動(dòng)程 序利用硬件對(duì)一給定的表面,為一些或所有的繪圖函數(shù)提供了加速,或者使用了特別的塊 傳送硬件,能夠 hook 這些函數(shù)。對(duì)于 hook 調(diào)用,驅(qū)動(dòng)程序把 hook 指定為 EngAssociateSurface 和 EngModifySurface 函數(shù)flHook參數(shù)的標(biāo)記。 如果驅(qū)動(dòng)程序指定了一個(gè)函數(shù)的 hook 標(biāo)記,它必須提供在其支持 DDI 入口點(diǎn)的列表 中的函數(shù)。驅(qū)動(dòng)程序能夠優(yōu)化具有硬件支持的操作。這樣的驅(qū)動(dòng)程序在一個(gè) hook 調(diào)用中可 能只能處理某一種情況。例如,如果在一個(gè) hook 調(diào)用中

37、請(qǐng)求了復(fù)雜的圖形,它可能還要更 有效地直接回調(diào) GDI,允許 GDI 處理操作。 這里還有另一個(gè)例子,驅(qū)動(dòng)程序選擇是否處理 hook 調(diào)用。考慮應(yīng)該支持硬件的驅(qū)動(dòng) 程序,有能力用某些ROP處理位塊傳輸調(diào)用。即使驅(qū)動(dòng)程序能夠獨(dú)立地實(shí)現(xiàn)許多操作,其 他方面僅是一個(gè)緩沖區(qū)。這樣的驅(qū)動(dòng)程序?qū)閹彌_區(qū)給位圖表面返回一個(gè)句柄,就像為 其 PDEV 表面一樣,但它將為自己 hook DrvBitBlt 調(diào)用。當(dāng) GDI 調(diào)用 DrvBitBlt 時(shí),驅(qū)動(dòng) 程序能夠檢查ROP來看它是否是由硬件支持的一個(gè)函數(shù)。如果不是,驅(qū)動(dòng)程序能通過對(duì) EngBitBlt 的一個(gè)調(diào)用把操作傳遞 GDI。 支持設(shè)備管理表面的驅(qū)

38、動(dòng)程序必須向外 hook 一些繪圖函數(shù),名字是 DrvCopyBits、DrvTextOut 和 DrvStrokePath。雖然 GDI 模擬能夠處理其他繪圖函數(shù),因?yàn)?性能上的原因推薦這種類型的驅(qū)動(dòng)程序 hook 其他函數(shù),就像 DrvBitBlt 和 DrvRealizeBrush 函數(shù),因?yàn)槟M需要從或向表面繪圖。 PuntingPunting Punting 回調(diào)到 GDI 的意思是提交一個(gè)調(diào)用到相應(yīng)的 GDI 模擬。通常,對(duì)每個(gè) DrvXxx調(diào)用都有一個(gè)相應(yīng)的 GDI EngXxx模擬調(diào)用,帶有相同的參數(shù)。在驅(qū)動(dòng)程序制作透 明的位圖時(shí),所有的參數(shù)都沒有改變地傳遞到 GDI 模擬。對(duì)

39、每個(gè)調(diào)用驅(qū)動(dòng)程序 punt 回 GDI,驅(qū)動(dòng)程序的大小縮減了(因?yàn)楣δ苌系拇a忽略了) 。然而,因?yàn)橐鎿碛姓{(diào)用,驅(qū) 動(dòng)程序在執(zhí)行速度上沒有控制。對(duì)一些復(fù)雜的情況,在驅(qū)動(dòng)程序中提供支持也許沒有實(shí)際 11 的優(yōu)勢。 可以可以 hookhook 的的 GDIGDI 圖形輸出函數(shù)圖形輸出函數(shù) 驅(qū)動(dòng)程序能夠 hook 的圖形輸出函數(shù)和相應(yīng)的 GDI 模擬在下表中列出。 驅(qū)動(dòng)程序圖形輸出函數(shù)相應(yīng)的 GDI 模擬 DrvBitBltEngBitBlt DrvPlgBltEngPlgBlt DrvStretchBltEngStretchBlt DrvStretchBltROPEngStretchBltROP

40、 DrvTextOutEngTextOut DrvStrokePathEngStrokePath DrvFillPathEngFillPath DrvStrokeAndFillPathEngStrokeAndFillPath DrvLineToEngLineTo DrvCopyBitsEngCopyBits DrvAlphaBlendEngAlphaBlend DrvGradientFillEngGradientFill DrvTransparentBltEngTransparentBlt 2.32.3 GDIGDI 支持的服務(wù)支持的服務(wù) GDI 輸出許多服務(wù)例程,能簡化驅(qū)動(dòng)程序的設(shè)計(jì)。驅(qū)動(dòng)程

41、序能夠直接調(diào)用這些例程。 通常圖形引擎服務(wù)例程的名字以Eng開頭。與特殊的對(duì)象相關(guān)的服務(wù)例程總是用對(duì)象的名 字開頭;例如,CLIPOBJ_cEnumStartCLIPOBJ_cEnumStart 是一個(gè) CLIPOBJ 服務(wù)。 注意注意 第一個(gè)參數(shù)是用戶對(duì)象的指針的任務(wù)例程,是用戶對(duì)象的方法和使用通常的 C+慣例調(diào)用。因此,用 C+寫的驅(qū)動(dòng)程序能作為方法訪問服務(wù)例程。 這些服務(wù)例程有以下幾類: 表面管理 調(diào)色板服務(wù) 路徑服務(wù) 繪圖服務(wù) 字體和文本服務(wù) 第 3 章“支持 DDI”描述了 DDI 的入口點(diǎn),并解釋許多這些服務(wù)例程能用來幫助驅(qū)動(dòng) 程序?qū)崿F(xiàn)入口點(diǎn)。每個(gè)服務(wù)函數(shù)的詳細(xì)描述參見在線 DDK

42、。 2.3.12.3.1 GDIGDI 對(duì)表面的支持對(duì)表面的支持 對(duì)每個(gè) PDEV,驅(qū)動(dòng)程序必須支持 DrvEnableSurface 函數(shù)。DrvEnableSurface 建立 要繪制的表面并將其和 PDEV 相關(guān)。驅(qū)動(dòng)程序也必須支持 DrvDisableSurface 函數(shù)停止創(chuàng)建 的表面。因?yàn)?GDI 創(chuàng)建和維護(hù)表面,驅(qū)動(dòng)程序依賴幾個(gè) GDI 服務(wù)函數(shù)(在下頁的表中列出) 實(shí)現(xiàn)啟用和禁止表面。 函數(shù)名用途 12 EngAssociateSurface 用 PDEV 相關(guān)一個(gè)表面并定義驅(qū)動(dòng)程序編寫者要 hook 的那個(gè)表面的繪圖操作。它使用 PDEV 缺省的調(diào)色板 和方式步驟。驅(qū)動(dòng)程序在

43、 DrvEnableSurface 的執(zhí)行 過程中必須對(duì)主表面進(jìn)行調(diào)用。當(dāng)驅(qū)動(dòng)程序在鎖定 表面進(jìn)行寫之前啟用第二個(gè)表面時(shí),也必須進(jìn)行這 個(gè)調(diào)用。 EngCheckAbort (僅針對(duì)打印機(jī))使打印機(jī)驅(qū)動(dòng)程序能夠測定打印機(jī) 的工作是否已經(jīng)結(jié)束。 EngCreateBitmap 創(chuàng)建一個(gè)標(biāo)準(zhǔn)格式 DIB。在這種類型表面上 GDI 能夠 執(zhí)行所有繪圖操作。 EngCreateDeviceBitmap 創(chuàng)建一個(gè) DDB,驅(qū)動(dòng)程序在上面繪圖是可靠的(雖然 也可創(chuàng)建一個(gè) DIB,在這種情況下驅(qū)動(dòng)程序能夠回調(diào) 以使 GDI 在上面繪圖。 EngCreateDeviceSurfac e 創(chuàng)建一個(gè)設(shè)備管理表面。

44、驅(qū)動(dòng)程序?yàn)檫@個(gè)表面管理 某些繪圖操作是可靠的。此函數(shù)又返回一個(gè)驅(qū)動(dòng)程 序管理句柄。 EngDeleteSurface 刪除一個(gè)表面(DIB,DDB,或設(shè)備管理表面) EngEraseSurface 在表面上用給定的顏色填充指定的矩形,有效地清 除表面。調(diào)用這個(gè)函數(shù)僅可清除一個(gè) GDI 位圖表面。 EngLockSurface 通過創(chuàng)建表面的一個(gè)用戶對(duì)象(SURFOBJ)使驅(qū)動(dòng)程 序訪問已創(chuàng)建的表面。 (源表面是不鎖定的。 ) EngMarkBandingSurface (僅針對(duì)打印機(jī))標(biāo)記表面為相關(guān)的表面。 EngUnlockSurface 當(dāng)驅(qū)動(dòng)程序已完成一項(xiàng)繪圖操作時(shí)釋放一個(gè)表面 (禁止第

45、二個(gè)表面時(shí)調(diào)用此函數(shù)) 這些函數(shù)更詳細(xì)的內(nèi)容,請(qǐng)參考在線 DDK。 2.3.22.3.2 GDIGDI 支持的調(diào)色板支持的調(diào)色板 GDI 可以做大多數(shù)有關(guān)調(diào)色板管理的工作。當(dāng) GDI 調(diào)用 DrvEnablePDEV 函數(shù),驅(qū)動(dòng)程 序把缺省的調(diào)色板作為 DEVINFO 結(jié)構(gòu)的一部分返回到 GDI。驅(qū)動(dòng)程序必須用 EngCreatePalette 函數(shù)創(chuàng)建這個(gè)調(diào)色板。 調(diào)色板有效地把 32 位顏色索引映射到 24 位 RGB 顏色值,這是 GDI 使用調(diào)色板的方 法。驅(qū)動(dòng)程序指定其調(diào)色板,這樣 GDI 能確定不同的顏色索引如何在設(shè)備上出現(xiàn)。 驅(qū)動(dòng)程序只要使用 GDI 提供的 XLATEOBJ,就

46、不需要處理大多數(shù)調(diào)色板操作和計(jì)算。 如果設(shè)備支持可改變的調(diào)色板,必須實(shí)現(xiàn) DrvSetPalette 函數(shù)。當(dāng)應(yīng)用為設(shè)備改變 調(diào)色板并把作為結(jié)果的新調(diào)色板傳遞給驅(qū)動(dòng)程序時(shí),GDI 調(diào)用 DrvSetPalette。驅(qū)動(dòng)程序要 設(shè)置內(nèi)部的硬件調(diào)色板,盡可能地匹配新調(diào)色板。 可以用下表列出的兩種格式為 GDI 定義調(diào)色板。 調(diào)色板格式描述 Indexed 一個(gè)顏色索引是 RGB 值的數(shù)組的一個(gè)索引。這一數(shù) 組可以是小的,例如,包括 16 個(gè)顏色索引;或者是 大的,例如,包括 4096 個(gè)顏色索引,甚至更多。 Bit Fields 顏色索引里的位域依據(jù)每一種顏色里 R、G 和 B 的數(shù) 量指定顏色。

47、例如,5 位能夠用來為每一種顏色提供 13 0 和 31 之間的一個(gè)值。當(dāng)轉(zhuǎn)換為 RGB 時(shí),每個(gè)部分 的 5 位的值將放大到包括 0255 的范圍。 (通常 RGB 代表自己是由位域定義的) 相反,GDI 一般使用調(diào)色板映射。也就是說,應(yīng)用指定一個(gè) RGB 顏色進(jìn)行繪圖,并且 GDI 必須指定設(shè)備顯示的顏色索引的地址。就像下表指出的,GDI 提供兩種主要的調(diào)色板服 務(wù)函數(shù)用來創(chuàng)建和刪除調(diào)色板,以及一些與 PALOBJ 和 XLATEOBJ 有關(guān)的服務(wù)函數(shù)用于在兩 個(gè)調(diào)色板之間轉(zhuǎn)換顏色索引。 函數(shù)描述 EngCreatePalette 創(chuàng)建一個(gè)調(diào)色板。驅(qū)動(dòng)程序通過給 DEVINFO 結(jié)構(gòu)里 的

48、調(diào)色板返回一個(gè)句柄使設(shè)備和調(diào)色板相聯(lián)系。 EngDeletePalette 刪除給定的調(diào)色板。 PALOBJ_cGetColors 允許驅(qū)動(dòng)程序從從一個(gè)索引的調(diào)色板下載 RBG 顏色。 它由顯示驅(qū)動(dòng)程序在 DrvSetPalette 函數(shù)中調(diào)用。 XLATEOBJ_iXlate 從一個(gè)源顏色索引轉(zhuǎn)換到目的顏色索引 XLATEOBJ_piVector 從一個(gè)索引的源調(diào)色板中檢索轉(zhuǎn)換向量。驅(qū)動(dòng)程序 能使用這個(gè)向量完成其自身從源索引到目的索引的 轉(zhuǎn)換。 XLATEOBJ_cGetPalette 在一個(gè)索引的源調(diào)色板中檢索 24 位 RGB 顏色或顏色 的位域格式驅(qū)動(dòng)程序能使用這個(gè)函數(shù)從調(diào)色板獲得 信

49、息執(zhí)行顏色混合。 這些函數(shù)更詳細(xì)的內(nèi)容,請(qǐng)參考在線 DDK。 2.3.32.3.3 路徑的路徑的 GDIGDI 服務(wù)服務(wù) 為幫助矢量設(shè)備填充復(fù)雜的區(qū)域,驅(qū)動(dòng)程序能調(diào)用創(chuàng)建、修改和計(jì)算路徑的引擎函 數(shù);這些函數(shù)在下表列出。驅(qū)動(dòng)程序通過 PATHOBJ 結(jié)構(gòu)訪問路徑。 GDI 路徑服務(wù)函數(shù)描述 EngCreatePath 為驅(qū)動(dòng)程序的臨時(shí)使用分配一個(gè)路徑。驅(qū)動(dòng)程序在 從當(dāng)前的繪圖調(diào)用返回 GDI 之前要?jiǎng)h除這個(gè)路徑。 EngDeletePath 刪除通過 EngCreatePath 函數(shù)創(chuàng)建的路徑。 PATHOBJ_vGetBounds 返回路徑的一個(gè)混合矩形。 PATHOBJ_vEnumStar

50、t 通知 PATHOBJ 驅(qū)動(dòng)程序?qū)⒄{(diào)用 PATHOBJ_bEnum 用指 定的路徑計(jì)算曲線。這個(gè)函數(shù)假設(shè)計(jì)算重新開始時(shí) 必須要調(diào)用。 PATHOBJ_bEnum 從路徑檢索下一個(gè) PATHDATA 記錄。每個(gè)記錄描述了 一個(gè)子路徑的全部或部分。 PATHOBJ_vEnumStartClipLines 允許驅(qū)動(dòng)程序請(qǐng)求相對(duì)一個(gè) PATHOBJ 要裁剪的直線。 當(dāng)裁剪區(qū)比一個(gè)矩形更復(fù)雜時(shí)是有用的。 PATHOBJ_bEnumClipLines 從路徑計(jì)算已裁剪的直線段 PATHOBJ_bMoveTo 在一個(gè)已定義的 PATHOBJ 路徑里改變現(xiàn)有的位置 PATHOBJ_bPloyLineTo 在

51、一個(gè)已定義的 PATHOBJ 路徑里繪制直線 PATHOBJ_bPloyBezierTo 在一個(gè)已定義的 PATHOBJ 路徑里繪制貝塞爾曲線 PATHOBJ_bCloseFigure 通過正繪制的一條直線回至起始點(diǎn)關(guān)閉路徑 這些函數(shù)更詳細(xì)的內(nèi)容,請(qǐng)參考在線 DDK。 14 2.3.42.3.4 GDIGDI 繪圖服務(wù)及其他繪圖服務(wù)及其他 為了支持 CLIPOBJ,BRUSHOBJ,和 XFORMOBJ 結(jié)構(gòu),GDI 提供幾種繪圖服務(wù)(在下頁 的表中列出)此外 GDI 模擬在前面 hooking 對(duì) punting 中描述。 GDI 繪圖服務(wù)函數(shù)描述 EngCreateClip 為驅(qū)動(dòng)程序的臨

52、時(shí)使用分配一個(gè) CLIPOBJ。當(dāng)不再需要它 時(shí)驅(qū)動(dòng)程序調(diào)用 EngDeleteClip 函數(shù)刪除它。 EngDeleteClip 用 EngCreateClip 函數(shù)刪除已分配的 CLIPOBJ EngBitBlt DrvBitBlt 函數(shù)的 GDI 模擬 EngCopyBits DrvCopyBits 函數(shù)的 GDI 模擬 EngStretchBlt DrvStretchBlt 函數(shù)的 GDI 模擬 EngFillPath DrvFillPath 函數(shù)的 GDI 模擬 EngStrokeAndFillPath DrvStrokeAndFillPath 函數(shù)的 GDI 模擬 EngStrok

53、ePath DrvStrokePath 函數(shù)的 GDI 模擬 EngLineTo DrvLineTot 函數(shù)的 GDI 模擬 BRUSHOBJ_pvAllocRbrush 為實(shí)現(xiàn)驅(qū)動(dòng)程序的畫刷分配存儲(chǔ)器。 BRUSHOBJ_pvGetRbrush 為實(shí)現(xiàn)驅(qū)動(dòng)程序的畫刷返回一個(gè)指針;如果還沒有實(shí)現(xiàn)畫 刷就實(shí)現(xiàn)畫刷。 CLIPOBJ_cEnumStart 在已裁剪的全部或部分區(qū)域里為矩形的計(jì)算設(shè)定參數(shù)。 (沒 有調(diào)用這個(gè)函數(shù)時(shí)能夠計(jì)算一次這個(gè)區(qū)域,但是隨后的計(jì) 算需要使用這個(gè)函數(shù)。 ) CLIPOBJ_bEnum 從裁剪區(qū)域恢復(fù)大量矩形。 CLIPOBJ_ppoGetPath 作為路徑用來恢復(fù)復(fù)雜

54、的區(qū)域。 這些函數(shù)更詳細(xì)的內(nèi)容,請(qǐng)參考在線 DDK。 2.3.52.3.5 GDIGDI 字體和文本服務(wù)字體和文本服務(wù) GDI 提供對(duì)字體管理和文本輸出的支持。FONTOBJ 結(jié)構(gòu)和相關(guān)函數(shù)允許驅(qū)動(dòng)程序訪問 一個(gè)字體的特定實(shí)例。為了支持文本輸出,驅(qū)動(dòng)程序訪問 STROBJ 結(jié)構(gòu)和相關(guān)函數(shù)。下表列 出了 FONTOBJ 和 STROBJ 相關(guān)的函數(shù)。 函數(shù)描述 EngT ExtOut GDI 模擬 DrvTextOut 函數(shù) FONTOBJ_cGetAllGlyphHandles 允許驅(qū)動(dòng)程序恢復(fù) GDI 字體的每一個(gè)字形句柄。驅(qū)動(dòng)程序 使用這個(gè)服務(wù)下載全部字體。 FONTOBJ_vGetInf

55、o 返回描述已分配字體的信息。 FONTOBJ_cGetGlyphs 為字體使用者把字形句柄翻譯成指針給已分配的字形數(shù)據(jù)。 到下一次調(diào)用 FONTOBJ_cGetGlyphs 之前這些指針均有效。 FONTOBJ_pQueryGlyphAttrs 返回有關(guān)字體字形的信息。 FONTOBJ_pxoGetXform 為相關(guān)的字體恢復(fù)從抽象到設(shè)備的轉(zhuǎn)換。這個(gè)轉(zhuǎn)換要求驅(qū) 動(dòng)程序?qū)崿F(xiàn)一個(gè)驅(qū)動(dòng)程序提供的字體。 FONTOBJ_pifi 取得一個(gè)到描述相關(guān)字體的 IFIMETRICS 結(jié)構(gòu)的指針。 FONTOBJ_pvTrueTypeFontFile 取得一個(gè)到與 TrueType 字體相關(guān)的 ROM 映射

56、 TrueType 文 件的指針。 15 STROBJ_vEnumStart 為指定的 STROBJ 結(jié)構(gòu)重新計(jì)算 GLYPHPOS 數(shù)組。驅(qū)動(dòng)程序 要在隨后的計(jì)算之前調(diào)用這個(gè)函數(shù)。 STROBJ_bEnum 在指定的 STROBJ 中計(jì)算字體輪廓一致性和位置。 STROBJ_dwGetCodePage 返回與指定的 STROBJ 相關(guān)的代碼頁。 這些函數(shù)更詳細(xì)的內(nèi)容,請(qǐng)參考在線 DDK。 2.3.62.3.6 GDIGDI 支持的服務(wù)及其他支持的服務(wù)及其他 GDI 給驅(qū)動(dòng)程序編寫者提供了多種一般的支持服務(wù),包括裝載、讀取、操作數(shù)據(jù)文件 的能力,以及分配內(nèi)核模式和用戶模式的存儲(chǔ)器。 2.42.

57、4 浮點(diǎn)數(shù)支持浮點(diǎn)數(shù)支持 內(nèi)核模式圖形驅(qū)動(dòng)程序在調(diào)用 GDI 提供的 EngSaveFloatingPointState 和 EngRestoreFloatingPointState 例程之間必須進(jìn)行所有的浮點(diǎn)操作。 如果硬件有一個(gè)浮點(diǎn)處理器,驅(qū)動(dòng)程序能夠直接做浮點(diǎn)操作。另外,驅(qū)動(dòng)程序能使 用 GDI 的 FLOATOBJ 服務(wù)來計(jì)算浮點(diǎn)操作。不考慮處理器類型,當(dāng)聲明浮點(diǎn)值時(shí),驅(qū)動(dòng)程序 要使用 FLOAT 數(shù)據(jù)類型。 2.52.5 數(shù)據(jù)類型數(shù)據(jù)類型 下表中定義的數(shù)據(jù)類型在設(shè)備驅(qū)動(dòng)程序接口里出現(xiàn)。這些數(shù)據(jù)類型中的幾個(gè)在前面 GDI 用戶對(duì)象里描述過。指針型數(shù)據(jù)類型用星號(hào)(*)標(biāo)記。 DDI 數(shù)據(jù)

58、類型變量前綴名定義 BOOLb 可以是 TRUE 或 FALSE 的 32 位值 BYTEj 8 位無符號(hào)整數(shù) BRUSHOBJ*pbo 指向畫刷對(duì)象的指針 CLIPLINEcl 裁剪線對(duì)象 CLIPOBJpco 裁剪對(duì)象的指針 DHPDEVdhpdev 由設(shè)備驅(qū)動(dòng)程序定義的 32 位句柄。它識(shí)別一個(gè)物理設(shè)備。 DHSURFdhsurf 由設(shè)備驅(qū)動(dòng)程序定義的 32 位句柄。它識(shí)別一個(gè)設(shè)備管理 表面。 FIXfix 定點(diǎn)數(shù) FLOATLe 浮點(diǎn)數(shù) FLOAT-LONGel 32 位溢出值,依據(jù)上下文解釋成 LONG 或 FLOAT FLONGfl 32 位標(biāo)志的設(shè)定 FONTOBJ*pfo 字體

59、對(duì)象的指針 FSHORTfs 16 位標(biāo)志的設(shè)定 HBMhbm 由 GDI 定義能識(shí)別位圖的 32 位句柄 HPALhpal 由 GDI 定義能識(shí)別調(diào)色板的 32 位句柄 HSURFhsurf 由 GDI 定義能識(shí)別表面的 32 位句柄 16 LONGl 32 位有符號(hào)整數(shù) MIXmix 32 位數(shù)量,它的低 16 位定義前景和背景的混合模式 PALOBJ*ppalo 調(diào)色板對(duì)象指針 PATHOBJ*ppo 路徑對(duì)象指針 POINTEpte 由FLOAT x,y;組成的小數(shù)點(diǎn)結(jié)構(gòu) POINTFXptfx 由FIX x,y;組成的小數(shù)點(diǎn)結(jié)構(gòu) POINTLptl 由LONG x,y;組成的小數(shù)點(diǎn)結(jié)構(gòu) PWSZpwsz 以 0 結(jié)束的 Unicode 字符串的指針 PVOIDpv 沒有定義數(shù)據(jù)類型的 VOID 指針 RECTLrcl 由LONG xLeft,yTop,xRight,yBottom;組成的矩形結(jié)構(gòu) RECTFXrcfx 由FIX xLeft,yTop,xRight,yBottom;組成的矩形結(jié)構(gòu) ROP4rop4 指定如何混合源、目標(biāo)、圖形以及屏蔽像素的 32 位值 SHORTs 16 位有符號(hào)整數(shù) SIZELsizl 由ULONG Cx,Cy;組成的二維結(jié)構(gòu) STROBJ*pstro 文本字符串對(duì)象指針 SURFOBJ*p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論