預先分析基礎結構
重要
新式列印平臺是 Windows 與印表機通訊的慣用方法。 我們建議您使用Microsoft的 IPP 收件匣類別驅動程式,以及列印支援應用程式 (PSA),自定義 Windows 10 和 11 中的列印體驗,以進行印表機裝置開發。
如需詳細資訊,請參閱 新式列印平臺 和 列印支援應用程式設計指南。
預先分析基礎結構是一種機制,Unidrv 會強制在列印作業上進行帶狀處理,讓每個頁面的第一個樂隊重新執行是包含整個頁面的頻帶。 預先分析階段不允許任何轉譯,而且只會在轉譯物件之前啟用頁面上物件的分析。
為了允許全頁預先分析,Unidrv 會先指定DrvEnableSurface函式內的全頁面裝置表面,然後透過DrvQueryPerBandInfo指出第一個頻帶是整個頁面的大小。 在預先分析完成之後,Unidrv 會使用 DrvQueryPerBandInfo 將裁剪區域還原回其大小,再啟用預先分析;Unidrv 隨後會轉譯至該表面。 由於 GDI 的實作限制,只有在 N-up 模式ONE_UP,或轉譯帶是整個頁面時,才能啟用預先分析。
下列虛擬程式代碼說明用於預先分析的邏輯。
DrvEnableSurface
if( preanalysis enabled )
Use dummy device surface
DrvStartDoc
For each physical page
{
DrvStartPage
DrvStartBanding
For each banding surface
{
DrvQueryPerBandInfo
// Set sizlBand member of PERBANDINFO
if( preanalysis_pass )
pbi.sizlBand = {whole page}
else
pbi.sizlBand = {normal band}
Carry out rendering operations
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass ) {
Call OEM hooks
DrvNextBand
}
if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass )
Call OEMNextBand
if( preanalysis pass ) {
Disable preanalysis
Switch from dummy device surface to real device surface
}
if( last band )
Write end page character from GPD
} // for each banding surface
} // for each physical page
DrvEndDoc
因為預先分析功能必須使用目前的一般印表機描述 (GPD) 檔案和外掛程式,因此從迷你驅動程序的觀點來看,文字 z 順序、空白帶偵測和其他作業是無形地實作。 迷你驅動程式可以連結DrvStartBanding和DrvNextBand,但不會收到DrvNextBand的第一次呼叫,因為第一次呼叫DrvNextBand不包含任何轉譯。 外掛程式只有在 GPD 中設定旗標來啟用 OEM 物件層級預先分析(*PreAnalysisOptions:8)時,才會接收第一個 DrvNextBand 呼叫。 在此情況下,外掛程式必須連結DrvStartBanding和DrvNextBand,而外掛程式必須檢查DrvStartBanding函式的pptl參數。 如果 pptl 參數不是 NULL,則會停用預先分析。 如果 pptl 參數為 NULL,表示前置分析階段的開頭。 在此情況下,外掛程式應該假設所有繪製 DIS 的呼叫,即外掛程式已從預先分析階段攔截的結果。 預先分析階段的結尾是DrvNextBand函式的第一次呼叫,轉譯會在第一次呼叫DrvNextBand函式之後開始。 此函式的後續呼叫將包含轉譯數據。
*PreAnalysisOptions 模式
預先分析模式是由 *PreAnalysisOptions:n 屬性名稱和屬性參數控制在 GPD 檔案中。 下表列出可與 *PreAnalysisOptions 屬性名稱搭配使用的參數值。 您可以結合其中兩個或多個值來啟用多個選項。
參數意義值 0
停用所有預先分析模式。
1
預設模式。 啟用單色 z 順序文字分析和空白帶優化。 此模式會針對具有可下載字型或裝置字型支援和高解析度 (600 dpi 或更高)、24 BPP 轉譯模式的裝置啟用。
2
針對 24 BPP IPrintOemUni ImageProcessing 回呼啟用 1 BPP 優化。
4
啟用裝置 StretchBlt 作業。
8
啟用 OEM 物件層級預先分析。
單色 Z 順序文字分析與空白帶優化
*PreAnalysisOptions: 1
將 *PreAnalysisOptions 參數設定為 1 可讓 Unidrv 執行下列作業:
偵測單色印表機中文字和圖形對象之間的迭置順序問題。
執行空白頻帶優化。
第一個作業會處理當下載到單色印表機的文字稍後會覆寫或與圖形物件互動時所發生的 Z 順序問題。 Z 順序問題通常是由包含複雜剪輯的圖形物件所造成,因此 Unidrv 無法下載清除先前下載的文字的白色矩形。
Unidrv 會在執行轉譯階段之前,在每個頁面上執行預先分析傳遞。 Unidrv 會執行此動作,以判斷是否有任何文字會覆寫使用無法仿真的複雜剪輯的位區塊傳輸 (blt) 物件。 因此,文字會轉譯到表面位圖,而不是直接下載,以便稍後轉譯的物件會正確地與文字互動。
此外,對於不支援白色矩形的裝置,Unidrv 會檢查布茨所覆蓋的任何文字,即使它們不包含複雜的剪輯也一樣。 Unidrv 會將文字轉譯到表面,而不是將文字直接下載到印表機。
下列繪圖命令會針對後續的blts可能覆寫的文字進行測試:
因此,此模式應該更正文字與填滿區域對象之間的所有迭置順序問題。 請注意,文字和覆寫的行仍有問題。 這些情況並未包含,因為這類解決方案可能會導致幾乎下載所有文字,而不是被繪製。
這項功能不會更正與使用裝置字型相關聯的迭置順序問題。 如果應用程式或驅動程式已選取裝置字型模式,則驅動程式無法修正此問題,且無法將裝置字型轉譯到表面。
第二個作業可讓 Unidrv 針對頁面上的空白區域進行優化。 在此模式中,Unidrv 會略過空白的上邊界和下邊界,以及頁面中間的任何大型空白區域。 此模式是用於彩色列印,可藉由將轉譯頁面所需的帶段傳遞數目降至最低,以改善效能。
在預先分析階段期間,Unidrv 會決定頁面上的繪圖發生位置。 每當啟用預分析時,或列印機使用 24 BPP 轉譯帶的高解析度 (600 dpi 或更高) 時,就會啟用空白帶優化。這應該會導致 24 BPP 轉譯的筆跡噴氣式印表機的明顯效能提升,而且不需要變更現有的 OEM 外掛程式。
黑帶優化
*PreAnalysisOptions: 2 *% 1 bpp ImageProcessing bitmaps
將 *PreAnalysisOptions 參數設定為 2 可讓 Unidrv 使用較大的 1 BPP 帶狀表面來轉譯只包含實心黑色對象的區域,而不是在 24 BPP 轉譯整個頁面。 此模式類似於空白帶優化,但例外狀況是它也會決定頁面上的純黑色區域(而不是色彩區域)。 只有純黑色(無灰色陰影)的物件可以在 1 BPP 帶狀表面轉譯,因為為 24 BPP 色彩設定的半色調無法在 1 BPP 單色中正確轉譯。
Unidrv 會在 DrvEnableSurface 函式中建立兩個表面:一個用於色彩,另一個用於1 BPP 單色。 Unidrv 會針對每個使用相同的記憶體,因此不需要額外的記憶體。 頁面預先分析會決定頁面是否包含純黑色或空白區域,其中較大的頻帶可以用於包含色彩的區域。 只有色彩區域需要使用較小的色帶表面。
使用相同數量的記憶體,1 BPP 單色表面可以高達 24 BPP 色彩表面的 24 倍。 因此,只包含頁面中間色彩的影像可以分成三個區域:頂端區域、包含色彩的區域,以及底部區域。 這三個區域可以有如下的帶狀範圍:頂端區域可以放在單一單色帶中,包含色彩的區域可以分割成所需數量的色彩帶,而底部區域可以放置在單一單色帶中。
此功能需要 OEM 支援 IPrintOemUni ImageProcessing 回呼,以及處理點陣數據的傾印。 IPrintOemUni ImageProcessing 回呼的目前 OEM 外掛程式支持必須增強,才能接受 24 個 BPP 波段或 1 個 BPP 實心黑帶。
支援裝置 StretchBlt 作業
*PreAnalysisOptions: 4
將 *PreAnalysisOptions 參數設定為 4 可讓 Unidrv 直接下載 DrvStretchBlt 呼叫以支援 stretchblt 作業的裝置。
當 Unidrv 產生 24 個 BPP 色彩數據時,所有延展影像都會延展到裝置的解析度,這會導致必須下載大量的點陣數據。 除了許多東亞印表機的記憶體不足狀況外,這可能會導致效能變慢。
迷你驅動程序轉譯外掛程式必須利用 stretchblt 模式,因為它必須攔截 OEMStretchBlt 並提供自己的映像下載命令。 Unidrv 只允許 OEMStretchBlt 攔截在可以直接下載的呼叫上。 因此,外掛程式不負責處理 z 順序問題。 外掛程式只需要直接下載其收到的 OEMStretchBlt 呼叫中包含的來源映像數據。 如果映像的格式為外掛程式不支援或無法下載,外掛程式也可以選擇將影像標定回 Unidrv。
每當在系統上轉譯其他數據時,直接下載對象到裝置時,可能會發生迭置順序問題或半色調不一致。 此模式會使用預先分析來判斷可以直接下載哪些延展。 只有不包含遮罩或複雜裁剪的延展式會被視為直接下載。 如果稍後的物件重迭任何被視為直接下載的延展式,則不會直接下載任何物件。 此原則應改善效能,並應確保系統與裝置中沒有任何影像包含半色調,這會導致品質不佳的列印輸出。
OEM 物件層級預先分析勾點
*PreAnalysisOptions: 8
將 *PreAnalysisOptions 參數設定為 8 可讓 OEM 起始預先分析傳遞,讓整個頁面上的所有物件在 DrvStartBanding 呼叫之後播放,而不考慮頻帶大小。 在預先分析階段期間,Unidrv 中不允許任何繪圖,但 OEM 可以攔截所有 DrvXxx 繪圖呼叫來分析頁面上的物件。
此模式中的功能著重於彩色筆跡噴氣式印表機,讓OEM可以使用以對象為基礎的色彩校正或轉譯。 例如,某些印表機在與色彩物件交集時需要以不同的方式處理黑色物件,而不是本身出現的黑色物件。 其他 OEM 可能想要針對與 bitblt 物件不同的 Stretchblt 物件使用半色調。 Stretchblt 物件可以是 Windows 支援的任何圖形檔格式,例如.png或.jpg。 Bitblt 對象是獨佔位圖。
在 GPD 中啟用此模式時,Unidrv 會將表面定義為帶狀表面,但會導致第一個播放是整個頁面。 若要這樣做,Unidrv 會將 GDI 剪輯視窗設定為整個頁面。 Unidrv 允許連結所有繪圖命令,但在執行任何繪圖之前傳回 。 在後續的傳遞中,Unidrv 會像往常一樣將剪輯視窗重設為一般樂隊大小和帶狀。
OEM 必須在 GPD 中啟用此模式時連結 DrvStartBanding 和 DrvNextBand 。 他們必須測試 DrvStartBanding 函式的 pptl 參數,以判斷 Unidrv 是否可以在指定的頁面上在此模式中啟用預先分析。 如果 pptl 參數為 NULL,則 Unidrv 已啟用預先分析。 Unidrv 會使用 pptl 參數,因為它目前沒有意義(尚未使用帶狀線位置更新。 對於預先分析,帶狀位置一律設定為 (0, 0))。 如果 pptl 參數為 NULL,則 OEM 應該先考慮第一個 DrvNextBand 之前的所有繪圖呼叫,以做為預先分析的一部分,而且不應該允許繪製到表面。
預先分析的結尾是由對 OEMNextBand 函式的呼叫發出訊號。 傳遞給 OEMNextBand 的 pptl 參數不是 NULL。 此呼叫僅用於將適當的 pptl 值傳回 Unidrv。 外掛程式可以自行設定 pptl 值,也可以回呼 Unidrv(如本文開頭的上述虛擬程式碼範例)。 由於 OEMNextBand 第一次呼叫中指定之 OEMNextBand 的 pso 參數尚未轉譯的帶狀表面,所以外掛程式不應該將其內容傳送至裝置。