Compartilhar via


Texto Vertical

A partir do Windows 8, DirectWrite tem uma série de novas APIs que permitem que você use texto vertical em seus aplicativos.

Desenho de texto vertical

Você pode desenhar texto vertical com Direct2D usando os métodos DrawTextLayout. Para desenhar o texto verticalmente, passe DWRITE_READING_DIRECTION_TOP_TO_BOTTOM para o método IDWriteTextFormat::SetReadingDirection e DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT para o método IDWriteTextFormatSetFlowDirection . Em seguida, você pode criar e desenhar um objeto IDWriteTextLayout vertical.

Analisando a orientação de caracteres

Cada caractere tem uma orientação de caractere preferencial ou a direção em que o caractere deve ser orientado em qualquer layout direcional. Por exemplo, no layout horizontal tradicional, o texto latino e o texto chinês são orientados verticalmente. Por outro lado, em um layout vertical, o texto chinês permanece ereto e o texto latino é girado 90 graus. Essa diferença na orientação é vista no exemplo aqui.

uma imagem de texto em inglês e chinês em layouts horizontais e verticais.

Para determinar a orientação do texto que você tem, você precisa implementar as interfaces IDWriteTextAnalysisSink1 e IDWriteTextAnalysisSource1 . A origem e o coletor assumem as execuções de glifo e permitem que você marcar se eles são orientados verticalmente ou não.

Depois de implementar a origem e o coletor, você chama o método AnalyzeVerticalGlyphOrientation . Na imagem de exemplo, essa função retorna 3 execuções: "English", "中国" e "English".

Indo de caracteres para glifos

Agora que você sabe que a execução contém glifos verticais, você precisa obter acesso a esses glifos. No exemplo até agora, há três execuções: uma com glifos verticais e duas sem. Para fazer a transição de caracteres para glifos, chame GetGlyphIndices. Esse método retorna os índices de glifo correspondentes para os caracteres no exemplo. Como o método AnalyzeVerticalGlyphOrientation retorna uma execução com glifos verticais, você precisa chamar GetVerticalGlyphVariants, que retorna as IDs de glifo orientadas verticalmente no lugar das IDs de glifo atuais.

Desenhando texto verticalmente

Por fim, você precisa dispor e desenhar o texto. Como você está desenhando o texto verticalmente, é necessário obter mais informações para que o texto latino seja desenhado corretamente. Se você desenhar todo o texto ao longo da linha de base central, o texto latino aparecerá flutuando no meio da linha. Você precisa de acesso à linha de base central e romana para alinhar o texto corretamente. Use o método IDWriteTextAnalyzer1::GetBaseline para obter os valores numéricos das linhas de base especificadas. Você pode subtrair a linha de base romana da linha de base central para obter o deslocamento entre os dois.

Com todas essas informações, você pode desenhar o texto na tela. Primeiro, chame o método GetGlyphOrientationTransform com os resultados dos objetos IDWriteTextAnalysisSink1 e IDWriteTextAnalysisSource1 .

Se você estiver usando Direct2D também precisará definir a transformação do mundo no destino de renderização Direct2D para renderização vertical.

Por fim, chame DrawGlyphRun três vezes, uma vez em cada bloco de texto. Nos dois blocos de texto que estão em inglês, você precisa aplicar o deslocamento que calculamos entre as linhas de base romanas e centrais.

Agora, o texto em seu aplicativo será desenhado verticalmente, com a orientação de glifo correta.