トップページ > 記事閲覧
AddSubstitutionFontToHandle 関数の不具合(?)
名前:みこ 日時: 2024/12/11 16:47

いつもお世話になっております。 AddSubstitutionFontToHandle 関数で複数の不具合と思われる現象がありました。 【フォントデータ】 data/UDDigiKyokashoNK-R_50.dft -> C:\Windows\Fonts\UDDigiKyokashoN-R.ttc data/aranyan_50.dft -> ttps://inatsuka.com/extra/haranyan/ からダウンロードした haranyan_marumi.ttf をインストール 【フォントハンドル生成コマンド】 CreateDXFontData.exe /F"UDDigiKyokashoNK-R" /B4 /S50 /O"UDDigiKyokashoNK-R_50.dft" /A"シフトJIS文字セット.txt" CreateDXFontData.exe /F"はらませにゃんこ まるみ" /B4 /S50 /O"haranyan_50.dft" /A"シフトJIS文字セット.txt" 【問題の個所】 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); int ud = LoadFontDataToHandle("data/UDDigiKyokashoNK-R_50.dft"); int nyanko = LoadFontDataToHandle("data/haranyan_50.dft"); int nyanko2 = LoadFontDataToHandle("data/haranyan_50.dft"); AddSubstitutionFontToHandle(nyanko2, ud, 0, 0); DrawStringToHandle(20, 20, u8"かん缶", 0xffffff, ud); // "かん缶" と描画 DrawStringToHandle(20, 20 + 50, u8"かん缶", 0xffffff, nyanko); // "かん" と描画 ※haranyan_50.dftに'缶'が無いので正常 DrawStringToHandle(20, 20 + 50 * 2, u8"かん缶", 0xffffff, nyanko2);// "かん" と描画 ※UDDigiKyokashoNK-R_50.dftに'缶'がありますが AddSubstitutionFontToHandleが反映されない // ※(存在しない文字はデフォルトハンドル?か何かで補完していると思いますが AddSubstitutionFontToHandle を設定すると補完が消えます) int meirio = CreateFontToHandle(u8"メイリオ", 50, 1, DX_FONTTYPE_ANTIALIASING_EDGE_4X4); int nyanko = CreateFontToHandle(u8"はらませにゃんこ まるみ", 50, 1, DX_FONTTYPE_ANTIALIASING_EDGE_4X4); int nyanko2 = CreateFontToHandle(u8"はらませにゃんこ まるみ", 50, 1, DX_FONTTYPE_ANTIALIASING_EDGE_4X4); AddSubstitutionFontToHandle(nyanko, meirio, 0, 0); DrawStringToHandle(20, 20, u8"らん䜌", 0xffffff, meirio); // "らん䜌" と描画 DrawStringToHandle(20, 20 + 50, u8"らん䜌", 0xffffff, nyanko); // "らん䜌" と描画 DrawStringToHandle(20, 20 + 50 * 2, u8"らん䜌", 0xffffff, nyanko2);// "らん"  と描画 【要望】 急ぎでは無いですが、もし可能であれば以下のような機能があると助かりますm(__)m ・dftファイルから読み込んだ場合も CreateFontToHandleのようにデフォルトフォントハンドル(?)で存在しない文字の補完をする ・CreateDXFontData.exe でdftファイルを作成する際に 代替フォントハンドルを指定可能にする  ※AddSubstitutionFontToHandleの修正で解決はしますが複数あったフォントファイルを1つにまとめてパフォーマンスを向上させたい お手数をお掛けしますが何卒よろしくお願いいたします。
メンテ

Page: 1 |

Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.1 )
名前:管理人 日時:2024/12/11 22:54

> DrawStringToHandle(20, 20 + 50 * 2, u8"かん缶", 0xffffff, nyanko2);// "かん" と描画 ※UDDigiKyokashoNK-R_50.dftに'缶'がありますが AddSubstitutionFontToHandleが反映されない 恐らくですが、dftファイル作成時に『シフトJIS文字セット.txt』を使用せずに 自前で『haranyan_marumi.ttf』に含まれる文字のみを含んだ txtファイルを作成して、 それを使用して dftファイルを作成すれば 正しく『缶』の文字が AddSubstitutionFontToHandle で追加したフォントで描画されると思います というのも、何故か存在しない文字を指定してまともに文字画像が取得できなくても APIの戻り値としては 『文字の画像取得成功』となってしまう事が多いので、恐らく『缶』の文字も haranyan_marumi.ttf に 存在しないにも関わらず『缶』の文字があるものとして処理されてしまっているのだと思います ( なので haranyan_50.dft に情報としてだけ含まれている「何も文字画像が無い『缶』」が表示されたため、 AddSubstitutionFontToHandle で追加したフォントの『缶』の文字は表示されなかった ) > ・dftファイルから読み込んだ場合も CreateFontToHandleのようにデフォルトフォントハンドル(?)で存在しない文字の補完をする 補完の処理はDXライブラリの機能ではなく Windows OS が自動的に行なっていることとなります ( 指定のフォントに存在しない文字が指定された場合にMSゴシックなどのデフォルトのフォントの文字が取得されるのは DXライブラリがそのように処理しているのではなく Windows API が自動的にデフォルトフォントの文字画像を返してくる ) 仮に実装する場合は dftファイルからフォントハンドルを作成した場合も、この処理のために通常のフォントハンドルも 作成する必要があり、リソースが無駄に消費されることになるのであまり実装したくはありません… > ・CreateDXFontData.exe でdftファイルを作成する際に 代替フォントハンドルを指定可能にする >  ※AddSubstitutionFontToHandleの修正で解決はしますが複数あったフォントファイルを1つにまとめてパフォーマンスを向上させたい 仮に実装した場合も2つの dftファイルを合体させただけのような構造になるので、特にパフォーマンスの向上は見込めません ファイル構造も作成の仕方も複雑になってしまうので、実装は控えたいと思います
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.2 )
名前:みこ(解決) 日時:2024/12/14 01:38

ご連絡ありがとうございます! 問題についてご教授頂きありがとうございます。 確かに『シフトJIS文字セット.txt』から"缶"文字を消したら正常に描画されました。 その場合、空のビットマップデータが出力されるはずなので何とか改善できないかとソースコードを覗いてみたのですが、 既に『ビットマップのサイズが0の場合は出力しない』機能が実装されており、 実行してみるとフォントに存在しない文字が完全に除外されたdftファイルが出力され、AddSubstitutionFontToHandle関数の問題も解決しました。 ※更新忘れかあるいは環境の相性が良かったのでしょうか? 念のため情報共有します ・VisualStudio 2022 (v143) ・Windows SDK 10.0.26100.0 ・x86/x64 の両方で正常 ・既定 (ISO C++14 標準) ・プリプロセッサー "_CRT_SECURE_NO_WARNINGS" を追加 ・リンカーに winmm.lib を追加 ・文字セット -> [マルチ バイト文字セットを使用する] ・Huffman.cppとHuffman.h を DXArchive から取り込み ・以下を修正(問題とは関係無いですがビルドが通らなかったので)  SaveFilePath = L"FontData.dft"; -> SaveFilePath = const_cast<wchar_t*>(L"FontData.dft"); >補完の処理はDXライブラリの機能ではなく Windows OS が自動的に行なっていることとなります なるほどです、であれば実装は難しそうですね... >仮に実装した場合も2つの dftファイルを合体させただけのような構造になるので、特にパフォーマンスの向上は見込めません すみません、パフォーマンスという言い方がよくなかったかもしれません。 dftファイルを1つにまとめる事によってファイルサイズを削減できれば読み込み時間や総メモリ使用量の削減になるのではと思った次第です。 こちらは特に必須というわけでは無いので却下との事で問題御座いません。
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.3 )
名前:管理人(解決) 日時:2024/12/15 00:21

> 既に『ビットマップのサイズが0の場合は出力しない』機能が実装されており、 > 実行してみるとフォントに存在しない文字が完全に除外されたdftファイルが出力され、AddSubstitutionFontToHandle関数の問題も解決しました。 > ※更新忘れかあるいは環境の相性が良かったのでしょうか? 手元で CreateDXFontData.exe を再度ビルドして試してみましたが、私の環境ではやはり『缶』は描画されませんでした > 既に『ビットマップのサイズが0の場合は出力しない』機能が実装されており、 私もだいぶ忘れていたのですが、現在の処理は『「ビットマップのサイズ」が0で、且つ「次の文字の位置」も0の場合は出力しない』となっていまして、 『缶』の文字は「ビットマップのサイズ」は0であるものの、「次の文字の位置」は0ではなかったので文字情報の出力は行われ、結果として 『缶』は空白文字のように処理され AddSubstitutionFontToHandle で指定したフォントの文字が描画されませんでした > ※更新忘れかあるいは環境の相性が良かったのでしょうか? 最新の状態でも出力文字セットのtxtファイルに『缶』が存在する場合は AddSubstitutionFontToHandle で指定したフォントの文字は 描画されない筈なのですが、みこさんのお手元でコンパイルした CreateDXFontData.exe で出力された dftファイルでは『缶』の 文字が描画されたのでしょうか? 仮にそうだとしますと、私の想定していない動作となります
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.4 )
名前:みこ(解決) 日時:2024/12/15 01:19

>最新の状態でも出力文字セットのtxtファイルに『缶』が存在する場合は AddSubstitutionFontToHandle で指定したフォントの文字は >描画されない筈なのですが、みこさんのお手元でコンパイルした CreateDXFontData.exe で出力された dftファイルでは『缶』の >文字が描画されたのでしょうか? >仮にそうだとしますと、私の想定していない動作となります はい、おっしゃる通りです。 現象が確認できるプロジェクトファイルを共有します ttps://drive.google.com/open?id=1bF2BSQY37Bw9tAQ312hV2mKuduzOmClo CreateDXFontDataのソースは const_castと_CRT_SECURE_NO_WARNINGSを定義している事を除けば DxLib3.24d に含まれるソースコードと完全に一致している事が確認できるかと思います。 これを使用して出力したdftファイルを使用すれば『缶』が描画されるはずです。 Font_Sampleのソースコードで AddSubstitutionFontToHandle を使用して『缶』が表示されることが確認できるかと思います。
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.5 )
名前:管理人(解決) 日時:2024/12/16 00:30

> はい、おっしゃる通りです。 > 現象が確認できるプロジェクトファイルを共有します ありがとうございます アップしていただいたプロジェクトで『缶』の文字情報が出力されないのを確認しました すみません、その後何故その違いが発生するのかを確認した所、DXライブラリパッケージの Tool\CreateDXFontData\Source に含まれているソースファイルが古い事が判明しました 3年前に『画像情報が無い文字のスペースが正常に処理されていなかったバグを修正』という修正内容によって 現在の CreateDXFontData.exe の挙動になったのですが、それを含むここ3年程の修正が施されたソースファイルに 更新されていませんでした なので『缶』の情報が出力されてしまう挙動が現在の挙動として正常となります 次の更新で Tool\CreateDXFontData\Source 内のファイルも最新となりますが、こちらに Tool\CreateDXFontData\Source 内の ファイルだけを圧縮してアップしましたので、よろしければダウンロードしてください https://dxlib.xsrv.jp/temp/CreateDXFontData_Source.zip ↑ こちらに含まれるファイルの中の CreateDXFontData.cpp の 1249行目付近にある // スペース以外でデータサイズが0の場合 if( DataSize == 0 ) { FontCacheCharImageBlt( ManageData, ChangeChar, FALSE, DX_FONT_SRCIMAGETYPE_1BIT, NULL, 0, 0, 0, 0, 0, gm.gmCellIncX ) ; } ↑ こちらの記述の gm.gmCellIncX を 0 にすることで『缶』の情報が出力されなくなりますので、 もし『最新のソースを使用しつつ「画像情報の無い文字は出力しない」挙動にしたい』という場合は こちらの gm.gmCellIncX を 0 にしてお使いください m(_ _)m
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.6 )
名前:みこ(解決) 日時:2024/12/16 05:21

ご連絡ありがとうございます。 原因が判明して何よりです。 ご提案通りgm.gmCellIncX を 0 にして使用させて頂きます。 『画像情報が無い文字のスペース』については加筆したCreateDXFontDataとオリジナルのを使い分ければ何とかなりそうですので自身で対策してみます。 この度はありがとうございました!
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.7 )
名前:みこ 日時:2024/12/18 12:23

お世話になっております。 先日解決した問題ですが、新たな問題が見つかりました。 gm.gmCellIncX を 0 にして出力した haranyan_50.dft と、UDDigiKyokashoNK-R_50.dftを使用した場合、 特定の条件で描画位置がおかしくなります。 ttps://drive.google.com/open?id=1bF2BSQY37Bw9tAQ312hV2mKuduzOmClo の 『Font_Sample』を更新しましたのでご確認ください。 【条件】 ・最初の文字列が.dftファイルに存在しない文字列の場合 ・DrawExtendStringFToHandle を使用  ※整数版のDrawExtendStringToHandle では問題は発生しません 【再現コード】 int ud = LoadFontDataToHandle("data/UDDigiKyokashoNK-R_50.dft"); int nyanko_ud = LoadFontDataToHandle("data/haranyan_50.dft"); AddSubstitutionFontToHandle(nyanko_ud, ud, 0, 0); DrawExtendStringToHandle (20, 20 + 50 * 2, 0.5, 0.5, u8"缶 整数のDrawExtendStringToHandleは正常", 0xffffff, ud); DrawExtendStringFToHandle(20, 20 + 50 * 4, 0.5, 0.5, u8"缶猫←存在する文字からは正常位置に戻る" , 0xffffff, nyanko_ud); 【出力結果】 缶  缶 整数のDrawExtendStringToHandleは正常   猫←存在する文字からは正常位置に戻る 複数スレで申し訳ありませんがご確認の程よろしくお願いいたします
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.8 )
名前:管理人 日時:2024/12/20 03:55

再現用サンプルありがとうございます、手元で現象を確認できました 不具合を修正したバージョンをアップしましたので、お手数で申し訳ありませんが こちらの修正版をダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: AddSubstitutionFontToHandle 関数の不具合(?) ( No.9 )
名前:みこ(解決) 日時:2024/12/29 19:54

遅くなりましたが只今手元で修正確認できました! ご対応ありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存