IDWriteBitmapRenderTarget
COM公式ドキュメント
グリフのレンダリングに使用できる、32 ビットのデバイス非依存ビットマップとデバイスコンテキストをカプセル化します。
解説(Remarks)
IDWriteBitmapRenderTarget は、次のコードに示すように IDWriteGdiInterop::CreateBitmapRenderTarget メソッドを使用して作成します。
if (SUCCEEDED(hr))
{
hr = g_pGdiInterop->CreateBitmapRenderTarget(hdc, r.right, r.bottom, &g_pBitmapRenderTarget);
}
IDWriteGdiInterop::CreateBitmapRenderTarget は、DC のハンドルと目的の幅および高さを受け取ります。上記の例では、指定した幅と高さはウィンドウ矩形のサイズです。
レンダリング
ビットマップへのレンダリングに IDWriteBitmapRenderTarget を使用する 1 つの方法は、IDWriteTextRenderer インターフェイスから派生したカスタムレンダラーインターフェイスを実装することです。カスタムレンダラーの DrawGlyphRun メソッドの実装内で、次のコードに示すように IDWriteBitmapRenderTarget::DrawGlyphRun メソッドを呼び出してグリフを描画します。STDMETHODIMP GdiTextRenderer::DrawGlyphRun(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
DWRITE_MEASURING_MODE measuringMode,
__in DWRITE_GLYPH_RUN const* glyphRun,
__in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
IUnknown* clientDrawingEffect
)
{
HRESULT hr = S_OK;
// Pass on the drawing call to the render target to do the real work.
RECT dirtyRect = {0};
hr = pRenderTarget_->DrawGlyphRun(
baselineOriginX,
baselineOriginY,
measuringMode,
glyphRun,
pRenderingParams_,
RGB(0,200,255),
&dirtyRect
);
return hr;
}
IDWriteBitmapRenderTarget は、メモリ内のビットマップをカプセル化し、そこへレンダリングします。GetMemoryDC 関数は、このビットマップのデバイスコンテキストのハンドルを返します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
指定した位置にあるビットマップターゲットへグリフのランを描画します。
| baselineOriginX | FLOAT | in | DIB の左上隅を基準とした、ベースライン原点の水平位置(DIP 単位)。 |
| baselineOriginY | FLOAT | in | DIB の左上隅を基準とした、ベースライン原点の垂直位置(DIP 単位)。 |
| measuringMode | DWRITE_MEASURING_MODE | in | ラン内のグリフの計測方法。他のプロパティと組み合わせてレンダリングモードを決定するために使用されます。 |
| glyphRun | DWRITE_GLYPH_RUN* | in | グリフランのプロパティを格納する構造体。 |
| renderingParams | IDWriteRenderingParams* | in | レンダリング動作を制御するオブジェクト。 |
| textColor | COLORREF | in | テキストの前景色。 |
| blackBoxRect | RECT* | outoptional | グリフランの描画によって影響を受けるすべてのピクセルの境界ボックス(DIP ではなくピクセル単位)を受け取る省略可能な矩形。ブラックボックス矩形はビットマップの寸法を超えて広がる場合があります。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IDWriteBitmapRenderTarget::DrawGlyphRun を使用すると、実装したカスタムテキストレンダラーからビットマップへレンダリングできます。カスタムテキストレンダラーは、次のコードに示すように IDWriteTextRenderer::DrawGlyphRun コールバックメソッド内からこのメソッドを呼び出す必要があります。
STDMETHODIMP GdiTextRenderer::DrawGlyphRun(
__maybenull void* clientDrawingContext,
FLOAT baselineOriginX,
FLOAT baselineOriginY,
DWRITE_MEASURING_MODE measuringMode,
__in DWRITE_GLYPH_RUN const* glyphRun,
__in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
IUnknown* clientDrawingEffect
)
{
HRESULT hr = S_OK;
// Pass on the drawing call to the render target to do the real work.
RECT dirtyRect = {0};
hr = pRenderTarget_->DrawGlyphRun(
baselineOriginX,
baselineOriginY,
measuringMode,
glyphRun,
pRenderingParams_,
RGB(0,200,255),
&dirtyRect
);
return hr;
}
baselineOriginX、baslineOriginY、measuringMethod、glyphRun の各パラメーターは、コールバックメソッドが呼び出されるときに(引数として)提供されます。renderingParams、textColor、blackBoxRect は提供されません。
既定のレンダリングパラメーターは、IDWriteFactory::CreateMonitorRenderingParams メソッドを使用して取得できます。
メモリデバイスコンテキストのハンドルを取得します。
戻り値
Type: HDC
メモリデバイスコンテキストへのデバイスコンテキストハンドルを返します。
解説(Remarks)
アプリケーションは、このデバイスコンテキストを使用して GDI 関数で描画できます。アプリケーションは、GetCurrentObject を呼び出すことでビットマップハンドル (HBITMAP) を取得できます。ピクセルデータへのポインターを含む、基になるビットマップに関する情報を必要とするアプリケーションは、GetObject を呼び出して DIBSECTION 構造体を埋めることができます。ビットマップは常に 32 ビットの トップダウン DIB です。
このメソッドはパラメーターを受け取らず、HRESULT ではなく HDC 変数を返す点に注意してください。
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
ここで返される HDC は依然としてビットマップレンダーターゲットオブジェクトが所有しており、クライアントが解放または削除してはなりません。
DIP あたりのビットマップピクセル数を取得します。
戻り値
Type: FLOAT
DIP あたりのビットマップピクセル数。
解説(Remarks)
DIP(デバイス非依存ピクセル)は 1/96 インチです。したがって、この値は 1 インチあたりのピクセル数を 96 で割った値です。
DIP(デバイス非依存ピクセル)あたりのビットマップピクセル数を設定します。DIP は 1/96 インチであるため、この値は 1 インチあたりのピクセル数を 96 で割った値です。
| pixelsPerDip | FLOAT | in | DIP あたりのピクセル数を指定する値。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
抽象座標を DIP にマッピングする変換を取得します。既定ではこれは恒等変換です。これは、基になるデバイスコンテキストのワールド変換とは無関係である点に注意してください。
| transform | DWRITE_MATRIX* | out | このメソッドが返るときに、変換行列を格納します。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
抽象座標を DIP(デバイス非依存ピクセル)にマッピングする変換を設定します。これは、基になるデバイスコンテキストのワールド変換には影響しません。
| transform | DWRITE_MATRIX* | inoptional | 新しい変換を指定します。このパラメーターには NULL を指定でき、その場合は恒等変換が暗黙的に適用されます。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ターゲットビットマップの寸法を取得します。
| size | SIZE* | out | ビットマップの幅と高さをピクセル単位で返します。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ビットマップのサイズを変更します。
| width | DWORD | in | 新しいビットマップの幅(ピクセル単位)。 |
| height | DWORD | in | 新しいビットマップの高さ(ピクセル単位)。 |
戻り値
Type: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDWriteBitmapRenderTarget "{5E5A32A3-8DFF-4773-9FF6-0696EAB77267}" #usecom global IDWriteBitmapRenderTarget IID_IDWriteBitmapRenderTarget "{}" #comfunc global IDWriteBitmapRenderTarget_DrawGlyphRun 3 float,float,int,var,sptr,int,var #comfunc global IDWriteBitmapRenderTarget_GetMemoryDC 4 #comfunc global IDWriteBitmapRenderTarget_GetPixelsPerDip 5 #comfunc global IDWriteBitmapRenderTarget_SetPixelsPerDip 6 float #comfunc global IDWriteBitmapRenderTarget_GetCurrentTransform 7 var #comfunc global IDWriteBitmapRenderTarget_SetCurrentTransform 8 var #comfunc global IDWriteBitmapRenderTarget_GetSize 9 var #comfunc global IDWriteBitmapRenderTarget_Resize 10 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDWriteBitmapRenderTarget "{5E5A32A3-8DFF-4773-9FF6-0696EAB77267}" #usecom global IDWriteBitmapRenderTarget IID_IDWriteBitmapRenderTarget "{}" #comfunc global IDWriteBitmapRenderTarget_DrawGlyphRun 3 float,float,int,sptr,sptr,int,sptr #comfunc global IDWriteBitmapRenderTarget_GetMemoryDC 4 #comfunc global IDWriteBitmapRenderTarget_GetPixelsPerDip 5 #comfunc global IDWriteBitmapRenderTarget_SetPixelsPerDip 6 float #comfunc global IDWriteBitmapRenderTarget_GetCurrentTransform 7 sptr #comfunc global IDWriteBitmapRenderTarget_SetCurrentTransform 8 sptr #comfunc global IDWriteBitmapRenderTarget_GetSize 9 sptr #comfunc global IDWriteBitmapRenderTarget_Resize 10 int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。