Como cortar para uma máscara geométrica

Este tópico descreve como usar uma máscara geométrica para cortar uma região de uma camada.

Para cortar uma região com uma máscara geométrica

  1. Crie a ID2D1Geometry que será usada para cortar a região.
  2. Chame ID2D1RenderTarget::CreateLayer para criar uma camada.
  3. Chame ID2D1RenderTarget::P ushLayer e passe a máscara geométrica definida na etapa 1.
  4. Desenhe o conteúdo a ser recortar.
  5. Chame ID2D1RenderTarget::P opLayer para remover a camada do destino de renderização.

O exemplo a seguir usa uma máscara geométrica para cortar uma imagem e vários retângulos. A ilustração a seguir mostra o bitmap original à esquerda e o bitmap recortado na máscara geométrica à direita.

ilustração de um bitmap de peixinho dourado antes e depois que o bitmap é recortado em uma máscara em forma de star

Para cortar o desenho conforme mostrado na ilustração anterior, você cria um ID2D1PathGeometry e o usa para definir um star. O código a seguir mostra como fazer isso.

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

Chame CreateLayer para criar uma camada.

Observação

Começando com Windows 8, você não precisa chamar CreateLayer. Na maioria das situações, o desempenho será melhor se você não chamar esse método e Direct2D gerenciar os recursos de camada.

 

Chame PushLayer com a máscara de geometria para efetuar push da camada. Desenhe o conteúdo para cortar e, em seguida, chame PopLayer para abrir a camada. Isso produz o desenho em forma de star. O código a seguir mostra como fazer isso.

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

Visão geral das camadas

Referência de Direct2D