ジオメトリック マスクにクリップする方法

このトピックでは、ジオメトリック マスクを使用してレイヤーの領域をクリップする方法について説明します。

ジオメトリック マスクを使用して領域をクリップするには

  1. リージョンのクリップに使用する ID2D1Geometry を作成します。
  2. ID2D1RenderTarget::CreateLayer を呼び出してレイヤーを作成します。
  3. ID2D1RenderTarget::P ushLayer を呼び出し、手順 1 で定義したジオメトリック マスクを渡します。
  4. クリップするコンテンツを描画します。
  5. ID2D1RenderTarget::P opLayer を呼び出して、レンダー ターゲットからレイヤーを削除します。

次の例では、ジオメトリック マスクを使用して画像と複数の四角形をクリップします。 次の図は、左側の元のビットマップと、右側のジオメトリック マスクにクリップされたビットマップを示しています。

ビットマップがstar形のマスクにクリップされる前後の金魚ビットマップの図

前の図に示すように図面をクリップするには、ID2D1PathGeometry を作成し、それを使用してstarを定義します。 この方法を次のコードに示します。

// Create the path geometry.
if (SUCCEEDED(hr))
{
    hr = m_pD2DFactory->CreatePathGeometry(&m_pPathGeometry);
}

// Write to the path geometry using the geometry sink to create a star.
if (SUCCEEDED(hr))
{
    hr = m_pPathGeometry->Open(&pSink);
}
if (SUCCEEDED(hr))
{
    pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
    pSink->BeginFigure(D2D1::Point2F(20, 50), D2D1_FIGURE_BEGIN_FILLED);
    pSink->AddLine(D2D1::Point2F(130, 50));
    pSink->AddLine(D2D1::Point2F(20, 130));
    pSink->AddLine(D2D1::Point2F(80, 0));
    pSink->AddLine(D2D1::Point2F(130, 130));
    pSink->EndFigure(D2D1_FIGURE_END_CLOSED);

    hr = pSink->Close();
}

SafeRelease(&pSink);

CreateLayer を呼び出してレイヤーを作成します。

注意

Windows 8以降、CreateLayer を呼び出す必要はありません。 ほとんどの場合、このメソッドを呼び出さないとパフォーマンスが向上し、Direct2D によってレイヤー リソースが管理されます。

 

ジオメトリ マスクを使用して PushLayer を呼び出して、レイヤーをプッシュします。 クリップするコンテンツを描画し、 PopLayer を呼び出してレイヤーをポップします。 これにより、star形状の描画が生成されます。 この方法を次のコードに示します。

HRESULT DemoApp::RenderWithLayer(ID2D1RenderTarget *pRT)
{
    HRESULT hr = S_OK;

    // Create a layer.
    ID2D1Layer *pLayer = NULL;
    hr = pRT->CreateLayer(NULL, &pLayer);

    if (SUCCEEDED(hr))
    {
        pRT->SetTransform(D2D1::Matrix3x2F::Translation(350, 50));

        // Push the layer with the geometric mask.
        pRT->PushLayer(
            D2D1::LayerParameters(D2D1::InfiniteRect(), m_pPathGeometry),
            pLayer
            );
            
  
        pRT->DrawBitmap(m_pOrigBitmap, D2D1::RectF(0, 0, 200, 133));
        pRT->FillRectangle(D2D1::RectF(0.f, 0.f, 25.f, 25.f), m_pSolidColorBrush);  
        pRT->FillRectangle(D2D1::RectF(25.f, 25.f, 50.f, 50.f), m_pSolidColorBrush);
        pRT->FillRectangle(D2D1::RectF(50.f, 50.f, 75.f, 75.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(75.f, 75.f, 100.f, 100.f), m_pSolidColorBrush);    
        pRT->FillRectangle(D2D1::RectF(100.f, 100.f, 125.f, 125.f), m_pSolidColorBrush); 
        pRT->FillRectangle(D2D1::RectF(125.f, 125.f, 150.f, 150.f), m_pSolidColorBrush);    
        

        pRT->PopLayer();
    }

    SafeRelease(&pLayer);

    return hr;
}

レイヤーの概要

Direct2D リファレンス