Cómo recortar a una máscara geométrica

En este tema se describe cómo usar una máscara geométrica para recortar una región de una capa.

Para recortar una región con una máscara geométrica

  1. Cree el ID2D1Geometry que se usará para recortar la región.
  2. Llame a ID2D1RenderTarget::CreateLayer para crear una capa.
  3. Llame a ID2D1RenderTarget::P ushLayer y pase la máscara geométrica que definió en el paso 1.
  4. Dibuje el contenido que se va a recortar.
  5. Llame a ID2D1RenderTarget::P opLayer para quitar la capa del destino de representación.

En el ejemplo siguiente se usa una máscara geométrica para recortar una imagen y varios rectángulos. En la ilustración siguiente se muestra el mapa de bits original a la izquierda y el mapa de bits recortado a la máscara geométrica de la derecha.

Ilustración de un mapa de bits de pez de oro antes y después de que el mapa de bits se recorta en una máscara con forma de star

Para recortar el dibujo como se muestra en la ilustración anterior, cree un ID2D1PathGeometry y úselo para definir un star. El código siguiente muestra cómo hacerlo.

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

Llame a CreateLayer para crear una capa.

Nota

A partir de Windows 8, no es necesario llamar a CreateLayer. En la mayoría de los casos, el rendimiento es mejor si no llamas a este método y Direct2D administra los recursos de capa.

 

Llame a PushLayer con la máscara de geometría para insertar la capa. Dibuje el contenido para recortar y, a continuación, llame a PopLayer para mostrar la capa. Esto genera el dibujo en forma de star. El código siguiente muestra cómo hacerlo.

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

Introducción a las capas

Referencia de Direct2D