1

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 スタイル ゲームの構築

4

1 に答える 1

3

そうですね、答えは... IDWriteFontCollectionLoaderを書かないでください! StorageFile API でIDWriteFactory::CreateFontFileReference()を使用できます。私が参加したすべてのマイクロソフト カンファレンスの講演から、Metro ではネイティブ ファイル システムに直接アクセスできないという印象を受けました。今後の方法は、ms-appx URL を使用してリソースなどを参照するStorageFile API を使用することです。これは同時実行性のためであり、ファイル システム サンドボックスを作成することでストアからダウンロードされる Metro アプリから OS を隔離できるようにするためであることがわかりました。それは正確だと思います。しかし、ネイティブのファイル システム パスを取得することは決してできないと信じ込まされたような気がします。それは真実ではありません。 IStorageFileは方法を提供します。IStorageFile.Pathを使用してください。オブジェクトの作成に使用した ms-appx URL がPathプロパティに保持されると想定しただ​​けなので、調べたことはありません。Microsoft はおそらく、上記の問題のまさにその目的のためにこれを提供しました: ネイティブ パスを必要とするレガシー COM インターフェイスの呼び出し。

独自のアプリ パッケージ外のネイティブ ファイル システム パスにアクセスしようとした場合に、WinRT フレームワークが実際にサンドボックス化するかどうかを判断するためのテストは行っていません。きっとそうだと思います...

于 2012-08-18T16:22:45.087 に答える