Share via


縦書きテキスト

Windows 8以降、DirectWriteには、アプリで縦書きテキストを使用できる新しい API が多数用意されています。

縦書きテキストの描画

Direct2D で垂直テキストを描画するには、 DrawTextLayout メソッドを使用します。 テキストを垂直方向に描画するには、DWRITE_READING_DIRECTION_TOP_TO_BOTTOMを IDWriteTextFormat::SetReadingDirection メソッドに渡し、IDWriteTextFormatSetFlowDirection メソッドにDWRITE_FLOW_DIRECTION_RIGHT_TO_LEFTします。 その後、垂直 IDWriteTextLayout オブジェクトを作成して描画できます。

文字の向きの分析

すべての文字には、優先される文字の向き、または任意の方向レイアウトで文字の方向を指定する必要があります。 たとえば、従来の水平レイアウトでは、ラテン文字と中国語テキストの両方が垂直方向に向きます。 一方、垂直レイアウトでは、中国語のテキストは直立したままで、ラテン文字は 90 度回転します。 この向きの違いは、ここでの例に示されています。

水平方向と垂直方向のレイアウトの英語と中国語のテキストの画像。

テキストの向きを決定するには、 IDWriteTextAnalysisSink1 インターフェイスと IDWriteTextAnalysisSource1 インターフェイスを実装する必要があります。 ソースとシンクはグリフの実行を受け取り、垂直方向に向いているかどうかをチェックできます。

ソースとシンクを実装したら、 AnalyzeVerticalGlyphOrientation メソッドを呼び出します。 この例の画像では、この関数は 3 つの実行を返します。"English"、"中国"、"English" です。

文字からグリフに移動する

実行に垂直グリフが含まれていることがわかったら、それらのグリフにアクセスする必要があります。 これまでの例では、3 つの実行があります。1 つは垂直グリフを持ち、2 つはなしです。 文字からグリフに移行するには、 GetGlyphIndices を呼び出します。 このメソッドは、例の文字に対応するグリフ インデックスを返します。 AnalyzeVerticalGlyphOrientation メソッドは垂直グリフを含む実行を返すので、GetVerticalGlyphVariants を呼び出す必要があります。このメソッドは、現在のグリフ ID の代わりに垂直方向のグリフ ID を返します。

テキストを垂直方向に描画する

最後に、テキストをレイアウトして描画する必要があります。 テキストを垂直方向に描画するため、ラテン文字が正しく描画されるように、さらに情報を取得する必要があります。 中央の基準線に沿ってすべてのテキストを描画すると、行の中央にラテン文字が浮動しているように見えます。 テキストを正しく配置するには、中央とローマの両方のベースラインにアクセスする必要があります。 IDWriteTextAnalyzer1::GetBaseline メソッドを使用して、指定したベースラインの数値を取得します。 中央ベースラインからローマのベースラインを減算して、2 つの間のオフセットを取得できます。

この情報をすべて使用して、画面上にテキストを描画できます。 まず、IDWriteTextAnalysisSink1 オブジェクトと IDWriteTextAnalysisSource1 オブジェクトの結果を使用して GetGlyphOrientationTransform メソッドを呼び出します。

Direct2D を使用している場合は、垂直方向のレンダリング用に Direct2D レンダー ターゲットにワールド変換を設定する必要もあります。

最後に、テキストのブロックごとに 1 回、 DrawGlyphRun を 3 回呼び出します。 英語の 2 つのテキスト ブロックでは、ローマと中央のベースラインの間で計算したオフセットを適用する必要があります。

これで、アプリ内のテキストが垂直方向に描画され、グリフの向きが正しくなりました。