5

CreateTextFormatのドキュメントには、フォント フォールバックの選択については何も記載されていませんが、デフォルト (NULL = システム) コレクションが選択されている場合、DirectWrite はフォント フォールバックを明確に実装します。たとえば、Gabriola フォントにない 2 つのグリフを DirectWrite SDK デモ アプリで使用するテスト文字列に追加すると、DirectWrite は Segoe UI シンボル フォントから不足しているグリフを選択します。これは、以下に示すように、基本的なDrawText呼び出しとカスタム レンダラー (フォント フォールバックのカスタムは何も行わない) で発生します (唯一の変更はテスト文字列です)。

ここに画像の説明を入力

デモ アプリでは Gabriola のみが指定されていますが、チェックマークと星形は Gabriola ではなく Segoe UI Symbol から取得されています。では、フォールバック フォントが DirectWrite (CreateTextFormat) によってどのように選択されているかを知っている人はいますか?

更新しますフォールバック フォントを一覧表示できるGetSystemFontFallbackがあるようですが、Windows 8.1 でのみ使用できます (IDWriteFactory2 にあるため)。フォールバック フォントの列挙に関する API のギャップに気付いたようです。したがって、Windows 8.1 より前にこれを行う方法はないと思いますが、誰かがハック/回避策を知っていれば...

Update2 . MSFTの従業員の引用:

DirectWrite には、レジストリから読み取られない、または構成可能な方法ではないフォールバック データがあります。ただし、Windows 8.1 では、アプリが独自のフォールバックを指定できるようにする API が導入されました。(これは、複合フォント定義を作成するための WPF API に似ています。)

ハードコードされたアルゴリズム/置換スキームが実際に何であるかをまだ正確に説明していません。

4

1 に答える 1

3

IDWriteTextLayoutIDWriteFontFallback::MapCharacters各 Unicode 文字を、その文字が満たされるまで試行されるフォント ファミリの順序付けられたリストにマップする呼び出し。各文字を 1 つずつ読み取り、コード ポイント値と言語タグを Unicode 範囲にマッピングし、cmap テーブル内の文字をサポートする最初のフォントで停止するループを考えてみてください。擬似コード:

for each ch in text
    if ch is a combining mark or other similar extending character
        if the previously selected font supports the combining mark too
            use the previously selected font
            continue
        endif
    endif
    find first mapping for ch within the Unicode range, which matches
        the current language and base font family too (if pertinent)
    if mapping found
        for each font in mapping (starting with first listed)
            if ch in font cmap
                use current font
            endif
        endfor
    else
        use base font and undefined (.notdef) glyph
    endif
endfor

フォールバック ロケールを決定するロジックもあります ( for zh-Hans/Hantまたはjaより具体的な一般的な一致などja-jp)。これは、ブラウザ用の CSS で指定されたフォント フォールバック アルゴリズム [http://www.w3.org/TR/css3-fonts/#font-matching-algorithm] にいくらか似ています (ただし、それほど複雑ではありません)。 WPF/XAML/Silverlight による。

使用される入力のアイデアについては、カスタムフォールバック リストIDWriteFontFallbackBuilder::AddMappingの作成に使用される API (Win 8.1+)を参照してください。

データの例については、C:\Windows\Fonts\GlobalUserInterface.CompositeFont を参照してください (このファイルは実際には WPF 用であり、DWrite が使用する定義とまったく同じではないことに注意してください)。

<FontFamilyMap
    Unicode  = "3000-30FF, 31F0-31FF"
    Language = "ja"
    Target   = "Meiryo UI, Meiryo, Microsoft YaHei UI, Microsoft YaHei, MS Gothic, MingLiu, Arial Unicode MS"
    Scale    = "1.0" />
于 2015-07-02T09:11:33.043 に答える