XPS ラスター化サービスの使用

重要

Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。

詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください。

XPS ラスター化サービスは、XPS ドキュメントの固定ページをビットマップに変換する XPS ラスタライザー オブジェクトを実装します。 このサービスにより、XPS ドキュメントを一連のビットマップ イメージとしてレンダリングする XPSDrv フィルターの設計が簡略化されます。 このフィルターでは、XPS ラスタライザー オブジェクトに対して、固定ページ内の軸平行長方形領域のビットマップ イメージを作成するように指示できます。

たとえば、プリンターの XPSDrv フィルターでは、固定ページを一連の水平方向または垂直方向のバンドとしてプリンターに送信する必要があります。 この場合、フィルターは XPS ラスタライザー オブジェクトに対して、各バンドを個別のビットマップとしてラスタライズするように指示します。 または、プリンターに十分なメモリがある場合は、ページ全体のビットマップ イメージを作成するようにフィルターがラスタライザーに指示する場合があります。

XPS ラスター化サービスは、システム ファイル Xpsrasterservice.dll に実装されます。 ただし、XPSDrv フィルターは、この DLL のエントリ ポイントに直接アクセスしません。 代わりに、フィルターは、印刷フィルター パイプライン マネージャーから受け取る 印刷パイプライン プロパティ バッグ を介して XPS ラスター化サービスのインターフェイスにアクセスします。

XPSDrv フィルターで使用できるようにするには、印刷フィルター パイプラインのフィルターを記述する フィルター パイプライン構成ファイル で XPS ラスター化サービスを指定する必要があります。 具体的には、次の XML 例に示すように、構成ファイルに、サービス DLL 名に dll 属性が設定された FilterServiceProvider 要素が含まれている必要があります。

<FilterServiceProvider dll = "XpsRasterService.dll" />

FilterServiceProvider 要素は、パイプライン内のフィルターを一覧表示する Filters 要素の子です。 パイプラインの初期化中、印刷フィルター パイプライン マネージャーは XPS ラスター化サービスを読み込み、プロパティ バッグを介してフィルターがサービスにアクセスできるようにします。 XPS ラスター化サービスをロードするフィルター パイプライン構成ファイルの例については、WDK の XpsRasFilter サンプルを参照してください。 このサンプルは、WDK インストールの Src\Print\Xpsrasfilter フォルダーにあります。

XPS ラスター化ファクトリの取得

XPS ドキュメントをラスター化する前に、XPSDrv フィルターは、印刷パイプライン プロパティ バッグからラスター化ファクトリ オブジェクトへの参照を取得する必要があります。 その後、フィルターは、レンダリングする必要がある固定ページごとに、ファクトリから新しい XPS ラスタライザー オブジェクトを取得します。

XPSDrv フィルターを初期化するために、印刷フィルター パイプライン マネージャーはフィルターの IPrintPipelineFilter::InitializeFilter メソッドを呼び出し、プロパティ バッグの IPrintPipelinePropertyBag インターフェイスを入力パラメーターとしてメソッドに渡します。

XPS ラスター化ファクトリ オブジェクトへのポインターを取得するために、XPSDrv フィルターは IPrintPipelinePropertyBag::GetProperty メソッドを呼び出します。 プロパティ名 "MS_IXpsRasterizationFactory" は、ラスター化ファクトリ オブジェクトを識別します。 このプロパティの場合、GetProperty から取得した値は、ラスター化ファクトリ オブジェクトの IUnknown インターフェイスへの参照です。 このインターフェイスを取得した後、フィルターは IUnknown::QueryInterface メソッドを呼び出し、オブジェクトの IXpsRasterizationFactory インターフェイスへの参照を取得する必要があります。 その後、フィルターは IXpsRasterizationFactory::CreateRasterizer メソッドを呼び出して XPS ラスタライザー オブジェクトを作成できます。

ファクトリ オブジェクトが不要になったら、フィルターはオブジェクトの IXpsRasterizationFactory インターフェイスの Release メソッドを呼び出してオブジェクトを解放する必要があります。

次のコード例は、IPrintPipelinePropertyBag インターフェイス インスタンスから IXpsRasterizationFactory インターフェイス インスタンスを取得する方法を示しています。

//
// Retrieve a reference to the XPS rasterization factory
// from the print pipeline property bag.
//
HRESULT CreateRasterizationFactory(
 IPrintPipelinePropertyBag *pPropertyBag,
 IXpsRasterizationFactory **ppXPSRasFactory)
{
    if (ppXPSRasFactory != NULL)
    {
        *ppXPSRasFactory = NULL;
    }

    if (pPropertyBag == NULL || ppXPSRasFactory == NULL)
    {
        return E_POINTER;
    }

    HRESULT hr;
    VARIANT var;
 IXpsRasterizationFactory *pXPSRasFactory;

    //
    // Retrieve the factory object from the property bag.
    //
 VariantInit(&var);
    hr = pPropertyBag->GetProperty(L"MS_IXpsRasterizationFactory",
                                   &var);
    if (SUCCEEDED(hr))
    {
        assert(var.vt == VT_UNKNOWN && var.punkVal != NULL);

        //
        // Get the factory object's IXpsRasterizationFactory interface.
        //
 IUnknown *pUnknown = var.punkVal;

        hr = pUnknown->QueryInterface(__uuidof(IXpsRasterizationFactory),
 reinterpret_cast<void**>(&pXPSRasFactory));
    }

    if (SUCCEEDED(hr))
    {
        //
        // Give the caller our reference to the IXpsRasterizationFactory interface.
        //
        *ppXPSRasFactory = pXPSRasFactory;
    }

 VariantClear(&var);
    return hr;
}

固定ページの XPS オブジェクト モデルの作成

XPS ラスター化ファクトリを作成した後、XPSDrv フィルターはファクトリを使用して XPS ラスタライザー オブジェクトを作成できます。 XPS ラスタライザー オブジェクトには IXpsRasterizer インターフェイスがあります。 各 XPS ラスタライザー オブジェクトは、XPS ドキュメントの特定の固定ページ専用です。 XPS ラスタライザー オブジェクトを作成するため、ファクトリには固定ページの XPS オブジェクト モデル (OM) が必要です。 (固定ページの) XPS OM は IXpsOMPage インターフェイスを持つオブジェクトに含まれています。 XPS ラスタライザー オブジェクトは、このインターフェイスを使用して固定ページの内容にアクセスします。 IKsControl インターフェイスの詳細については、Windows SDK のドキュメントを参照してください。

XPSDrv フィルターは、次の手順に従って XPS ラスタライザー オブジェクトを作成します。

  • このフィルターは IFixedPage インターフェイスを持つ固定ページ オブジェクトを入力ストリームから読み取ります。

  • フィルターは、固定ページの内容を保持する IXpsOMPage インターフェイスを持つ XPS OM オブジェクトを作成します。 XPS ラスタライザーは、後でこのインターフェイスを使用して固定ページの内容にアクセスします。

  • XPS ラスタライザー オブジェクトを作成するために、フィルターは XPS OM オブジェクトの IXpsOMPage インターフェイスを XPS ラスター化ファクトリの IXpsRasterizationFactory::CreateRasterizer メソッドに渡します。

XPS ラスタライザー オブジェクトが不要になったら、フィルターはオブジェクトの IXpsRasterizerRelease インターフェイスの Release メソッドを呼び出してオブジェクトを解放する必要があります。 XPS ラスター化サービスを使用する XPSDrv フィルターの実装例については、WDK の XpsRasFilter サンプル ドライバーを参照してください。

XPS ラスター化サービスで使用する場合、固定ページ内のキャンバスとビジュアル ブラシを最大 64 レベルまでネストすることができます。 キャンバスとビジュアル ブラシの詳細については、XML Paper Specification をダウンロードしてください。

ビットマップ解像度とピクセル形式

固定ページの XPS ラスタライザー オブジェクトは、ページがレンダリングされる解像度を認識している必要があります。 XPSDrv フィルターは、XPS ラスタライザー オブジェクトを作成する IXpsRasterizationFactory::CreateRasterizer に対する呼び出しの入力パラメーターとして、この解像度を 1 インチあたりのドット数 (DPI) で指定します。 たとえば、ディスプレイ デバイスの解像度が 600 DPI で、固定ページに標準の文字サイズ のページが記述されている場合、ページ全体のビットマップ イメージのサイズは次のようになります。

幅 = (8.5 インチ)x(600 DPI) = 5100 ドット

高さ = (11 インチ)x(600 DPI) = 6600 ドット

固定ページの長方形領域のビットマップ イメージを作成するために、XPSDrv フィルターは XPS ラスタライザー オブジェクトの IXpsRasterizer::RasterizeRect メソッドを呼び出します。 このメソッドは、常に 32 ビットのピクセル サイズのビットマップを生成します。 ピクセル形式は、ヘッダー ファイル Wincodec.h で定義されている GUID 値 GUID_WICPixelFormat32bppPBGRA によって指定されます。 この形式には、8 ビットの赤、緑、青のコンポーネントが含まれており、標準 (sRGB) 色空間が使用されます。 さらに、この形式には 8 ビットのアルファ コンポーネントが含まれます。 各ピクセル値のカラー コンポーネントは、アルファ コンポーネントによって事前乗算されます。 この形式の詳細については、「ネイティブ ピクセル形式の概要」を参照してください 。

一部の XPSDrv フィルターは、XPS ラスタライザー オブジェクトによって生成されたビットマップの追加処理を実行する場合があります。 たとえば、カラー プリンターのフィルターは、プリンターのページ記述言語でビットマップをラップしてプリンターに送信する前に、ビットマップを CMYK ピクセル形式に変換する場合があります。

XPS ラスター化サービスが XPSDrv フィルターとの通信に使用するインターフェイスの詳細については、xpsrassvc.h ヘッダー DDI リファレンスを参照してください。

XPSRas と高精度ピクセル形式

XPSRas と GPU

WDDM 1.2 ディスプレイ ドライバーを搭載した Windows 8 を実行しているコンピューターがあり、XPSRas GPU 使用率デシジョン ツリー に示されているすべての条件が満たされている場合は、GPU ハードウェア アクセラレーションが常に使用されます。 つまり、開発者は、GPU によって提供されるパフォーマンスの強化の恩恵を受けるために手順を実行する必要はありません。 ただし、システムのグラフィックス パフォーマンスをさらに最適化するには、次の操作を検討する必要があります。

  • 一貫性のある四角形ディメンションを持つ RasterizeRect メソッドを呼び出します。 これが不可能な場合は、最初の呼び出しで必要な最大の四角形サイズを RasterizeRect に提供し、後続の呼び出しで小さい四角形サイズを要求するのが最適です。

  • アンチエイリアシングは、絶対に必要な場合にのみ使用してください。 エイリアス化されたテキストとベクターは、IXpsRasterizationFactory::CreateRasterizer メソッドに提供される DPI 値が大幅に高い場合、アンチエイリアス化された対応部分と同じように見えます。 たとえば、200DPI を超える DPI 値は高いと見なされます。 エイリアス化されたテキストとベクターを高 DPI と共に使用する場合は、特定のデバイスの出力品質が十分であることを確認するために、テストを行う必要があります。

  • IXpsOMPage をラスター化する前にドキュメントを操作できる場合は、フォントをサブセット化し、複数のページで繰り返される要素にリソース ディクショナリを使用すると、XPSRas のパフォーマンスが向上します。