トップページ > 記事閲覧
ttfファイルからフォントハンドル生成
名前:was-blue.0793 日時: 2020/04/07 22:56

現在、DXフォントデータを使用せずにフォントを使用するにはPCにインストールされたフォントでなければなりません。 しかし、DXフォントデータをフォントサイズに応じて1つ1つ作っていくとDXフォントデータの数が増えていき、それに比例してゲーム自体の容量が増えてしまいます。 そこで、外部のttfファイルから直接フォントハンドルを作ることはできないでしょうか? 例えば、 LoadFontFileToHandle(u8"Data\\Font\\Roboto.ttf", 24, 4, DX_FONTTYPE_ANTIALIASING_8X8) のような関数です。 ご検討の程、よろしくお願いします。
メンテ

Page: 1 |

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を使ったフォントの読み込み方法を模索してみることにします。 情報を提供していただきありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存