DirectWriteのレンダリング

レンダリング オプション

IdWriteTextFormat オブジェクトでのみ記述された書式を持つテキストは Direct2D でレンダリングできますが、IDWriteTextLayout オブジェクトをレンダリングするためのオプションがいくつかあります。

IDWriteTextLayout オブジェクトによって記述される文字列は、次のメソッドを使用してレンダリングできます。

1. Direct2D を使用したレンダリング

Direct2D を使用して IDWriteTextLayout オブジェクトをレンダリングするには、次のコードに示すように ID2D1RenderTarget::D rawTextLayout メソッドを使用します。

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

Direct2D を使用して IDWriteTextLayout オブジェクトを描画する方法の詳細については、「DirectWriteを使用したはじめに」を参照してください。

2. カスタム テキスト レンダラーを使用してレンダリングします。

次のコードに示すように、 IDWriteTextLayout::D raw メソッドを使用してカスタム レンダラーを使用してレンダリングします。このメソッドは、 IDWriteTextRenderer から派生したコールバック インターフェイスを引数として受け取ります。

// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
        NULL,
        pTextRenderer_,  // Custom text renderer.
        origin.x,
        origin.y
        );

IDWriteTextLayout::D raw メソッドは、指定したカスタム レンダラー コールバックのメソッドを呼び出します。 DrawGlyphRunDrawUnderlineDrawInlineObjectおよび DrawStrikethrough メソッドは、描画関数を実行します。

IDWriteTextRenderer は 、グリフ実行、下線、取り消し線、インライン オブジェクトを描画するためのメソッドを宣言します。 これらのメソッドを実装するのは、アプリケーション次第です。 カスタム テキスト レンダラーを作成すると、カスタム塗りつぶしやアウトラインなどのテキストをレンダリングするときに、アプリケーションで追加の効果を適用できます。 カスタム テキスト レンダラーのサンプルは、DirectWrite Hello World サンプルに含まれています。

3. ClearType を GDI サーフェスにレンダリングします。

GDI サーフェスへのレンダリングは、実際にはカスタム テキスト レンダラーを使用する例です。 ただし、一部の作業は IDWriteBitmapRenderTarget インターフェイスの形式で行われます。

このインターフェイスを作成するには、 IDWriteGdiInterop::CreateBitmapRenderTarget メソッドを 使用します。

カスタム テキスト レンダラーの DrawGlyphRun メソッドは 、IDWriteBitmapRenderTarget::D rawGlyphRun メソッドを呼び出してグリフを描画します。 下線、取り消し線、インライン オブジェクトのレンダリングは、カスタム レンダラーで行う必要があります。

IDWriteBitmapRenderTarget インターフェイスは、メモリ内のデバイス コンテキスト (DC) にレンダリングされます。 この DC へのハンドルを取得するには、 IDWriteBitmapRenderTarget::GetMemoryDC メソッドを使用します。

memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();

描画が実行されたら、 IDWriteBitmapRenderTarget オブジェクトのメモリ DC をコピー先の GDI サーフェスにコピーする必要があります。

注意

また、GDI+ サーフェスなどの別の種類のサーフェスにビットマップを転送することもできます。

 

// Transfer from DWrite's rendering target to the window.
BitBlt(
    hdc,
    0, 0,
    size.cx, size.cy,
    memoryHdc,
    0, 0, 
    SRCCOPY | NOMIRRORBITMAP
    );

注意

アプリには、最終的にウィンドウにすべてをレンダリングする責任があります。 これには、テキストとグラフィックスが含まれます。 これにはパフォーマンスの低下があります。 さらに、メモリ DC へのレンダリングは GDI ハードウェア アクセラレータではありません。

 

GDI との相互運用の詳細な概要については、「GDI との相互運用」を参照してください。

4. グレースケール テキストを GDI サーフェスに透過的にレンダリングします。 (Windows 8 以降)

Windows 8以降、パフォーマンスを向上させるために、グレースケール テキストを GDI サーフェスに透過的にレンダリングできます。 これを行うには、次の操作を行う必要があります。

  1. メモリ DC をクリアして透明にします。
  2. グレースケールアンチエイリアシング (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) を使用して、メモリ HDC にテキストをレンダリングします。
  3. AlphaBlend 関数を使用して、最終的なターゲット HDC の上にメモリ HDC を透過的にレンダリングします。
  4. 必要な回数だけ繰り返し (グリフ実行ごとに 1 回)、他のグラフィックスの間で AlphaBlend 関数で上書きされることなく、最終的なターゲット HDC に直接レンダリングできます。
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);

pRT_->DrawTextLayout(
    origin,
    pTextLayout_,
    pBlackBrush_
    );

BLENDFUNCTION blendFunction = { 0 };  
blendFunction.BlendOp = AC_SRC_OVER;  
blendFunction.SourceConstantAlpha = 255;  
blendFunction.AlphaFormat = AC_SRC_ALPHA;

AlphaBlend(  
        hdc,  
        0, 0,  
        width, height,  
        pRT_->GetMemoryDC(),  
        0, 0,  
        width, height,  
        blendFunction  
        );

Direct2D を使用したレンダリング

カスタム テキスト レンダラーを使用したレンダリング

GDI サーフェスにレンダリングする

GDI との相互運用