ID2D1Factory
COM公式ドキュメント
Direct2D リソースを作成します。(ID2D1Factory)
解説(Remarks)
ID2D1Factory インターフェイスは、Direct2D を使用するための出発点です。図形の描画や記述に使用するその他の Direct2D リソースを作成するために使用します。
ファクトリは、次の描画リソースを生成できる一連の CreateResource メソッドを定義します。
- レンダー ターゲット: 描画コマンドをレンダリングするオブジェクトです。
- 描画状態ブロック: 現在の変換やアンチエイリアシング モードなど、描画状態の情報を格納するオブジェクトです。
- ジオメトリ: 単純な形状から複雑になり得る形状までを表すオブジェクトです。
ID2D1Factory を作成するには、CreateFactory メソッドのいずれかを使用します。Direct2D リソースを使用している間は、ID2D1Factory インスタンスを保持しておく必要があります。通常、アプリケーションの実行中にこれを再作成する必要はありません。Direct2D リソースの詳細については、Resources Overview を参照してください。
シングルスレッド ファクトリとマルチスレッド ファクトリ
ファクトリを作成するときに、それをマルチスレッドにするかシングルスレッドにするかを指定できます。シングルスレッド ファクトリは、Direct2D 内の他のシングルスレッド インスタンスに対して一切のシリアル化を行わないため、この仕組みは CPU 上で非常に高いスケーラビリティを実現します。マルチスレッド ファクトリ インスタンスを作成することもできます。この場合、ファクトリとそこから派生したすべてのオブジェクトを任意のスレッドから使用でき、各レンダー ターゲットに対して独立してレンダリングできます。Direct2D はこれらのオブジェクトへの呼び出しをシリアル化するため、単一のマルチスレッド Direct2D インスタンスは、多数のシングルスレッド インスタンスほどには CPU 上でスケールしません。ただし、マルチスレッド インスタンス内ではリソースを共有できます。
「On the CPU (CPU 上で)」という限定に注意してください。GPU は一般に、CPU よりもきめ細かい並列性を活用します。たとえば、CPU からのマルチスレッド呼び出しは、GPU に送られる際には結局シリアル化される場合がありますが、レンダリングを実行するために多数のピクセル シェーダーおよび頂点シェーダーが並列で動作します。
詳細については、Multithreaded Direct2D Apps を参照してください。
例
次のコード フラグメントは、ファクトリ ポインターを宣言し、シングルスレッド ファクトリ インスタンスを作成し、そのファクトリを使用してレンダー ターゲットを作成します。
ID2D1Factory* m_pDirect2dFactory;
// Create a Direct2D factory.
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
// Create a Direct2D render target.
hr = m_pDirect2dFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRenderTarget
);
メソッド 14
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
ファクトリの作成以降に変更された可能性のあるシステム既定値を、ファクトリに強制的に再読み込みさせます。
戻り値
解説(Remarks)
システム DPI が最新であることを保証するには、GetDesktopDpi メソッドを呼び出す前に ID2D1Factory.ReloadSystemMetrics を呼び出す必要があります。
現在のデスクトップの dots per inch (DPI) を取得します。この値を更新するには、ReloadSystemMetrics を呼び出します。
| dpiX | FLOAT* | out | このメソッドが返るときに、デスクトップの水平方向の DPI が格納されます。このパラメーターには記憶域を割り当てておく必要があります。 |
| dpiY | FLOAT* | out | このメソッドが返るときに、デスクトップの垂直方向の DPI が格納されます。このパラメーターには記憶域を割り当てておく必要があります。 |
解説(Remarks)
ウィンドウのサイズを指定する場合など、物理ピクセル値を設定する際にシステム DPI を取得するには、このメソッドを使用します。
| rectangle | D2D_RECT_F* | in | ジオメトリ化する矩形の座標へのポインタ。 |
| rectangleGeometry | ID2D1RectangleGeometry** | out | 作成された矩形ジオメトリを受け取る出力ポインタ。 |
| roundedRectangle | D2D1_ROUNDED_RECT* | in | ジオメトリ化する角丸矩形の定義へのポインタ。 |
| roundedRectangleGeometry | ID2D1RoundedRectangleGeometry** | out | 作成された角丸矩形ジオメトリを受け取る出力ポインタ。 |
| ellipse | D2D1_ELLIPSE* | in | ジオメトリ化する楕円の定義へのポインタ。 |
| ellipseGeometry | ID2D1EllipseGeometry** | out | 作成された楕円ジオメトリを受け取る出力ポインタ。 |
他のジオメトリを保持するオブジェクトである ID2D1GeometryGroup を作成します。
| fillMode | D2D1_FILL_MODE | in | 複合形状が、指定した点をジオメトリの一部と見なすかどうかを判定するために使用する規則を指定する値です。 |
| geometries | ID2D1Geometry** | in | ジオメトリ グループに追加するジオメトリ オブジェクトを格納した配列です。この配列の要素数は geometriesCount パラメーターで示されます。 |
| geometriesCount | DWORD | in | geometries の要素数です。 |
| geometryGroup | ID2D1GeometryGroup** | out | このメソッドが返るときに、このメソッドが作成したジオメトリ グループへのポインターのアドレスが格納されます。 |
戻り値
解説(Remarks)
ジオメトリ グループは、複数のジオメトリを同時にグループ化し、複数の異なるジオメトリのすべての図形を 1 つに連結する便利な方法です。ID2D1GeometryGroup オブジェクトを作成するには、ID2D1Factory オブジェクトの CreateGeometryGroup メソッドを呼び出し、D2D1_FILL_MODE_ALTERNATE (alternate) または D2D1_FILL_MODE_WINDING を取り得る値とする fillMode、ジオメトリ グループに追加するジオメトリ オブジェクトの配列、およびこの配列の要素数を渡します。
例
次のコード例では、まずジオメトリ オブジェクトの配列を宣言します。これらのオブジェクトは、半径 25、50、75、100 の 4 つの同心円です。次に、ID2D1Factory オブジェクトの CreateGeometryGroup を呼び出し、D2D1_FILL_MODE_ALTERNATE、ジオメトリ グループに追加するジオメトリ オブジェクトの配列、およびこの配列の要素数を渡します。
ID2D1Geometry *ppGeometries[] =
{
m_pEllipseGeometry1,
m_pEllipseGeometry2,
m_pEllipseGeometry3,
m_pEllipseGeometry4
};
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_ALTERNATE,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_AlternateFill
);
if (SUCCEEDED(hr))
{
hr = m_pD2DFactory->CreateGeometryGroup(
D2D1_FILL_MODE_WINDING,
ppGeometries,
ARRAYSIZE(ppGeometries),
&m_pGeoGroup_WindingFill
);
}
次の図は、この例の 2 つのグループ ジオメトリをレンダリングした結果を示しています。
| sourceGeometry | ID2D1Geometry* | in | 変換を適用する元ジオメトリへのポインタ。 |
| transform | D2D_MATRIX_3X2_F* | in | 元ジオメトリに適用する変換行列へのポインタ。 |
| transformedGeometry | ID2D1TransformedGeometry** | out | 作成された変換済みジオメトリを受け取る出力ポインタ。 |
空の ID2D1PathGeometry を作成します。
| pathGeometry | ID2D1PathGeometry** | out | このメソッドが返るときに、このメソッドが作成したパス ジオメトリへのポインターのアドレスが格納されます。 |
戻り値
| strokeStyleProperties | D2D1_STROKE_STYLE_PROPERTIES* | in | 線端・継ぎ目・破線などのストローク属性へのポインタ。 |
| dashes | FLOAT* | inoptional | 破線パターンの各長さを指定するFLOAT配列。NULL可。 |
| dashesCount | DWORD | in | dashes配列の要素数。0で実線となる。 |
| strokeStyle | ID2D1StrokeStyle** | out | 作成されたストロークスタイルを受け取る出力ポインタ。 |
| drawingStateDescription | D2D1_DRAWING_STATE_DESCRIPTION* | inoptional | 初期描画状態を指定する記述子へのポインタ。NULL可で既定値。 |
| textRenderingParams | IDWriteRenderingParams* | inoptional | 初期テキストレンダリングパラメータ。NULL可。 |
| drawingStateBlock | ID2D1DrawingStateBlock** | out | 作成された描画状態ブロックを受け取る出力ポインタ。 |
| target | IWICBitmap* | in | 描画先となるWICビットマップへのポインタ。 |
| renderTargetProperties | D2D1_RENDER_TARGET_PROPERTIES* | in | ピクセル形式やDPIなどのレンダーターゲット属性へのポインタ。 |
| renderTarget | ID2D1RenderTarget** | out | 作成されたレンダーターゲットを受け取る出力ポインタ。 |
| renderTargetProperties | D2D1_RENDER_TARGET_PROPERTIES* | in | ピクセル形式やDPIなどの共通レンダーターゲット属性へのポインタ。 |
| hwndRenderTargetProperties | D2D1_HWND_RENDER_TARGET_PROPERTIES* | in | 対象ウィンドウハンドルやサイズなどHWND固有属性へのポインタ。 |
| hwndRenderTarget | ID2D1HwndRenderTarget** | out | 作成されたHWNDレンダーターゲットを受け取る出力ポインタ。 |
| dxgiSurface | IDXGISurface* | in | 描画先となるDXGIサーフェスへのポインタ。 |
| renderTargetProperties | D2D1_RENDER_TARGET_PROPERTIES* | in | ピクセル形式やDPIなどのレンダーターゲット属性へのポインタ。 |
| renderTarget | ID2D1RenderTarget** | out | 作成されたレンダーターゲットを受け取る出力ポインタ。 |
Windows Graphics Device Interface (GDI) デバイス コンテキストに描画するレンダー ターゲットを作成します。
| renderTargetProperties | D2D1_RENDER_TARGET_PROPERTIES* | in | レンダリング モード、ピクセル フォーマット、リモート処理オプション、DPI 情報、およびハードウェア レンダリングに必要な最小限の DirectX サポートです。デバイス コンテキスト (DC) レンダー ターゲットを GDI と連携させるには、DXGI フォーマットを DXGI_FORMAT_B8G8R8A8_UNORM に、アルファ モードを D2D1_ALPHA_MODE_PREMULTIPLIED または D2D1_ALPHA_MODE_IGNORE に設定します。ピクセル フォーマットの詳細については、Supported Pixel Formats and Alpha Modes を参照してください。 |
| dcRenderTarget | ID2D1DCRenderTarget** | out | このメソッドが返るときに、dcRenderTarget にはメソッドが作成した ID2D1DCRenderTarget へのポインターのアドレスが格納されます。 |
戻り値
解説(Remarks)
DC レンダー ターゲットでレンダリングする前に、レンダー ターゲットの BindDC メソッドを使用して、それを GDI DC に関連付ける必要があります。異なる DC ごとに、また描画対象領域のサイズが変わるたびに、この操作を行います。
DC レンダー ターゲットを GDI と連携させるには、レンダー ターゲットの DXGI フォーマットを DXGI_FORMAT_B8G8R8A8_UNORM に、アルファ モードを D2D1_ALPHA_MODE_PREMULTIPLIED または D2D1_ALPHA_MODE_IGNORE に設定します。
アプリケーションはレンダー ターゲットを一度だけ作成し、アプリケーションの存続期間中、またはレンダー ターゲットの EndDraw メソッドが D2DERR_RECREATE_TARGET エラーを返すまで保持し続ける必要があります。このエラーを受け取ったら、レンダー ターゲット (およびそれが作成したすべてのリソース) を再作成します。
例
次のコードは DC レンダー ターゲットを作成します。
// Create a DC render target.
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE),
0,
0,
D2D1_RENDER_TARGET_USAGE_NONE,
D2D1_FEATURE_LEVEL_DEFAULT
);
hr = m_pD2DFactory->CreateDCRenderTarget(&props, &m_pDCRT);
上記のコードでは、m_pD2DFactory は ID2D1Factory へのポインターであり、m_pDCRT は ID2D1DCRenderTarget へのポインターです。
次のコード例は、DC を ID2D1DCRenderTarget にバインドします。
HRESULT DemoApp::OnRender(const PAINTSTRUCT &ps)
{
// Get the dimensions of the client drawing area.
GetClientRect(m_hwnd, &rc);
// Bind the DC to the DC render target.
hr = m_pDCRT->BindDC(ps.hdc, &rc);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ID2D1Factory "{06152247-6F50-465A-9245-118BFD3B6007}" #usecom global ID2D1Factory IID_ID2D1Factory "{}" #comfunc global ID2D1Factory_ReloadSystemMetrics 3 #comfunc global ID2D1Factory_GetDesktopDpi 4 var,var #comfunc global ID2D1Factory_CreateRectangleGeometry 5 var,sptr #comfunc global ID2D1Factory_CreateRoundedRectangleGeometry 6 var,sptr #comfunc global ID2D1Factory_CreateEllipseGeometry 7 var,sptr #comfunc global ID2D1Factory_CreateGeometryGroup 8 int,sptr,int,sptr #comfunc global ID2D1Factory_CreateTransformedGeometry 9 sptr,var,sptr #comfunc global ID2D1Factory_CreatePathGeometry 10 sptr #comfunc global ID2D1Factory_CreateStrokeStyle 11 var,var,int,sptr #comfunc global ID2D1Factory_CreateDrawingStateBlock 12 var,sptr,sptr #comfunc global ID2D1Factory_CreateWicBitmapRenderTarget 13 sptr,var,sptr #comfunc global ID2D1Factory_CreateHwndRenderTarget 14 var,var,sptr #comfunc global ID2D1Factory_CreateDxgiSurfaceRenderTarget 15 sptr,var,sptr #comfunc global ID2D1Factory_CreateDCRenderTarget 16 var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_ID2D1Factory "{06152247-6F50-465A-9245-118BFD3B6007}" #usecom global ID2D1Factory IID_ID2D1Factory "{}" #comfunc global ID2D1Factory_ReloadSystemMetrics 3 #comfunc global ID2D1Factory_GetDesktopDpi 4 sptr,sptr #comfunc global ID2D1Factory_CreateRectangleGeometry 5 sptr,sptr #comfunc global ID2D1Factory_CreateRoundedRectangleGeometry 6 sptr,sptr #comfunc global ID2D1Factory_CreateEllipseGeometry 7 sptr,sptr #comfunc global ID2D1Factory_CreateGeometryGroup 8 int,sptr,int,sptr #comfunc global ID2D1Factory_CreateTransformedGeometry 9 sptr,sptr,sptr #comfunc global ID2D1Factory_CreatePathGeometry 10 sptr #comfunc global ID2D1Factory_CreateStrokeStyle 11 sptr,sptr,int,sptr #comfunc global ID2D1Factory_CreateDrawingStateBlock 12 sptr,sptr,sptr #comfunc global ID2D1Factory_CreateWicBitmapRenderTarget 13 sptr,sptr,sptr #comfunc global ID2D1Factory_CreateHwndRenderTarget 14 sptr,sptr,sptr #comfunc global ID2D1Factory_CreateDxgiSurfaceRenderTarget 15 sptr,sptr,sptr #comfunc global ID2D1Factory_CreateDCRenderTarget 16 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。