Поделиться через


Вертикальный текст

Начиная с Windows 8, DirectWrite имеет ряд новых API, которые позволяют использовать вертикальный текст в приложениях.

Рисование вертикального текста

Вы можете нарисовать вертикальный текст с помощью Direct2D с помощью методов DrawTextLayout. Чтобы нарисовать текст вертикально, передайте DWRITE_READING_DIRECTION_TOP_TO_BOTTOM методу IDWriteTextFormat::SetReadingDirection и DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT методу IDWriteTextFormatSetFlowDirection. Затем можно создать и нарисовать вертикальный объект IDWriteTextLayout.

Анализ ориентации символов

Каждый символ имеет предпочтительную ориентацию символа или направление, которое должен быть ориентирован на любой макет направления. Например, в традиционном горизонтальном макете как латиница, так и китайский текст ориентированы по вертикали. С другой стороны, в вертикальном макете китайский текст остается вертикальным, а латинский текст поворачивается на 90 градусов. Эта разница в ориентации показана в примере.

изображение английского и китайского текста в горизонтальных и вертикальных макетах.

Чтобы определить ориентацию текста, необходимо реализовать интерфейсы IDWriteTextAnalysisSink 1 и IDWriteTextAnalysisSource1. Источник и приемник выполняются в глифе и позволяют проверить, ориентированы ли они по вертикали или нет.

После реализации источника и приемника вызовите метод AnalyzeVerticalGlyphOrientation. В примере изображения эта функция возвращает 3 запуска: "английский", "中国" и "английский".

Переход от символов к глифам

Теперь, когда вы знаете, что выполнение содержит вертикальные глифы, необходимо получить доступ к этим глифам. В примере до сих пор существует 3 запуска: один с вертикальными глифами и двумя без. Чтобы перейти от символов к глифам, необходимо вызвать GetGlyphIndices. Этот метод возвращает соответствующие индексы глифов для символов в примере. Так как метод AnalyzeVerticalGlyphOrientation возвращает выполнение с вертикальными глифами, необходимо вызвать GetVerticalGlyphVariants, которая возвращает идентификаторы глифов по вертикали вместо идентификаторов глифов.

Рисование текста по вертикали

Наконец, необходимо выложить и нарисовать текст. Так как вы рисуете текст по вертикали, необходимо получить дополнительные сведения, чтобы текст латиница правильно рисовала. Если вы рисуете весь текст вдоль центрального базового плана, то латинский текст будет плавать в середине строки. Для правильного выравнивания текста требуется доступ как к центральному, так и к римскому базовым планам. Используйте метод IDWriteTextAnalyzer1::GetBaseline, чтобы получить числовые значения указанных базовых показателей. Можно вычитать римские базовые показатели из центрального базового плана, чтобы получить смещение между двумя.

Со всеми данными вы можете нарисовать текст на экране. Сначала вызовите метод GetGlyphOrientationTransform с результатами объектов IDWriteTextAnalysisSink1 и IDWriteTextAnalysisSource1.

Если вы используете Direct2D вам также необходимо задать преобразование мира в целевом объекте отрисовки Direct2D для вертикальной отрисовки.

Наконец, вызовите DrawGlyphRun три раза, один раз в каждом блоке текста. На двух блоках текста, которые находятся на английском языке, необходимо применить смещение, которое мы вычислили между римскими и центральными базовыми планами.

Теперь текст в приложении будет вырисован по вертикали с правильной ориентацией глифа.