両端揃え、カーニング、および間隔

Windows 8以降、DirectWriteには、文字間、ペア カーニング、両端揃えなど、基本的な文字体裁、レイアウト、間隔の機能を制御できるさまざまな機能が用意されています。

文字間隔

文字間隔 ("追跡" とも呼ばれます) は、テキストの実行内の文字間の間隔です。

追跡の例を次に示します。 最初の行は、テキストに追跡を適用しません。 2 行目は文字間隔を増やし、3 行目は文字間隔を小さくします。

同じテキストの 3 つの例(トラッキングなし、間隔が多く、間隔が小さい)。

Windows 8以降では、DirectWriteこれらのメソッドをここに追加して、テキスト内の文字の間隔を制御します。

DirectWrite レイアウトを使用している場合は、この目的のために IDWriteTextLayout1::GetCharacterSpacing メソッドと IDWriteTextLayout1::SetCharacterSpacing メソッドを使用できます。

GetCharacterSpacing メソッドを使用して、現在の文字間隔を調べて、現在の文字、文字の前後の間隔、最小の進み幅、残りのテキストの開始位置と長さに関する情報を含むDWRITE_TEXT_RANGE構造体を返します。

レイアウト内のテキストに独自の文字間隔を適用するには、DWriteTextLayout1 インターフェイスで SetCharacterSpacing を使用します。 SetCharacterSpacing メソッドは、文字の前後に必要な領域の量、許容される最小の事前指定、および間隔を適用する範囲を定義するDWRITE_TEXT_RANGEを受け取ります。

カスタム レイアウトを使用している場合、DirectWriteでは IDWriteTextAnalyzer1::ApplyCharacterSpacing で文字間隔を設定できます。 レイアウトを高度に制御するためにカスタム テキスト レイアウトが必要な場合は、このメソッドを使用します。 このメソッドを使用すると、 ApplyCharacterSpacing に、前と後の間隔、最小の前の幅、クラスター マップの長さ、グリフの数、文字範囲からグリフへのマッピング、およびカスタム レイアウトを使用する場合は各グリフの前の幅を指定できます。 メソッドは、変更されたグリフの前進と、各グリフの原点への新しいオフセットを持つ DWRITE_GLYPH_OFFSET 列挙体を返します。

カーニング

カーニングは、文字のペアまたはトリプレット間のコンテキスト間隔調整です。 文字セット間の間隔を指定すると、読みやすさが向上し、テキストの見た目が良くなる可能性があります。 カーニングと文字間隔の重要な違いは、文字の間隔が文字スペースに依存しないという事実です。一方、カーニングは、フォントで定義されている特定の文字のペア間の特定の状況で使用されます。

彼女の画像はカーニングの例です。 単語をより自然に見せるために、一番上の行の単語 AVATAR がカーニングされます。 文字の周りの赤いボックスからわかるように、最初の 4 文字の間にはより多くの間隔が適用され、末尾の R の前にはより多くのスペースがあります。 カーニングのない元のテキストは 2 行目にあります。 この例のカーニングを使用すると、単語の読みやすくなり、自然になります。

カーニングが適用されている、または適用されていない同じ単語の例。

文字は、カーニング テーブルにフォント カーンが格納されている文字のペア間を進め、DirectWriteはそのテーブルを解析し、カーニング API を介して情報を返します。

フォントがペア カーニングをサポートしているかどうかを知りたい場合は、 IDWriteFontFace1::HasKerningPairs メソッドを使用できます。 フォントでカーニング ペアがサポートされている場合、このメソッドは bool 値 1 を返します。

IDWriteFontFace1 には、グリフ インデックスのカーニング ペア調整にアクセスできるメソッドもあります。 GetKerningPairAdjustments を使用すると、グリフ インデックスの配列を入力し、グリフの事前調整の配列を返DirectWrite。 フォントで kern テーブルがサポートされていない場合、 メソッドはグリフの事前調整に対してゼロを返します。

DirectWrite レイアウトを使用している場合は、IDWriteTextLayout1 インターフェイスに 2 つのメソッドがあり、ペア カーニングを設定し、レイアウトでのペア カーニングの詳細を確認できます。 SetPairKerning メソッドは、ペア カーニングを有効にするかどうかを示すブール表現と、適用するテキストの範囲を定義するDWRITE_TEXT_RANGEを受け取ります。 テキスト範囲でペア カーニングが有効になっているかどうかを確認する場合は、 GetPairKerning メソッドを使用できます。このメソッドは現在の位置を受け取り、ペアカーニングが有効になっているかどうか、およびカーニング設定が適用されるテキスト範囲に対応するブール値を返します。

妥当性

両端揃えとは、文字またはグリフ クラスター間の進みを増やしたり、同じ効果を得るために両端揃え文字を追加したりして、列内のすべてのスペースを埋めるようにテキストを配置するプロセスです。 一般に、これは、テキスト行にスペースを追加する必要がある場所を決定し、それらの破壊的機会にスペース文字を挿入することによって実現されます。 これらのスペース要素も異なる場合があります。ラテン語スクリプトでは、要素間の事前幅を大きくすることでテキストが両端揃えされ、アラビア語ではテキストがカシダで両端揃えされます。 次に示すのは、両端揃えと両端揃えではなく、アラビア語とラテン語の両方のスクリプトの例です。

アラビア語とラテン語のスクリプトの例は、両端揃えと両端揃えではありません。

Windows 8以降、DirectWriteには、アプリ内のテキストを正当化できるメソッドが多数用意されています。

DWRITE_TEXT_ALIGNMENT列挙には追加の値があります。 SetTextAlignment メソッドを使用して、DWRITE_TEXT_ALIGNMENT_JUSTIFIED定数を渡し、テキストを正当化DirectWriteし、スクリプトに適切な配置文字を挿入できます。

カスタム レイアウトを使用している場合は、理由を利用できるように、いくつかのメソッドを使用できます。 DirectWriteIDWriteTextAnalyzer1 インターフェイスには、カスタム レイアウトに理由を追加するために使用できる 3 つのメソッドがあります。

最初のメソッドは GetJustificationOpportunities です。これは、両端揃えするテキストを受け取り、テキストを両端揃えするために両端揃え文字を追加できるアウトラインを示す DWRITE_JUSTIFICATION_OPPORTUNITY 構造体を返します。

2 つ目の関数は JustifyGlyphAdvances で、行幅に合わせてグリフの配列が進むのを正当化します。 このメソッドは、GetJustificationOpportunities によって生成されるDWRITE_JUSTIFICATION_OPPORTUNITY構造体、グリフの前進、およびグリフ オフセットを受け取ります。 次に、両端揃えグリフの前進と、両端揃えグリフオフセットを含む DWRITE_GLYPH_OFFSET 列挙を生成します。

3 つ目の関数は GetJustifiedGlyphs です。これは、理由によってグリフの進歩が増加した複雑なスクリプトの新しいグリフを埋めます。 GetJustifiedGlyphs は、 スクリプトに GetScriptProperties によって返される特定の理由文字がある場合にのみ呼び出す必要があります。 このメソッドは、フォント、テキストの長さ、グリフの em サイズ、テキストのスクリプト、グリフの数、クラスター マップ、元のグリフの進み/オフセット、両端揃えグリフの進み/オフセット、グリフのプロパティに関する情報を取り込みます。 メソッドは、実際のグリフ数、更新されたクラスター マップ、挿入された揃えグリフを含む更新されたグリフ インデックス、更新されたグリフ オフセット、更新されたグリフの進歩を返します。