Visão geral da API do Direct2D
O Direct2D fornece uma API, semelhante ao Direct3D, para uso com C ou C++. A API expõe uma variedade de funcionalidades relacionadas ao desenho:
- Renderize destinos para exibição e renderização fora da tela usando Direct2D, Direct3D ou GDI.
- Objetos para gerenciar o estado de desenho, como transformações de espaço de coordenadas e modos de suavização.
- Representações para dados geométricos e funções para processamento de geometria.
- Funcionalidade de renderização para bitmaps, geometrias e texto.
- Provisionamentos para usar conteúdo gráfico criado usando GDI ou Direct3D.
Este tópico fornece uma visão geral dos objetos que compõem a API do Direct2D. Ele contém as seções a seguir:
- Arquivos de cabeçalho Direct2D
- Direct2D Interfaces
- A interface ID2D1Factory
- Renderizar destinos
- Recursos de desenho
- Texto de Desenho
- Primitivos Direct2D
- Tópicos relacionados
Arquivos de cabeçalho Direct2D
A API do Direct2D é definida pelos arquivos de cabeçalho a seguir.
Arquivo de cabeçalho | Descrição |
---|---|
d2d1.h | Define as versões C e C++ da API direct2D primária. |
d2d1helper.h | Define funções auxiliares, classes e estruturas do C++. |
d2dbasetypes.h | Define primitivos de desenho para Direct2D, como pontos e retângulos. Esse cabeçalho está incluído em d2d1.h. |
d2derr.h | Define os códigos de erro para Direct2D. Esse cabeçalho está incluído em d2d1.h. |
d2d1_1.h | Define as versões C e C++ da API direct2D primária para Windows 8 e posterior. |
d2d1_1helper.h | Define funções auxiliares, classes e estruturas do C++ para Windows 8 e posterior. |
d2d1effects.h | Define as versões C e C++ da parte de efeitos de imagem da API direct2D para Windows 8 e posterior. |
d2d1effecthelpers.h | Define funções auxiliares, classes e estruturas do C++ da parte de efeitos de imagem da API direct2D para Windows 8 e posterior. |
Para usar o Direct2D, seu aplicativo deve incluir o arquivo de cabeçalho d2d1.h.
Para compilar um aplicativo Direct2D, adicione d2d1.lib à lista de bibliotecas. Você pode encontrar d2d1.h e d2d1.lib no SDK (Software Development Kit) do Windows para Windows 7.
As seções a seguir descrevem algumas das interfaces comuns fornecidas pela API do Direct2D.
Direct2D Interfaces
Na raiz da API direct2D estão as interfaces ID2D1Factory e ID2D1Resource . Um objeto ID2D1Factory cria objetos ID2D1Resource e serve como ponto de partida para usar o Direct2D. Todos os outros objetos Direct2D herdam da interface ID2D1Resource . Há dois tipos de recursos Direct2D: recursos independentes do dispositivo e recursos dependentes do dispositivo.
- Os recursos independentes do dispositivo não estão associados a um dispositivo de renderização específico e podem persistir durante a vida útil de um aplicativo.
- Os recursos dependentes do dispositivo são associados a um dispositivo de renderização específico e deixam de funcionar se esse dispositivo for removido.
(Para obter mais informações sobre recursos e compartilhamento de recursos, consulte a Visão geral de recursos.)
A interface ID2D1Factory
A interface ID2D1Factory é o ponto de partida para usar o Direct2D. Você usa um ID2D1Factory para instanciar recursos do Direct2D. Para criar um ID2D1Factory, use um dos métodos CreateFactory .
Uma fábrica define um conjunto de métodos CreateResource que podem produzir os seguintes recursos de desenho:
- Destinos de renderização são objetos que renderizam comandos de desenho.
- Blocos de estado de desenho são objetos que armazenam informações de estado de desenho, como a transformação atual e o modo de suavização.
- Geometrias são objetos que representam formas simples e potencialmente complexas.
Um dos objetos mais úteis que uma fábrica pode criar é o ID2D1RenderTarget, descrito na seção a seguir.
Renderizar destinos
Um destino de renderização é um recurso que herda da interface ID2D1RenderTarget . Um destino de renderização cria recursos para desenho e executa operações de desenho. Há vários tipos de destinos de renderização que podem ser usados para renderizar gráficos das seguintes maneiras:
- Objetos ID2D1HwndRenderTarget renderizam o conteúdo em uma janela.
- Objetos ID2D1DCRenderTarget são renderizados em um contexto de dispositivo GDI.
- Os objetos de destino de renderização de bitmap renderizam o conteúdo em um bitmap fora da tela.
- Os objetos de destino de renderização DXGI são renderizados em uma superfície DXGI para uso com Direct3D.
Como um destino de renderização está associado a um dispositivo de renderização específico, ele é um recurso dependente do dispositivo e deixa de funcionar se o dispositivo for removido.
Recursos de destino de renderização
Você pode especificar se um destino de renderização deve usar aceleração de hardware e se a exibição remota deve ser renderizada pelo computador local ou remoto. Os destinos de renderização podem ser configurados para renderização com alias ou suavizada. Para renderizar cenas com um grande número de primitivos, um desenvolvedor também pode renderizar elementos gráficos 2D no modo alias e usar a suavização de várias camadas D3D para obter maior escalabilidade.
Os destinos de renderização também podem agrupar operações de desenho em camadas representadas pela interface ID2D1Layer . As camadas são úteis para coletar operações de desenho a serem compostas juntas ao renderizar um quadro. Para alguns cenários, essa pode ser uma alternativa útil para renderizar para um destino de renderização de bitmap e, em seguida, reutilizar o conteúdo de bitmap, pois os custos de alocação para camadas são menores do que para um ID2D1BitmapRenderTarget.
Os destinos de renderização podem criar novos destinos de renderização compatíveis com eles mesmos, o que é útil para renderização fora da tela intermediária, mantendo as várias propriedades de destino de renderização que foram definidas no original.
Também é possível renderizar usando GDI em um destino de renderização Direct2D chamando QueryInterface em um destino de renderização para ID2D1GdiInteropRenderTarget, que tem métodos GetDC e ReleaseDC que podem ser usados para recuperar um contexto de dispositivo GDI. A renderização via GDI só será possível se o destino de renderização tiver sido criado com o sinalizador D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE definido. Isso é útil para aplicativos que renderizam principalmente com Direct2D, mas têm um modelo de extensibilidade ou outro conteúdo herdado que requer a capacidade de renderização com GDI. Para obter mais informações, consulte Visão geral da interoperabilidade do Direct2D e do GDI.
Renderizar recursos de destino
Como uma fábrica, um destino de renderização pode criar recursos de desenho. Todos os recursos criados por um destino de renderização são recursos dependentes do dispositivo (assim como o destino de renderização). Um destino de renderização pode criar os seguintes tipos de recursos:
- Bitmaps
- Pincéis
- Camadas
- Malhas
Comandos de desenho
Para renderizar o conteúdo, use os métodos de desenho de destino de renderização. Antes de começar a desenhar, você chama o método ID2D1RenderTarget::BeginDraw . Depois de concluir o desenho, você chama o método ID2D1RenderTarget::EndDraw . Entre essas chamadas, você usa os métodos Desenhar e Preencher para renderizar recursos de desenho. A maioria dos métodos Draw e Fill toma uma forma (um primitivo ou uma geometria) e um pincel para preencher ou delinear a forma.
Os destinos de renderização também fornecem métodos para recorte, aplicação de máscaras de opacidade e transformação do espaço de coordenadas.
O Direct2D usa um sistema de coordenadas canhoto: os valores positivos do eixo x prossseguem para a direita e os valores positivos do eixo y prossseguem para baixo.
Tratamento de erros
Os comandos de desenho de destino de renderização não indicam se a operação solicitada foi bem-sucedida. Para descobrir se houve erros de desenho, chame o método Flush de destino de renderização ou o método EndDraw para obter um HRESULT.
Recursos de desenho
As seções a seguir descrevem alguns dos recursos que podem ser criados pelas interfaces de destino e de fábrica de renderização.
Pincéis
Um pincel, representado pela interface ID2D1Brush , é um recurso dependente do dispositivo, criado por um destino de renderização, que pinta uma área com sua saída. Pincéis diferentes têm tipos diferentes de saída. Alguns pincéis pintam uma área com uma cor sólida, outros com um gradiente ou uma imagem. O Direct2D fornece quatro tipos de pincéis:
- ID2D1SolidColorBrush pinta uma área com uma cor sólida.
- ID2D1LinearGradientBrush pinta uma área com um gradiente linear que mescla duas ou mais cores em uma linha, o eixo do gradiente.
- ID2D1RadialGradientBrush pinta uma área com um gradiente radial que mescla duas ou mais cores em torno de uma elipse.
- ID2D1BitmapBrush pinta uma área com um bitmap.
Para criar um pincel, use um dos métodos ID2D1RenderTarget::Create*<Type>*Brush, como CreateRadialGradientBrush. Pincéis podem ser usados com um destino de renderização métodos Draw e Fill, seja para pintar um traço de forma ou contorno, ou como uma máscara de opacidade.
Para obter mais informações sobre pincéis, consulte a Visão geral dos pincéis.
Geometrias
Além dos primitivos básicos de desenho, como pontos, retângulos e reticências, o Direct2D fornece a interface ID2D1Geometry para descrever formas simples e complexas. Interfaces herdadas de ID2D1Geometry definem diferentes tipos de formas, como ID2D1RectangleGeometry para representar retângulos, ID2D1RoundedRectangleGeometry para representar retângulos arredondados e ID2D1EllipseGeometry para representar reticências.
Formas mais complexas podem ser criadas usando a interface ID2D1GeometrySink para especificar uma série de figuras compostas por linhas, curvas e arcos. O ID2D1GeometrySink é passado para o método Open de um ID2D1PathGeometry para gerar uma geometria complexa. ID2D1SimplifiedGeometrySink também pode ser usado com a API DirectWrite para extrair contornos de caminho de texto formatado para renderização artística.
As interfaces de geometria fornecem métodos para manipular formas ampliando ou simplificando geometrias existentes ou gerando a interseção ou união de várias geometrias. Eles também fornecem métodos para determinar se as geometrias estão se cruzando ou se sobrepondo, recuperando informações de limites, computando a área ou o comprimento de uma geometria e interpolando locais ao longo de uma geometria. O Direct2D também fornece a capacidade de criar uma malha de triângulos que é mosaico de uma geometria.
Para criar uma geometria, use um dos métodos ID2D1Factory::Create*<Type>*Geometry, como CreatePathGeometry. Uma geometria é um recurso independente do dispositivo.
Para renderizar uma geometria, use os métodos DrawGeometry e FillGeometry de um destino de renderização.
Para obter mais informações sobre geometrias, consulte a Visão geral de geometrias.
Bitmaps
O Direct2D não fornece métodos para carregar ou armazenar bitmaps; em vez disso, ele permite que você crie bitmaps usando o COMPONENTE de Imagem do Windows (WIC). Os recursos de bitmap podem ser carregados usando WIC e, em seguida, usados para criar um ID2D1Bitmap por meio do método ID2D1RenderTarget::CreateBitmapFromWicBitmap .
Bitmaps também podem ser criados com base em dados na memória que foram configurados por outros meios. Depois que um bitmap for criado, ele poderá ser desenhado pelo método DrawBitmap de destino de renderização ou com um pincel de bitmap.
Como a criação de recursos de bitmap em destinos de renderização de hardware geralmente é uma operação cara, o Direct2D pode atualizar o conteúdo de um bitmap (ou parte do bitmap) usando os métodos CopyFromBitmap, CopyFromRenderTarget e CopyFromMemory . O uso desses métodos pode potencialmente economizar os custos associados a alocações adicionais de textura de GPU.
Desenho de texto
O Direct2D foi projetado para trabalhar com as operações de texto da nova API de texto, DirectWrite. Para tornar o uso da API DirectWrite mais simples, os destinos de renderização fornecem três métodos para renderizar DirectWrite recursos de texto: DrawText, DrawTextLayout e DrawGlyphRun. Como o Direct2D usa a GPU para o processo de renderização de texto ClearType, o Direct2D fornece menor uso de CPU do que o GDI para operações de texto e melhor escalabilidade à medida que mais energia de processamento de GPU está disponível.
O ID2D1RenderTarget::D rawText foi projetado para os cenários mais simples que envolvem a renderização de uma cadeia de caracteres de texto Unicode com formatação mínima. O layout mais complexo e a flexibilidade tipográfica são fornecidos por meio do método ID2D1RenderTarget::D rawTextLayout , que usa um objeto IDWriteTextLayout para especificar o conteúdo e a formatação a serem renderizados. IDWriteTextLayout permite que você especifique a formatação individual para subcadeias de texto e outras opções avançadas de tipografia.
Para cenários em que o controle preciso do layout de nível de glifo é necessário, o método ID2D1RenderTarget::D rawGlyphRun pode ser usado em conjunto com as instalações de medição fornecidas pelo DirectWrite.
Para usar a API DirectWrite, inclua o cabeçalho dwrite.h. Assim como o Direct2D, DirectWrite usa uma fábrica, IDWriteFactory para criar objetos de texto. Use a função DWriteCreateFactory para criar uma fábrica e, em seguida, use seus métodos Create para criar recursos DirectWrite (como IDWriteTextFormat).
Para obter mais informações sobre DirectWrite, consulte o tópico Introdução DirectWrite.
Primitivos Direct2D
O Direct2D define um conjunto de primitivos semelhantes aos fornecidos por outras APIs de desenho. Ele fornece uma estrutura de cores, uma estrutura de matriz para executar transformações e versões de ponto flutuante e inteiro de pontos, retângulos, reticências e estruturas de tamanho. Normalmente, você usa as versões de ponto flutuante dessas estruturas.
Você não usa uma fábrica ou um destino de renderização para instanciar primitivos Direct2D. Você pode criá-los diretamente ou usar os métodos auxiliares definidos em d2d1helper.h para criá-los.
Tópicos relacionados