事前分析インフラストラクチャ
重要
Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。
詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください。
事前分析インフラストラクチャは、各ページの最初のバンド リプレイがページ全体を含むバンドになるように、Unidrv が印刷ジョブでバンディングを強制するメカニズムです。 事前分析パスはレンダリングを許可せず、オブジェクトがレンダリングされる前にページ上のオブジェクトの分析を有効にするためにのみ実行されます。
ページ全体の事前分析を許可するために、Unidrv は最初に DrvEnableSurface 関数内のフル ページ デバイス サーフェイスを指定し、次に最初のバンドが DrvQueryPerBandInfo を使用してページ全体のサイズであることを示します。 事前分析が完了すると、Unidrv は DrvQueryPerBandInfo を使用して、事前分析が有効になる前にクリッピング領域をそのサイズに戻します。その後、Unidrv はそのサーフェスにレンダリングされます。 GDI の実装の制限により、事前分析は、N アップ モードが 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 の最初の呼び出しは受け取りません。 プラグインは、OEM オブジェクト レベルの事前分析 (*PreAnalysisOptions: 8) を有効にする GPD でフラグを設定した場合にのみ、最初の DrvNextBand 呼び出しを受け取ります。 この場合、プラグインは DrvStartBanding と DrvNextBand をフックする必要があり、プラグインは DrvStartBanding 関数の pptl パラメーターをチェックする必要があります。 pptl パラメーターが NULL 以外の場合、事前分析は無効になります。 pptl パラメーターが NULL の場合は、事前分析パスの開始を示します。 この場合、プラグインは、プラグインがフックした描画 DDI へのすべての呼び出しが、事前分析パスからの結果であると想定する必要があります。 事前分析パスは DrvNextBand 関数の最初の呼び出しで終わり、レンダリングパスは DrvNextBand 関数の最初の呼び出しの後に開始されます。 この関数の後続の呼び出しには、レンダリング データが含まれます。
*PreAnalysisOptions モード
事前分析モードは、*PreAnalysisOptions: n 属性名と属性パラメーターによって GPD ファイルで制御されます。 次の表に、*PreAnalysisOptions 属性名と共に使用できるパラメーター値を 示します。 これらの値の 2 つ以上を組み合わせて、複数のオプションを有効にすることができます。
パラメーター意味値 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 オーダーの問題を処理します。 Z オーダーの問題は、多くの場合、複雑なクリップを含むグラフィック オブジェクトによって発生するため、Unidrv は、以前にダウンロードしたテキストをクリアする白い四角形をダウンロードできません。
Unidrv は、レンダリング パスを実行する前に、各ページで事前分析パスを実行します。 Unidrv は、シミュレートできない複雑なクリップを使用するビット ブロック転送 (blt) オブジェクトでテキストがオーバーレイされるかどうかを判断するためにこれを行います。 したがって、テキストは、後でレンダリングされたオブジェクトがテキストと正しく対話できるように、直接ダウンロードされるのではなく、サーフェス ビットマップにレンダリングされます。
さらに、白い四角形をサポートしていないデバイスでは、複雑なクリップが含まれていない場合でも、blts によってオーバーレイされたテキストに対して Unidrv はチェックします。 Unidrv は、テキストをプリンターに直接ダウンロードする代わりに、テキストをサーフェイスにレンダリングします。
次の描画コマンドは、後続の blts によってオーバーレイされる可能性があるテキストに対してテストされます。
したがって、このモードでは、テキストオブジェクトと塗りつぶし領域オブジェクト間のすべての z オーダーの問題を修正する必要があります。 テキストとオーバーレイ行に問題が発生する可能性があることに注意してください。 このようなソリューションでは、描画されるのではなく、ほぼすべてのテキストがダウンロードされる可能性があるため、このような状況は含まれません。
この機能では、デバイス フォントの使用に関連する z オーダーの問題は修正されません。 アプリケーションまたはドライバーでデバイス フォント モードが選択されている場合、ドライバーはこの問題を修正できず、デバイス フォントをサーフェスにレンダリングできません。
2 番目の操作により、Unidrv はページ上の空白領域を最適化できます。 このモードでは、Unidrv は空の上下の余白と、ページの中央にある大きな空白領域をスキップします。 このモードは、カラー印刷で使用することを目的としており、ページのレンダリングに必要なバンド パスの数を最小限に抑えることでパフォーマンスを向上させます。
事前分析パス中に、Unidrv はページ上で描画が行われる場所を決定します。 事前分析が有効になっている場合、またはプリンターが高解像度 (600 dpi 以上) で 24 の BPP レンダリング バンドを使用している場合は常に、空白バンドの最適化が有効になります。これにより、インクジェット プリンターの 24 BPP レンダリングでパフォーマンスが大幅に向上し、既存の OEM プラグインを変更する必要はありません。
ブラック バンドの最適化
*PreAnalysisOptions: 2 *% 1 bpp ImageProcessing bitmaps
*PreAnalysisOptions パラメーターを 2 に設定すると、Unidrv では、ページ全体を 24 BPP でレンダリングするのではなく、大きな 1 BPP バンディング サーフェスを使用して、黒いソリッド オブジェクトのみを含む領域をレンダリングできます。 このモードは空白バンドの最適化に似ていますが、ページ上の単色の黒い領域 (色領域ではなく) も決定するという点が異なります。 24 BPP カラー用に設定されたハーフトーンが 1 BPP モノクロでは正しくレンダリングされないため、1 BPP バンディング サーフェスにレンダリングできるのは、黒 (灰色の網掛けなし) のオブジェクトだけです。
Unidrv は、DrvEnableSurface 関数内に 2 つのサーフェスを作成します。1 つはカラー用、もう 1 つは 1 BPP モノクロ用です。 Unidrv では各メモリに同じメモリが使用されるため、追加のメモリは必要ありません。 ページの事前分析によって、ページに黒の塗りつぶし領域と空白領域のどちらを含めるかが決まります。この領域では、色を含む領域よりも大きなバンドを使用できます。 色領域のみが、より小さいカラー バンド サーフェスを使用する必要があります。
同じ量のメモリを使用すると、1 BPP モノクロサーフェスは、24 BPPカラーサーフェスの 24 倍の大きさにすることができます。 したがって、ページの中央にのみ色を含む画像は、上部領域、色を含む領域、および下部領域の 3 つの領域に分割できます。 これらの 3 つの領域は、次のように縞模様にすることができます。トップ領域は単一のモノクロ バンドに配置でき、色を含む領域は、それをカバーするために必要な数のカラー バンドに分割でき、下部の領域は単一のモノクロ バンドに配置できます。
この機能を使用するには、OEM が IPrintOemUni ImageProcessing コールバックをサポートし、ラスター データのダンプを処理する必要があります。 IPrintOemUni ImageProcessing コールバックの現在の OEM プラグイン サポートは、24 BPP バンドまたは 1 BPP ソリッド ブラック バンドを受け入れるように拡張する必要があります。
デバイス StretchBlt 操作のサポート
*PreAnalysisOptions: 4
*PreAnalysisOptions パラメーターを 4 に設定すると、Unidrv は Stretchblt 操作をサポートするデバイスに直接 DrvStretchBlt 呼び出しをダウンロードできます。
Unidrv で 24 個の BPP カラー データが生成されると、すべての stretchblt イメージがデバイスの解像度に拡大され、大量のラスター データがダウンロードされる必要があります。 これにより、多くの東アジアのプリンターのメモリ不足状態に加えて、パフォーマンスが低下する可能性があります。
ミニドライバー レンダリング プラグインは、OEMStretchBlt をフックし、独自のイメージ ダウンロード コマンドを提供する必要があるため、ストレッチ ブレット モードを利用するために必要です。 Unidrv では、直接ダウンロードできる呼び出しでのみ OEMStretchBlt フックを使用できます。 そのため、プラグインは z オーダーの問題を処理する責任を負いません。 プラグインは、受信した OEMStretchBlt 呼び出しに含まれるソース イメージ データを直接ダウンロードするだけで済みます。 プラグインには、イメージがプラグインでサポートされていないか、ダウンロードできない形式の場合に、イメージを Unidrv に送り返すオプションもあります。
他のデータがシステムにレンダリングされている間にオブジェクトがデバイスに直接ダウンロードされるたびに、z オーダーの問題やハーフトーンの不整合が発生する可能性があります。 このモードでは、事前分析を使用して、直接ダウンロードできる stretchblts を決定します。 直接ダウンロードする場合は、マスクまたは複雑なクリッピングを含まない stretchblts のみが考慮されます。 後のオブジェクトが直接ダウンロード対象と見なされている stretchblts のいずれかをオーバーレイする場合、オブジェクトは直接ダウンロードされません。 この原則により、パフォーマンスが向上し、システムとデバイスの両方のハーフトーンが含まれないようにする必要があります。これにより、印刷出力が低品質になります。
OEM オブジェクト レベルの事前分析フック
*PreAnalysisOptions: 8
*PreAnalysisOptions パラメーターを 8 に設定すると、OEM は、ページ全体のすべてのオブジェクトがバンド サイズに関係なく DrvStartBanding 呼び出しの後に再生されるように、事前解析パスを開始できます。 事前分析パス中に Unidrv 内で描画を行うことができませんが、OEM はすべての DrvXxx 描画呼び出しをフックしてページ上のオブジェクトを分析できます。
このモードの機能は、OEM がオブジェクト ベースの色補正またはレンダリングを使用できるように、カラー インクジェット プリンターに重点を置きます。 たとえば、黒いオブジェクトが色のオブジェクトと交差する場合は、黒いオブジェクトが単独で表示されるのではなく、異なる方法で処理する必要があるプリンターがあります。 他の OEM は、bitblt オブジェクトとは異なる stretchblt オブジェクトのハーフトーンを必要とする場合があります。 Stretchblt オブジェクトは、.png や .jpg など、Windows がサポートする任意のグラフィックス ファイル形式にすることができます。 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 ではありません。 この呼び出しは、Unidrv に適切な pptl 値を返すためにのみ使用されます。 プラグインは、pptl 値自体を設定することも、Unidrv にコールバックすることもできます (この記事の冒頭にある前述の擬似コードの例のように)。 OEMNextBand の最初の呼び出しで指定された OEMNextBand の pso パラメーターがまだレンダリングされていないバンディング サーフェイスであるため、プラグインは、その内容をデバイスに送信しないでください。