D2D1_FILL_MODE列挙 (d2d1.h)
ジオメトリまたは図形の交差する領域を組み合わせて複合ジオメトリの領域を形成する方法を指定します。
構文
typedef enum D2D1_FILL_MODE {
D2D1_FILL_MODE_ALTERNATE = 0,
D2D1_FILL_MODE_WINDING = 1,
D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} ;
定数
D2D1_FILL_MODE_ALTERNATE 値: 0 ポイントが塗りつぶし領域にあるかどうかを判断するには、そのポイントから無限遠までの光線を任意の方向に描画し、光線が交差する指定された図形内のパス セグメントの数をカウントします。 この数値が奇数の場合、ポイントは塗りつぶし領域にあります。偶数の場合、ポイントは塗りつぶし領域の外側にあります。 |
D2D1_FILL_MODE_WINDING 値: 1 ポイントがパスの塗りつぶし領域にあるかどうかを判断するには、そのポイントから無限遠までの光線を任意の方向に描画し、図形のセグメントがレイと交差する場所を調べます。 カウント 0 から始めて、セグメントが左から右に光線を横切るたびに 1 つを加算し、左右が光線の視点から見える限り、パス セグメントが右から左に光線を横切るたびに 1 つ減算します。 交差をカウントした後、結果が 0 の場合、ポイントはパスの外側にあります。 それ以外の場合は、パス内にあります。 |
D2D1_FILL_MODE_FORCE_DWORD 値: 0xffffffff |
解説
CreateGeometryGroup メソッドを使用して ID2D1GeometryGroup を作成するとき、または ID2D1SimplifiedGeometrySink::SetFillMode メソッドを使用して ID2D1SimplifiedGeometrySink の塗りつぶしモードを変更する場合は、D2D1_FILL_MODE列挙体を使用します。
Direct2D は、この列挙で指定された 2 つの塗りつぶしモード (D2D1_FILL_MODE_ALTERNATE (代替) または D2D1_FILL_MODE_WINDING (巻き取り) のいずれかを使用して、パス の内部を 塗りつぶします。 モードは閉じた図形の内部を塗りつぶす方法を決定するため、すべての図形は塗りつぶされると閉じたものとして扱われます。 図形内のセグメントにギャップがある場合は、仮想線を描画して閉じます。
次の図に示すように、巻き取りモードと代替フィル モードの違いを確認するには、同じ中心と異なる半径を持つ 4 つの円があるとします。 1 つ目の半径は 25、2 番目の 50、3 番目の 75、および 4 番目の 100 です。
次の図は、代替塗りつぶしモードを使用して塗りつぶされた図形を示しています。 中央と 3 番目のリングが塗りつぶされていないことに注意してください。 これは、これらの 2 つのリングの任意のポイントから描画されたレイが、偶数のセグメントを通過するためです。 このプロセスを次の図に示します。 次の図は、巻き取りフィル モードを指定したときに同じ図形がどのように塗りつぶされるかを示しています。 すべてのリングが塗りつぶされていることに注意してください。 これは、すべてのセグメントが同じ方向に実行されるため、任意の点から描画されたレイが 1 つ以上のセグメントを横切り、交差の合計が 0 に等しくないためです。このプロセスを次の図に示します。 赤い矢印はセグメントが描画される方向を表し、黒い矢印は最も内側のリング内の点から実行される任意のレイを表します。 値 0 から始まり、レイが交差するセグメントごとに、時計回りの交差ごとに 1 の値が追加されます。 カウントが 0 に等しくないため、この図では、すべてのポイントが塗りつぶし領域にあります。
例
次のコード例では、前の図を使用したジオメトリ グループを作成します。 このコードでは、最初に geometry オブジェクトの配列を宣言します。 これらのオブジェクトは、半径が 25、50、75、100 の 4 つの同心円です。 次に、ID2D1Factory オブジェクトで CreateGeometryGroup を呼び出し、D2D1_FILL_MODE_ALTERNATE、geometry グループに追加する geometry オブジェクトの配列、およびこの配列内の要素の数を渡します。
HRESULT DemoApp::CreateGeometryResources()
{
HRESULT hr;
const D2D1_ELLIPSE ellipse1 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
25.0f,
25.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse1,
&m_pEllipseGeometry1
);
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse2 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
50.0f,
50.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse2,
&m_pEllipseGeometry2
);
}
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse3 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
75.0f,
75.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse3,
&m_pEllipseGeometry3
);
}
if (SUCCEEDED(hr))
{
const D2D1_ELLIPSE ellipse4 = D2D1::Ellipse(
D2D1::Point2F(105.0f, 105.0f),
100.0f,
100.0f
);
hr = m_pD2DFactory->CreateEllipseGeometry(
ellipse4,
&m_pEllipseGeometry4
);
}
if (SUCCEEDED(hr))
{
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
);
}
}
return hr;
}
要件
サポートされている最小のクライアント | Windows 7、Windows Vista SP2 と Windows Vista 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 R2、Windows Server 2008 SP2 および Windows Server 2008 用プラットフォーム更新プログラム [デスクトップ アプリ |UWP アプリ] |
Header | d2d1.h |