次の方法で共有


カスタム フォント コレクション (Windows 7/8)

DirectWrite は、IDWriteFactory::GetSystemFontCollection メソッドを使用して、システム フォント コレクションにアクセスできるようにします。 これは、最も頻繁に使用されるフォント コレクションです。 ただし、一部のアプリケーションでは、含まれているフォント ファイルやアプリケーションに埋め込まれたフォント ファイルなど、システムにインストールされていないフォントを使用する必要があります。

必要なフォントがシステム フォント コレクションにない場合は、IDWriteFontCollectionから派生したカスタム フォント コレクション作成できます。

この概要は、次の部分で構成されます。

フォント コレクション ローダーの登録と登録解除

フォント コレクション ローダーを登録するには、IDWriteFactory::RegisterFontCollectionLoader メソッドを使用し、アプリケーションによってシングルトン オブジェクトとして実装された IDWriteFontCollectionLoader インターフェイスを渡します。 このオブジェクトは、カスタム コレクションが要求されたときにフォントを読み込みます。 システム フォント コレクションとカスタム フォント コレクションの両方がキャッシュされるため、フォントは 1 回だけ読み込まれます。

フォント コレクション ローダーは、IDWriteFactory::UnregisterFontCollectionLoaderを使用して最終的にアンロードする必要があります。

手記

フォント コレクション ローダーを登録すると、参照カウントが追加されます。デストラクター内から UnregisterFontCollectionLoader呼び出さないか、コレクション ローダー オブジェクトが登録解除されることはありません。

 

IDWriteFontCollectionLoader

IDWriteFontFileEnumerator オブジェクトを作成するには、IDWriteFactory::CreateCustomFontCollection を使用し、アプリケーション定義キーを渡します。 キーは void ポインターであり、データ型、形式、意味はアプリケーションによって定義され、フォント システムに対して不透明です。

キーは何でもかまいませんが、DirectWrite では、各キーが両方である必要があります。

  • ローダーのスコープ内の 1 つのフォント コレクションに固有です。
  • ファクトリを使用してローダーが登録解除されるまで有効です。

CreateCustomFontCollection メソッドが呼び出されると、DirectWrite は、アプリケーションによってシングルトン オブジェクトとして実装された IDWriteFontCollectionLoader インターフェイスに戻ります。 IDWriteFontCollectionLoader::CreateEnumeratorFromKey コールバック メソッドは、DirectWrite によって使用され、アプリケーションによって実装された IDWriteFontFileEnumerator オブジェクトを取得します。 コレクションの作成に使用されている IDWriteFactory オブジェクトは、このメソッドに渡されます。フォント ファイル列挙子は、コレクションに含める IDWriteFontFile オブジェクトを作成するために使用する必要があります。

このメソッドに渡されるキーは、フォント コレクションを識別し、CreateCustomFontCollectionに渡されるのと同じキーです。

IDWriteFontFileEnumerator

CreateEnumeratorFromKey メソッドによって作成されたアプリケーション定義 IDWriteFontFileEnumerator オブジェクトは、コレクション内のフォント ファイルを列挙するために使用され、各ファイルの IDWriteFontFile オブジェクトが作成されます。 IDWriteFontFileEnumerator::MoveNext メソッドは、位置を次のフォント ファイルに変更します。 位置にファイルがある場合は、hasCurrentFile を TRUE に設定します。 それ以外の場合は、FALSE 設定され、メソッドは S_OKを返します。

手記

フォント ファイル列挙子は、最初の要素の前に配置され、MoveNextの最初の呼び出しで開始必要があります。

 

IDWriteFontFile オブジェクトは、IDWriteFontFileEnumerator::GetCurrentFontFile メソッドによって出力されます。 現在の位置にフォント ファイルがない場合、MoveNext がまだ呼び出されていないか、hasCurrentFile が FALSE に設定されているため、GetCurrentFontFile E_FAILを返します。

CreateCustomFontFileReference

GetCurrentFontFile によって出力される IDWriteFontFile オブジェクトは、IDWriteFactory::CreateCustomFontFileReferenceを呼び出すことによって作成できます。 フォント ファイル参照キーは、特定のフォント ファイル参照を識別し、ファイルを読み込むフォント ファイル ローダー内で一意である必要があります。

IDWriteFontFileLoader

CreateCustomFontFileReference メソッドは、フォントの読み込みに使用されるアプリケーションによって実装された IDWriteFontFileLoader オブジェクトを受け取ります。 IDWriteFontFileLoader::CreateStreamFromKey コールバック メソッドがキーを渡され、IDWriteFontFileStream オブジェクトが出力されます。

IDWriteFontFileStream

IDWriteFontFileStreamオブジェクトアプリケーションによって実装され、カスタム フォント ファイル ローダーからのフォント ファイル参照のフォント ファイル データが提供されます。 ファイル サイズと最後の書き込み時刻と共に、IDWriteFontFile オブジェクトにコンパイルされるファイル フラグメントを取得するためのメソッド (ReadFileFragment) を提供します。

手記

ReadFileFragment 実装は、要求されたフラグメントがファイルの境界外にある場合にエラーを返す必要があります。

 

IDWriteFontFileStream は、ローカル ハード ディスク ドライブや埋め込みリソースなど、どこからでもフォント ファイルの内容を取得できます。