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
- Cree el ID2D1Geometry que se usará para recortar la región.
- Llame a ID2D1RenderTarget::CreateLayer para crear una capa.
- Llame a ID2D1RenderTarget::P ushLayer y pase la máscara geométrica que definió en el paso 1.
- Dibuje el contenido que se va a recortar.
- 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.
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;
}
Temas relacionados