カスタム フォント コレクション (Windows 7/8)
DirectWrite は、IDWriteFactory::GetSystemFontCollection メソッドを使用して、システム フォント コレクションにアクセスできるようにします。 これは、最も頻繁に使用されるフォント コレクションです。 ただし、一部のアプリケーションでは、含まれているフォント ファイルやアプリケーションに埋め込まれたフォント ファイルなど、システムにインストールされていないフォントを使用する必要があります。
必要なフォントがシステム フォント コレクションにない場合は、IDWriteFontCollectionから派生したカスタム フォント コレクション作成できます。
この概要は、次の部分で構成されます。
- フォント コレクション ローダー の登録と登録解除
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator の
- CreateCustomFontFileReference の
- IDWriteFontFileLoader
- IDWriteFontFileStream の
フォント コレクション ローダーの登録と登録解除
フォント コレクション ローダーを登録するには、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 は、ローカル ハード ディスク ドライブや埋め込みリソースなど、どこからでもフォント ファイルの内容を取得できます。