垂直文本

从Windows 8开始,DirectWrite有许多新 API,可用于在应用中使用垂直文本。

绘制垂直文本

可以使用 DrawTextLayout 方法通过 Direct2D 绘制垂直文本。 若要垂直绘制文本, 请将DWRITE_READING_DIRECTION_TOP_TO_BOTTOM 传递给 IDWriteTextFormat::SetReadingDirection 方法, DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFTIDWriteTextFormatSetFlowDirection 方法。 然后,可以创建和绘制垂直 IDWriteTextLayout 对象。

分析字符方向

每个字符都有首选的字符方向,或者字符在任何方向布局中应面向的方向。 例如,在传统的水平布局中,拉丁文本和中文文本都是垂直方向的。 另一方面,在垂直布局中,中文文本保持直立,拉丁文文本旋转 90 度。 此示例中显示了方向上的这种差异。

水平和垂直布局中英文和中文文本的图像。

若要确定文本的方向,需要实现 IDWriteTextAnalysisSink1IDWriteTextAnalysisSource1 接口。 源和接收器采用字形运行,并允许你检查它们是否垂直方向。

实现源和接收器后,调用 AnalyzeVerticalGlyphOrientation 方法。 在示例图像中,此函数返回 3 次运行:“English”、“中国”和“English”。

从字符到字形

现在,你知道运行包含垂直字形,你需要访问这些字形。 在到目前为止的示例中,有 3 个运行:一个具有垂直字形,两个没有。 若要从字符转换为字形,请调用 GetGlyphIndices。 此方法返回示例中字符的相应字形索引。 由于 AnalyzeVerticalGlyphOrientation 方法返回具有垂直字形的运行,因此需要调用 GetVerticalGlyphVariants,这将返回垂直方向字形 ID 代替当前字形 ID。

垂直绘制文本

最后,需要对文本进行布局和绘制。 由于要垂直绘制文本,因此需要获取一些更多信息,以便正确绘制拉丁文文本。 如果沿中心基线绘制所有文本,拉丁文文本似乎在行中间浮动。 需要访问中央基线和罗马基线才能正确对齐文本。 使用 IDWriteTextAnalyzer1::GetBaseline 方法获取指定的基线的数值。 可以从中央基线中减去罗马基线,以获取两者之间的偏移量。

使用所有这些信息,可以在屏幕上绘制文本。 首先,使用 IDWriteTextAnalysisSink1 和 IDWriteTextAnalysisSource1 对象的结果调用 GetGlyphOrientationTransform 方法。

如果使用的是 Direct2D,还需要在 Direct2D 呈现目标上设置世界转换,以便进行垂直呈现。

最后,调用 DrawGlyphRun 三次,对每个文本块调用一次。 在英文文本的两个块上,需要应用我们在罗马基线和中央基线之间计算的偏移量。

现在,应用中的文本将以正确的字形方向垂直绘制。