Вертикальный текст
Начиная с Windows 8, в DirectWrite есть ряд новых API, которые позволяют использовать вертикальный текст в приложениях.
Рисование вертикального текста
Вертикальный текст можно рисовать с помощью Direct2D с помощью методов DrawTextLayout . Чтобы нарисовать текст по вертикали, передайте DWRITE_READING_DIRECTION_TOP_TO_BOTTOM в метод IDWriteTextFormat::SetReadingDirection , а DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT в метод IDWriteTextFormatSetFlowDirection . Затем можно создать и нарисовать вертикальный объект IDWriteTextLayout .
Анализ ориентации символов
Каждый символ имеет предпочтительную ориентацию символа или направление, в которое он должен ориентироваться в любом направленном макете. Например, в традиционном горизонтальном макете и латинский, и китайский текст ориентированы по вертикали. С другой стороны, в вертикальном макете китайский текст остается вертикально, а латинский текст поворачивается на 90 градусов. Эта разница в ориентации показана в примере здесь.
Чтобы определить ориентацию текста, необходимо реализовать интерфейсы IDWriteTextAnalysisSink1 и IDWriteTextAnalysisSource1 . Источник и приемник принимают запуски глифа и позволяют проверка, ориентированы ли они по вертикали.
После реализации источника и приемника вызывается метод AnalyzeVerticalGlyphOrientation . На изображении в примере эта функция возвращает 3 выполнения: "English", "中国" и "English".
Переход от символов к глифам
Теперь, когда вы знаете, что выполнение содержит вертикальные глифы, необходимо получить доступ к этим глифам. В этом примере есть 3 запуска: один с вертикальными глифами и два без. Чтобы перейти от символов к глифам, вызовите Метод GetGlyphIndices. Этот метод возвращает соответствующие индексы глифов для символов в примере. Так как метод AnalyzeVerticalGlyphOrientation возвращает выполнение с вертикальными глифами, необходимо вызвать Метод GetVerticalGlyphVariants, который возвращает идентификаторы глифов с вертикальной ориентацией вместо текущих идентификаторов глифов.
Рисование текста по вертикали
Наконец, необходимо выложить и нарисовать текст. Так как текст рисуется по вертикали, необходимо получить дополнительные сведения, чтобы текст на латинице был нарисован правильно. Если вы нарисуете весь текст вдоль центрального базового плана, текст на латинице будет отображаться посередине строки. Для правильного выравнивания текста требуется доступ к центральному и римскому базовым планам. Используйте метод IDWriteTextAnalyzer1::GetBaseline , чтобы получить числовые значения указанных базовых показателей. Чтобы получить смещение между ними, можно вычесть римский базовый план из центрального базового плана.
Используя все эти сведения, вы можете нарисовать текст на экране. Сначала вызовите метод GetGlyphOrientationTransform с результатами объектов IDWriteTextAnalysisSink1 и IDWriteTextAnalysisSource1 .
Если вы используете Direct2D , необходимо также задать преобразование мира в целевом объекте отрисовки Direct2D для вертикальной отрисовки.
Наконец, вызовите DrawGlyphRun три раза, один раз в каждом блоке текста. К двум блокам текста на английском языке необходимо применить смещение, вычисленное между римскими и центральными базовыми показателями.
Теперь текст в приложении будет нарисован по вертикали с правильной ориентацией глифа.