4

DirectWrite を使用するために、GDI および GDI+ を使用している既存の C++ コードのテキストからビットマップへのレンダリング ルーチンを変換する必要があります (CFF サポートと OTF 機能のサポートが必要です)。

DirectWrite は初めてです。既存の機能の移行に必要なものについての調査に時間を費やし、いくつかのプロトタイプを作成したところ、問題が発生しました。私の問題は、DirectWrite (すぐに使用できる) が文字間隔の調整をサポートしていないことです (これは、既存の機能の要件です)。アプリ)、少なくとも Windows 7 ではありません。Windows 8 に付属していることは知っていますが、残念ながら、この既存のアプリの別の要件は Windows 7 で実行することです。

これまでの調査でわかったことは、カスタム DirectWrite テキスト レイアウトを実装する方法のように見えるということですが、特に文字間隔に関して、これを行う方法に関する適切なガイドラインは見つかりませんでした (ドキュメント/例カスタム テキスト レイアウトの作成方法に関する MSDN は、私の好みでは少しあいまいです)。

ホイールの再発明に数日または数週間の研究開発を費やす前に、これは以前に行われたに違いないと思うので、最初に使用できるカスタム文字間隔を使用した DirectWrite テキストレイアウトのサンプル実装を知っている人はいますか?ポイントまたはチュートリアル?

UPDATE1 : 答えではありませんが、IDWriteTextLayout1 インターフェイス (文字スペースの設定をサポートする) は、Windows 8 だけでなく、Windows 7 の「Windows 7 Platform Update for SP1」(KB 2670838) にも付属していることがわかりました。私の質問には答えませんが、アプリを正しく実行するためにそれを要求することができます。これは私の問題を解決します。

4

1 に答える 1

2

カスタム レイアウトは、双方向と行の折り返し、および下位レベルの API を呼び出す必要があるため、かなり複雑ですが、サンプルはこちら [ https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711( v=vs.85).aspx] . 文字間隔については、整形プロセス (IDWriteTextAnalyzer::GetGlyphs) からグリフ アドバンスの配列を取得したら、すべてのアドバンスにデルタを追加するだけです。リンクされた SDK サンプルでは、​​行の折り返しと描画の前にループが発生するように、for内部にループを追加します。FlowLayout::ShapeGlyphRuns

STDMETHODIMP FlowLayout::ShapeGlyphRuns(IDWriteTextAnalyzer* textAnalyzer)
{
...
    hr = ShapeGlyphRun(textAnalyzer, runIndex, glyphStart);
...
    // Add additional character spacing to each trailing edge of each glyph.
    for (auto& advance : glyphAdvances_)
    {
        advance += 5.0f;
    }
...
}

API が Windows 8 にも追加されたことに注意してください。APIApplyCharacterSpacingは、クラスタごとに複数のグリフを持つより複雑なスクリプトを考慮するため、自分で手動で追加するよりも堅牢です (ただし、もちろん、その API がある場合は、既に も持っていますIDWriteTextLayout::SetCharacterSpacing)。

于 2015-07-02T08:48:03.373 に答える