DirectWrite のレンダリング
レンダリング オプション
Direct2Dでは、IDWriteTextFormat オブジェクトでのみ記述された書式を持つテキストをレンダリングできますが、IDWriteTextLayout オブジェクトをレンダリングするためのオプションがいくつかあります。
IDWriteTextLayout オブジェクトによって記述される文字列は、次のメソッドを使用してレンダリングできます。
1. Direct2D を使用したレンダリング
Direct2D を使用して IDWriteTextLayout オブジェクトをレンダリングするには、次のコードに示すように、ID2D1RenderTarget::D rawTextLayout メソッドを使用します。
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Direct2D を使用して IDWriteTextLayout オブジェクトを描画する方法の詳細については、「DirectWriteの概要」を参照してください。
2. カスタム テキスト レンダラーを使用してレンダリングします。
独自のレンダラーを使用してレンダリングするには、IDWriteTextLayout::Draw メソッドを使用し、IDWriteTextRenderer から派生したコールバック インターフェイスを引数として取ります。以下のコードにその方法が示されています。
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
IDWriteTextLayout::Draw メソッドは、指定したカスタム レンダラー コールバックのメソッドを呼び出します。 DrawGlyphRun、DrawUnderline、DrawInlineObject、および 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 サーフェスに透過的にレンダリングできます。 これを行うには、次の操作を行う必要があります。
- メモリ DC をクリアして透過的にします。
- グレースケールアンチエイリアシング (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE) を使用して、メモリ HDC にテキストをレンダリングします。
- AlphaBlend 関数を使用して、最終的なターゲット HDC の上にメモリ HDC を透過的にレンダリングします。
- 必要な回数だけ繰り返し (グリフ実行ごとに 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
);
関連トピック