Introducción a los destinos de representación de A8 compatibles
En este tema se describen los conceptos básicos de un destino de representación A8 compatible y se proporcionan ejemplos de cómo usarlo.
Un destino de representación A8 compatible es un destino de representación compatible (ID2D1BitmapRenderTarget) que usa un formato de píxel A8 (DXGI_FORMAT_A8_UNORM). Puede usar un destino de representación A8 compatible para mejorar el rendimiento de la aplicación y proporcionar transiciones más fluidas durante la animación de texto. Un destino de representación A8 compatible es especialmente útil cuando se intenta mejorar lo siguiente:
Velocidad de fotogramas de la aplicación que representa texto o geometría con alias que incluye solo animaciones simples, como la traducción, la rotación, la escala o los cambios de color.
Continuidad visual de la aplicación que amplía y disminuye el texto durante una animación.
Para crear un destino de representación A8 compatible, use el método ID2D1RenderTarget::CreateCompatibleRenderTarget junto con el formato de píxel DXGI_FORMAT_A8_UNORM y especifique un destino de representación compatible devuelto. Para obtener más información sobre los formatos de píxeles, consulte Formatos de píxeles admitidos y modos alfa.
Por ejemplo, para animar eficazmente el texto que se muestra en la siguiente captura de pantalla, use un destino de representación A8 compatible para almacenar en caché el texto como una máscara de opacidad. A continuación, aplique transformaciones a la máscara de opacidad para lograr resultados de representación rápidos.
El código siguiente muestra cómo hacerlo. Crea un destino de representación A8 compatible, recupera el mapa de bits de el mismo y, a continuación, representa el mapa de bits mediante FillOpacityMask.
ID2D1BitmapRenderTarget *m_pOpacityRT;
// Create the compatible render target using desiredPixelSize to avoid
// blurriness issues caused by a fractional-pixel desiredSize.
D2D1_PIXEL_FORMAT alphaOnlyFormat = D2D1::PixelFormat(
DXGI_FORMAT_A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED);
hr = m_pRT->CreateCompatibleRenderTarget(
NULL,
&maskPixelSize,
&alphaOnlyFormat,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE,
&m_pOpacityRT
);
D2D1_RECT_F destinationRect = D2D1::RectF(
roundedOffset.x,
roundedOffset.y,
roundedOffset.x + opacityRTSize.width,
roundedOffset.y + opacityRTSize.height
);
ID2D1Bitmap *pBitmap = NULL;
m_pOpacityRT->GetBitmap(&pBitmap);
pBitmap->GetDpi(&dpiX, &dpiY);
// The antialias mode must be set to D2D1_ANTIALIAS_MODE_ALIASED
// for this method to succeed. We've set this mode already though
// so no need to do it again.
m_pRT->FillOpacityMask(
pBitmap,
m_pBlackBrush,
D2D1_OPACITY_MASK_CONTENT_TEXT_NATURAL,
&destinationRect
);
pBitmap->Release();