Re: ttfファイルからフォントハンドル生成 ( No.1 ) |
- 名前:にこよう 日時:2020/04/07 23:48
ファイルからフォントハンドルを生成する関数です
自身で定義した関数等も使っているのと、
スレ主さんの想像されている引き数とは違うのでこのままでは使うことは出来ませんが
何かの参考になれば幸いです
// Dxアーカイブやディレクトリから、フォントファイルを読み込む
int LoadDxArchiveFontResource(LPCSTR FontPath)
{
int async_flag = GetUseASyncLoadFlag();
if (async_flag) SetUseASyncLoadFlag(FALSE); // もし非同期読み込み状態なら無効にする
int font_file_size = static_cast<int>(FileRead_size(FontPath)); // ファイルのサイズを得る
if (font_file_size == -1)
{
ERR_GL("フォントファイルが見つかりませんでした");
if (async_flag) SetUseASyncLoadFlag(TRUE); // 非同期読み込みを有効にする
return GL_ERROR;
}
std::unique_ptr<std::byte> buffer(new(std::nothrow) std::byte[font_file_size]);
if (!buffer)
{
ERR_GL("メモリの確保に失敗しました [size=%d]", font_file_size);
if (async_flag) SetUseASyncLoadFlag(TRUE); // 非同期読み込みを有効にする
return GL_ERROR;
}
int font_file_handle = FileRead_open(FontPath); // フォントファイルを開く
if (font_file_handle == -1) // 失敗すれば
{
ERR_GL("フォントファイルが見つかりませんでした");
if (async_flag) SetUseASyncLoadFlag(TRUE); // 非同期読み込みを有効にする
return GL_ERROR;
}
FileRead_read(buffer.get(), font_file_size, font_file_handle); // フォントファイルを丸ごとメモリに読み込む
FileRead_close(font_file_handle); // ファイルを閉じる
DWORD font_num = 0; // AddFontMemResourceEx引数用
if (AddFontMemResourceEx(buffer.get(), font_file_size, NULL, &font_num) == 0) // メモリに読み込んだフォントデータをシステムに追加
{
ERR_GL("フォントデータの読み込みに失敗しました");
if (async_flag) SetUseASyncLoadFlag(TRUE); // 非同期読み込みを有効にする
return GL_ERROR;
}
AddGameLibLog("フォントファイル [%s] を正常に読み込みました", FontPath);
if (async_flag) SetUseASyncLoadFlag(TRUE); // 非同期読み込みを有効にする
return GL_NO_ERROR;
}
上の関数で読み込んだ後は
CreateFontToHandle()
の第一引き数にフォントの名前を指定することで普段通りにフォントハンドルを作成することができます
|
Re: ttfファイルからフォントハンドル生成 ( No.2 ) |
- 名前:was-blue.0793 日時:2020/04/08 00:50
>>にこようさん
ご返答ありがとうございます。
AddFontMemResourceExを使う方法は、システムを操作してしまう(一時的にフォントをシステムのフォントとしてインストールし、そのフォントを通してフォントハンドルを作る)ため、
システムを操作せずに直接フォントファイルからフォントハンドルを構築できる方が安全ではないかと思います。
また、AddFontMemResourceExを使う方法はあとからリソースを解放する必要があると記憶していますが、AddFontMemResourceExで取り込んだリソースの解放はどのように行っていますか?
|
Re: ttfファイルからフォントハンドル生成 ( No.3 ) |
- 名前:にこよう 日時:2020/04/08 09:59
>was-blue.0793さん
プログラミング等に関してはまだ初心者なので正確な回答ではないかもしれません
>AddFontMemResourceExを使う方法は、システムを操作してしまう(一時的にフォントをシステムのフォントとしてインストールし、そのフォントを通してフォントハンドルを作る)ため、
>システムを操作せずに直接フォントファイルからフォントハンドルを構築できる方が安全ではないかと思います。
すみません、システムを利用することによって何が安全ではないのでしょうか?
あくまでもアプリケーション専用の領域に一時的に読み込まれるだけなので、
インストールだけ行って何らかの理由でフォントがosに残ってしまう、といったことは起こらないと思います
>また、AddFontMemResourceExを使う方法はあとからリソースを解放する必要があると記憶していますが、AddFontMemResourceExで取り込んだリソースの解放はどのように行っていますか?
RemoveFontMemResourceEx関数を利用してリソースを開放することは出来ます
私の場合は画像やBGMのようにゲーム中に読み込んだり開放したりを繰り返すことは無く
ゲーム起動時に読み込んだ後はゲーム終了時まで開放することはありません
その場合は、アプリケーションは終了時にOSによって全てのリソースを自動的に開放されるためプログラム内で明示的に開放する必要はありません
|
Re: ttfファイルからフォントハンドル生成 ( No.4 ) |
- 名前:was-blue.0793 日時:2020/04/11 14:33
>>にこようさん
システム操作が危険な理由は、もしアプリが異常終了してリソースリークが発生した場合、システムが不安定になってしまう懸念があります。
リソースの解放は、上記同様リソースリークに対する対策のために必要で、リソースの解放をアプリの終了まで待つとそれだけメモリを使ってしまうことになり、
リソースリークの危険があることと要求スペックが上がってしまうため、使わなくなったリソースは早い段階で解放した方がよいものと思います。
|
Re: ttfファイルからフォントハンドル生成 ( No.5 ) |
- 名前:にこよう 日時:2020/04/14 03:43
>システム操作が危険な理由は、もしアプリが異常終了してリソースリークが発生した場合、システムが不安定になってしまう懸念があります。
そうなんですね
私はこれ以外の読み込み方法を知らないので、申し訳ないのですが他の方に交代していただけたらと思います
>リソースリークの危険があることと要求スペックが上がってしまうため、使わなくなったリソースは早い段階で解放した方がよいものと思います。
私の場合はフォントハンドルは使用した時に生成する方式で(描画毎にCreateFontToHandleのラッパーを呼ぶ為予め生成しない)、
同じフォントでもサイズごとに生成する必要があるので、呼ばれるタイミングと回数は分かりません
なので最後まで残していますが、開放できるならその通りだと思います
|
Re: ttfファイルからフォントハンドル生成 ( No.6 ) |
- 名前:was-blue.0793 日時:2020/04/14 12:08
>>にこようさん
AddFontMemResourceExを使う場合において、"1度システムのフォントとして取り込んでしまうか"が正しいのか否かという文献は見つかりませんでした。
よってリソースリークの懸念は残りますが、1度自前でAddFontMemResourceExを使ったフォントの読み込み方法を模索してみることにします。
情報を提供していただきありがとうございます。
|