Comment découper un masque géométrique

Cette rubrique explique comment utiliser un masque géométrique pour couper une région d’un calque.

Pour couper une région à l’aide d’un masque géométrique

  1. Créez l’ID2D1Geometry qui sera utilisé pour couper la région.
  2. Appelez ID2D1RenderTarget::CreateLayer pour créer une couche.
  3. Appelez ID2D1RenderTarget::P ushLayer et passez le masque géométrique que vous avez défini à l’étape 1.
  4. Dessinez le contenu à découper.
  5. Appelez ID2D1RenderTarget::P opLayer pour supprimer la couche de la cible de rendu.

L’exemple suivant utilise un masque géométrique pour couper une image et plusieurs rectangles. L’illustration suivante montre l’image bitmap d’origine à gauche et la bitmap coupée au masque géométrique à droite.

illustration d’une image bitmap de poisson rouge avant et après que la bitmap soit clippée sur un masque en forme de star

Pour découper le dessin comme indiqué dans l’illustration précédente, vous créez une id2D1PathGeometry et utilisez-la pour définir un star. Le code suivant montre comment procéder.

// 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);

Appelez CreateLayer pour créer une couche.

Notes

À compter de Windows 8, vous n’avez pas besoin d’appeler CreateLayer. Dans la plupart des situations, les performances sont meilleures si vous n’appelez pas cette méthode et Que Direct2D gère les ressources de couche.

 

Appelez PushLayer avec le masque de géométrie pour envoyer (push) le calque. Dessinez le contenu à découper, puis appelez PopLayer pour afficher le calque. Cela produit le dessin en forme de star. Le code suivant montre comment procéder.

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;
}

Vue d’ensemble des couches

Référence Direct2D