DirectWrite で使用するために埋め込みファイルからフォントをロードすることに対して、私は負け戦を戦ってきました。C#/XAML インターフェイスを備え、SurfaceImageSource を使用して DirectX コンテンツを追加する単純なパズル ゲームを作成しています。
すべての DirectX コードを処理する WinRT コンポーネントを作成しましたが、非常にうまく機能します。私の DirectX コンテンツの一部は、DirectWrite API を使用して描画されたテキストです。IDWriteFactory::GetSystemFontCollection()などを使用してシステムからインストール済みのフォントをロードしている限り、好きなテキストをすべて描画できます。ただし、埋め込みファイルからカスタム フォントをロードする方法が見つからないようです。
私が知る限り、Metro アプリは従来のアプリと同じ方法でファイルシステムからファイルをロードすることは許可されていません。したがって、通常のファイル パスを使用するIDWriteFactory::CreateFontFileReference()メソッドは、私にとっては価値がありません。ms-appx URL からファイルを読み込む必要があります。
そこで、新しいStorageFile APIを使用して ms-appx URL からフォントを読み込むIDWriteFontCollectionLoaderインターフェイスを実装するカスタム フォント ローダーを WinRT コンポーネントに作成しました (これまでに行ったことがない場合は、これは大変な作業です) 。これで、 IDWriteFontFileをロードしてIDWriteFontFaceを取得できますが、フォント フェイスで本当に便利なメソッドを呼び出そうとすると、E_UNEXPECTEDが返されます。グリフの数とグリフ インデックスを取得できますが、GetGlyphRunOutline()やGetDesignGlyphMetrics( ) などを呼び出そうとすると、 E_UNEXPECTEDで失敗します。を生成するのと同じ描画コードを使用して、GetGlyphRunOutline ()を使用した ID2D1PathGeometryは、フォント ファイルをインストールし、IDWriteFactory::GetSystemFontCollection()で始まる一連の呼び出しを通じてIDWriteFontFaceを取得する限り、うまく機能します。通常の True Type フォントを使用しています。
では、カスタム フォントを埋め込みファイルから Metro アプリの DirectWrite に読み込むにはどうすればよいでしょうか。他の人がこの方法でカスタムフォントをロードできるようにしたいと思うので、おそらく簡単なものが欠けているだけです。
私の問題を特定するのを手伝ってくれる人のために、サンプル プロジェクトがあります (または簡単に準備できます)。
2 つのIDWriteFontFaceオブジェクトを並べて読み込んで、機能するオブジェクトと機能しないオブジェクトの違いを見つけようとしました。IDWriteFontFaceインターフェイス内に隠されているため、失敗の原因を突き止めるために確認する必要があることはわかりません。助けてください!
ここにも投稿された質問: DirectX フォーラムを使用した Metro スタイル ゲームの構築