Introducción a la API de Direct2D
Direct2D proporciona una API, similar a Direct3D, para su uso con C o C++. La API expone una variedad de funcionalidades relacionadas con el dibujo:
- Representar destinos para la representación en pantalla y fuera de pantalla mediante Direct2D, Direct3D o GDI.
- Objetos para administrar el estado de dibujo, como transformaciones de espacio de coordenadas y modos de suavizado de contorno.
- Representaciones de datos geométricos y funciones para el procesamiento de geometría.
- Funcionalidad de representación para mapas de bits, geometrías y texto.
- Aprovisiona el uso de contenido gráfico creado mediante GDI o Direct3D.
En este tema se proporciona información general sobre los objetos que componen la API de Direct2D. Contiene las secciones siguientes:
- Archivos de encabezado de Direct2D
- Direct2D Interfaces
- La interfaz ID2D1Factory
- Destinos de representación
- Recursos de dibujo
- Texto de dibujo
- Primitivos de Direct2D
- Temas relacionados
Archivos de encabezado de Direct2D
La API de Direct2D se define mediante los siguientes archivos de encabezado.
Archivo de encabezado | Descripción |
---|---|
d2d1.h | Define las versiones de C y C++ de la API principal de Direct2D. |
d2d1helper.h | Define las funciones auxiliares, las clases y las estructuras del asistente de C++. |
d2dbasetypes.h | Define primitivos de dibujo para Direct2D, como puntos y rectángulos. Este encabezado se incluye con d2d1.h. |
d2derr.h | Define los códigos de error de Direct2D. Este encabezado se incluye con d2d1.h. |
d2d1_1.h | Define las versiones de C y C++ de la API principal de Direct2D para Windows 8 y versiones posteriores. |
d2d1_1helper.h | Define las funciones auxiliares de C++, las clases y las estructuras para Windows 8 y versiones posteriores. |
d2d1effects.h | Define las versiones de C y C++ de la parte de efectos de imagen de la API de Direct2D para Windows 8 y versiones posteriores. |
d2d1effecthelpers.h | Define las funciones auxiliares de C++, las clases y las estructuras de los efectos de imagen que forman parte de la API de Direct2D para Windows 8 y versiones posteriores. |
Para usar Direct2D, la aplicación debe incluir el archivo de encabezado d2d1.h.
Para compilar una aplicación direct2D, agregue d2d1.lib a la lista de bibliotecas. Puedes encontrar d2d1.h y d2d1.lib en El Kit de desarrollo de software (SDK) de Windows para Windows 7.
En las secciones siguientes se describen algunas de las interfaces comunes proporcionadas por la API de Direct2D.
Direct2D Interfaces
En la raíz de la API de Direct2D se encuentran las interfaces ID2D1Factory e ID2D1Resource . Un objeto ID2D1Factory crea objetos ID2D1Resource y actúa como punto de partida para usar Direct2D. Todos los demás objetos direct2D heredan de la interfaz ID2D1Resource . Hay dos tipos de recursos de Direct2D: recursos independientes del dispositivo y recursos dependientes del dispositivo.
- Los recursos independientes del dispositivo no están asociados a un dispositivo de representación determinado y pueden conservarse durante la vida útil de una aplicación.
- Los recursos dependientes del dispositivo están asociados a un dispositivo de representación determinado y dejan de funcionar si se quita ese dispositivo.
(Para obtener más información sobre los recursos y el uso compartido de recursos, consulte La información general sobre recursos).
La interfaz ID2D1Factory
La interfaz ID2D1Factory es el punto de partida para usar Direct2D. Usa un id2D1Factory para crear instancias de recursos de Direct2D. Para crear un id2D1Factory, use uno de los métodos CreateFactory .
Un generador define un conjunto de métodos CreateResource que pueden generar los siguientes recursos de dibujo:
- Los destinos de representación son objetos que representan comandos de dibujo.
- Los bloques de estado de dibujo son objetos que almacenan información de estado de dibujo, como el modo actual de transformación y suavizado de contorno.
- Las geometrías son objetos que representan formas simples y potencialmente complejas.
Uno de los objetos más útiles que puede crear un generador es id2D1RenderTarget, que se describe en la sección siguiente.
Destinos de representación
Un destino de representación es un recurso que hereda de la interfaz ID2D1RenderTarget . Un destino de representación crea recursos para dibujar y realiza operaciones de dibujo. Hay varios tipos de destinos de representación que se pueden usar para representar gráficos de las siguientes maneras:
- Los objetos ID2D1HwndRenderTarget representan el contenido en una ventana.
- Los objetos ID2D1DCRenderTarget se representan en un contexto de dispositivo GDI.
- Los objetos de destino de representación de mapa de bits representan el contenido en un mapa de bits fuera de pantalla.
- Los objetos de destino de representación DXGI se representan en una superficie DXGI para su uso con Direct3D.
Dado que un destino de representación está asociado a un dispositivo de representación determinado, es un recurso dependiente del dispositivo y deja de funcionar si se quita el dispositivo.
Características de destino de representación
Puede especificar si un destino de representación debe usar la aceleración de hardware y si el equipo local o remoto debe representar la pantalla remota. Los destinos de representación se pueden configurar para la representación con alias o suavizado de contorno. Para representar escenas con un gran número de primitivos, un desarrollador también puede representar gráficos 2D en modo con alias y usar suavizado multiample D3D para lograr una mayor escalabilidad.
Los destinos de representación también pueden agrupar las operaciones de dibujo en capas representadas por la interfaz ID2D1Layer . Las capas son útiles para recopilar operaciones de dibujo que se van a componer juntas al representar un marco. En algunos escenarios, esto puede ser una alternativa útil a la representación en un destino de representación de mapa de bits y, a continuación, reutilizar el contenido del mapa de bits, ya que los costos de asignación de capas son menores que para un ID2D1BitmapRenderTarget.
Los destinos de representación pueden crear nuevos destinos de representación compatibles con ellos mismos, lo que resulta útil para la representación intermedia fuera de la pantalla, a la vez que conserva las distintas propiedades de destino de representación que se establecieron en el original.
También es posible representar mediante GDI en un destino de representación de Direct2D llamando a QueryInterface en un destino de representación para ID2D1GdiInteropRenderTarget, que tiene métodos GetDC y ReleaseDC en él que se pueden usar para recuperar un contexto de dispositivo GDI. La representación a través de GDI solo es posible si el destino de representación se creó con la marca D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE establecida. Esto es útil para las aplicaciones que se representan principalmente con Direct2D, pero que tienen un modelo de extensibilidad u otro contenido heredado que requiere la capacidad de representarse con GDI. Para obtener más información, consulta Introducción a la interoperabilidad de Direct2D y GDI.
Representar recursos de destino
Al igual que un generador, un destino de representación puede crear recursos de dibujo. Los recursos creados por un destino de representación son recursos dependientes del dispositivo (al igual que el destino de representación). Un destino de representación puede crear los siguientes tipos de recursos:
- Mapas de bits
- Pinceles
- Capas
- Mallas
Comandos de dibujo
Para representar contenido, use los métodos de dibujo de destino de representación. Antes de empezar a dibujar, llame al método ID2D1RenderTarget::BeginDraw . Cuando haya terminado de dibujar, llame al método ID2D1RenderTarget::EndDraw . Entre estas llamadas, se usan métodos Draw y Fill para representar recursos de dibujo. La mayoría de los métodos Draw y Fill toman una forma (un primitivo o una geometría) y un pincel para rellenar o esquematización de la forma.
Los destinos de representación también proporcionan métodos para recortar, aplicar máscaras de opacidad y transformar el espacio de coordenadas.
Direct2D usa un sistema de coordenadas a la izquierda: los valores positivos del eje X continúan hacia abajo y los valores positivos del eje Y.
Tratamiento de errores
Los comandos de dibujo de destino de representación no indican si la operación solicitada se realizó correctamente. Para averiguar si se produjeron errores de dibujo, llame al método Flush de destino de representación o al método EndDraw para obtener un HRESULT.
Recursos de dibujo
En las secciones siguientes se describen algunos de los recursos que se pueden crear mediante el destino de representación y las interfaces de fábrica.
Pinceles
Un pincel, representado por la interfaz ID2D1Brush , es un recurso dependiente del dispositivo, creado por un destino de representación, que pinta un área con su salida. Distintos pinceles tienen tipos de salida diferentes. Algunos pinceles pintan un área con un color sólido, otros con un degradado o una imagen. Direct2D proporciona cuatro tipos de pinceles:
- ID2D1SolidColorBrush pinta un área con un color sólido.
- ID2D1LinearGradientBrush pinta un área con un degradado lineal que combina dos o más colores a través de una línea, el eje degradado.
- ID2D1RadialGradientBrush pinta un área con un degradado radial que combina dos o más colores alrededor de una elipse.
- ID2D1BitmapBrush pinta un área con un mapa de bits.
Para crear un pincel, use uno de los métodos ID2D1RenderTarget::Create*Type>*<Brush, como CreateRadialGradientBrush. Los pinceles se pueden usar con métodos Draw y Fill de destino de representación, ya sea para pintar un trazo de forma o un contorno, o como máscara de opacidad.
Para obtener más información sobre los pinceles, vea Información general sobre pinceles.
Geometrías
Además de los primitivos de dibujo básicos, como puntos, rectángulos y puntos suspensivos, Direct2D proporciona la interfaz ID2D1Geometry para describir formas simples y complejas. Las interfaces que heredan de ID2D1Geometry definen diferentes tipos de formas, como ID2D1RectangleGeometry para representar rectángulos, ID2D1RoundedRectangleGeometry para representar rectángulos redondeados y ID2D1EllipseGeometry para representar puntos suspensivos.
Se pueden crear formas más complejas mediante la interfaz ID2D1GeometrySink para especificar una serie de figuras compuestas de líneas, curvas y arcos. Id2D1GeometrySink se pasa al método Open de un ID2D1PathGeometry para generar una geometría compleja. ID2D1SimplifiedGeometrySink también se puede usar con la API de DirectWrite para extraer esquemas de ruta de acceso del texto con formato para la representación artística.
Las interfaces de geometría proporcionan métodos para manipular formas al ampliar o simplificar las geometrías existentes, o mediante la generación de la intersección o unión de varias geometrías. También proporcionan métodos para determinar si las geometrías se cruzan o se superponen, recuperan información de límites, calculan el área o la longitud de una geometría y interpolan las ubicaciones a lo largo de una geometría. Direct2D también proporciona la capacidad de crear una malla de triángulos teselados a partir de una geometría.
Para crear una geometría, use uno de los métodos ID2D1Factory::Create*<Type>*Geometry, como CreatePathGeometry. Una geometría es un recurso independiente del dispositivo.
Para representar una geometría, use los métodos DrawGeometry y FillGeometry de un destino de representación.
Para obtener más información sobre las geometrías, vea Información general sobre geometrías.
Mapas de bits
Direct2D no proporciona métodos para cargar o almacenar mapas de bits; en su lugar, permite crear mapas de bits mediante el componente de creación de imágenes de Windows (WIC). Los recursos de mapa de bits se pueden cargar mediante WIC y, a continuación, se usan para crear un id2D1Bitmap a través del método ID2D1RenderTarget::CreateBitmapFromWicBitmap .
También se pueden crear mapas de bits a partir de datos en memoria configurados a través de otros medios. Una vez creado un mapa de bits, se puede dibujar mediante el método DrawBitmap de destino de representación o con un pincel de mapa de bits.
Dado que la creación de recursos de mapa de bits en destinos de representación de hardware suele ser una operación costosa, Direct2D puede actualizar el contenido de un mapa de bits (o parte del mapa de bits) mediante los métodos CopyFromBitmap, CopyFromRenderTarget y CopyFromMemory . El uso de estos métodos puede ahorrar potencialmente los costos asociados a asignaciones de texturas de GPU adicionales.
Texto de dibujo
Direct2D se diseñó para trabajar con las operaciones de texto de la nueva API de texto, DirectWrite. Para simplificar el uso de la API de DirectWrite, los destinos de representación proporcionan tres métodos para representar DirectWrite recursos de texto: DrawText, DrawTextLayout y DrawGlyphRun. Dado que Direct2D usa la GPU para el proceso de representación de texto ClearType, Direct2D proporciona un uso de CPU menor que GDI para las operaciones de texto y una mejor escalabilidad, ya que hay más potencia de procesamiento de GPU disponible.
Id2D1RenderTarget::D rawText está diseñado para los escenarios más sencillos que implican representar una cadena de texto Unicode con un formato mínimo. A través del método ID2D1RenderTarget::D rawTextLayout , que usa un objeto IDWriteTextLayout para especificar el contenido y el formato que se van a representar. IDWriteTextLayout permite especificar el formato individual para las subcadenas de texto y otras opciones avanzadas de tipografía.
En escenarios en los que se requiere un control preciso del diseño de nivel de glifo, el método ID2D1RenderTarget::D rawGlyphRun se puede usar junto con las instalaciones de medición proporcionadas por DirectWrite.
Para usar la API de DirectWrite, incluya el encabezado dwrite.h. Al igual que Direct2D, DirectWrite usa un generador, IDWriteFactory para crear objetos de texto. Use la función DWriteCreateFactory para crear un generador y, a continuación, use sus métodos Create para crear DirectWrite recursos (como IDWriteTextFormat).
Para obtener más información sobre DirectWrite, vea el tema Introducción DirectWrite.
Primitivos de Direct2D
Direct2D define un conjunto de primitivos que son similares a los proporcionados por otras API de dibujo. Proporciona una estructura de color, una estructura de matriz para realizar transformaciones y versiones de punto flotante e entero de puntos, rectángulos, puntos suspensivos y estructuras de tamaño. Normalmente, se usan las versiones de punto flotante de estas estructuras.
No se usa un generador ni un destino de representación para crear instancias de primitivos de Direct2D. Puede crearlos directamente o usar los métodos auxiliares definidos en d2d1helper.h para crearlos.
Temas relacionados