IDWriteFontFileStream
COM公式ドキュメント
カスタムフォントファイルローダーからフォントファイルデータを読み込みます。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
フォントファイルからフラグメントを読み取ります。
| fragmentStart | void** | out | このメソッドが返るとき、フォントファイルフラグメントの先頭を指すポインターのアドレスが格納されます。このパラメーターは初期化されていない状態で渡されます。 |
| fileOffset | ULONGLONG | in | フォントファイルの先頭からのフラグメントのオフセット(バイト単位)。 |
| fragmentSize | ULONGLONG | in | ファイルフラグメントのサイズ(バイト単位)。 |
| fragmentContext | void** | out | このメソッドが返るとき、ReleaseFileFragment に渡されるクライアント定義のコンテキストへのポインターを指すポインターのアドレスが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ReadFileFragment の実装では、要求されたフォントファイルフラグメントがファイルの範囲内にあるかどうかを確認する必要があることに注意してください。範囲内にない場合は、ReadFileFragment からエラーを返す必要があります。
DirectWrite は、IDWriteFontFileStream のメソッドを、複数のスレッドから同一オブジェクトに対して同時に呼び出す場合があります。そのため、内部の可変状態に依存する ReadFileFragment の実装では、複数のスレッド間でその状態へのアクセスを直列化する必要があります。たとえば、Seek と Read の各操作を分けてファイルフラグメントを読み取る実装では、Seek と Read の呼び出しを含むコードブロックをロックまたはクリティカルセクションの下に置く必要があります。
ファイルからフラグメントを解放します。
| fragmentContext | void* | inout | ReadFileFragment から返されたフォントフラグメントのクライアント定義コンテキストへのポインター。 |
ファイルの合計サイズを取得します。
| fileSize | ULONGLONG* | out | このメソッドが返るとき、ファイルの合計サイズが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
非同期に読み込まれるフォントファイルに対して GetFileSize() を実装する場合、ファイルの全内容をダウンロードする必要が生じることがあります。そのため、このメソッドは、フォントファイル全体の読み込みを必要とする操作(たとえばフォントファイルのコピー)や、ファイルサイズの値に基づいて判断を行う必要がある操作(たとえば保存されたファイルサイズとの検証)にのみ使用してください。
ファイルの最終更新日時を取得します。
| lastWriteTime | ULONGLONG* | out | このメソッドが返るとき、1601 年 1 月 1 日(UTC)からの 100 ナノ秒間隔の数を表す形式で、ファイルの最終更新日時が格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
「最終更新日時」は、DirectWrite のフォント選択アルゴリズムによって、あるフォントリソースが別のフォントリソースよりも新しいかどうかを判断するために使用されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDWriteFontFileStream "{6D4865FE-0AB8-4D91-8F62-5DD6BE34A3E0}" #usecom global IDWriteFontFileStream IID_IDWriteFontFileStream "{}" #comfunc global IDWriteFontFileStream_ReadFileFragment 3 sptr,int64,int64,sptr #comfunc global IDWriteFontFileStream_ReleaseFileFragment 4 sptr #comfunc global IDWriteFontFileStream_GetFileSize 5 var #comfunc global IDWriteFontFileStream_GetLastWriteTime 6 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDWriteFontFileStream "{6D4865FE-0AB8-4D91-8F62-5DD6BE34A3E0}" #usecom global IDWriteFontFileStream IID_IDWriteFontFileStream "{}" #comfunc global IDWriteFontFileStream_ReadFileFragment 3 sptr,int64,int64,sptr #comfunc global IDWriteFontFileStream_ReleaseFileFragment 4 sptr #comfunc global IDWriteFontFileStream_GetFileSize 5 sptr #comfunc global IDWriteFontFileStream_GetLastWriteTime 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。