Re: CreateDXFontData.exeに機能追加の要望 ( No.1 ) |
- 名前:管理人 日時:2016/03/21 15:35
うーん…ひとつの dftファイルに複数のフォントを含めるのは難しいので、
複数の dftファイルを一回の DrawString で使用できるような機能でも良いでしょうか?
// イメージ
int FontHandle ;
int FontHandleSub ;
// フォントファイルを読み込む
FontHandle = LoadFontDataToHandle( "Zenkaku.dft" ) ; // ←全角文字のみあるフォントファイル
FontHandleSub = LoadFontDataToHandle( "Hankaku.dft" ) ; // ←半角英数字のみあるフォントファイル
// FontHandle に無い文字を FontHandleSub から探すようにする
SetSubFontToHandle( FontHandle, FontHandleSub ) ;
// FontHandle に存在しない半角文字を含んだ文字列を描画すると
// 半角文字については FontHandleSub の文字が使用される
DrawStringToHandle( 0, 0, "abcあいう", GetColor( 255,255,255 ) ) ;
|
Re: CreateDXFontData.exeに機能 ( No.2 ) |
- 名前:丈槍由紀 日時:2016/03/21 16:02
返信ありがとうございます
>複数の dftファイルを一回の DrawString で使用できるような機能でも良いでしょうか?
その機能で大丈夫です
ちなみにその実装で、メインのdftファイルとサブのdftファイルの間で
サイズやイタリック指定等が違っていた場合、
それぞれのパラメーターで上手く表示できるのでしょうか?
また、FontHandleSubにもサブのフォントが含まれていた場合
(つまり、入れ子構造になっていた場合)、
三番目以上のフォントも再帰的に検索して表示出来そうですか?
あと、複数のフォントを一度に表示するなら、
フォントごとにY座標のオフセットが指定できた方が便利なのですが、
ライブラリかツール側で指定できるようにできますか?
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.3 ) |
- 名前:管理人 日時:2016/03/21 16:54
> ちなみにその実装で、メインのdftファイルとサブのdftファイルの間で
> サイズやイタリック指定等が違っていた場合、
> それぞれのパラメーターで上手く表示できるのでしょうか?
表示されないと思いますので、別途字間やY座標のオフセットを指定する関数を用意して、
その関数を使用して対応していただくことになると思います
> また、FontHandleSubにもサブのフォントが含まれていた場合
> (つまり、入れ子構造になっていた場合)、
> 三番目以上のフォントも再帰的に検索して表示出来そうですか?
入れ子構造に対応する予定はありませんでしたが、対応した方が良いでしょうか?
対応する場合はスタックメモリの許す限り再帰的に検索できると思います
> あと、複数のフォントを一度に表示するなら、
> フォントごとにY座標のオフセットが指定できた方が便利なのですが、
> ライブラリかツール側で指定できるようにできますか?
恐らくライブラリにオフセットを指定できる関数を用意することになると思います
// このような感じで…
// ( FontHandle のサブフォント FontSubHandle の Y座標オフセットを -8 にする )
SetSubFontYOffsetToHandle( FontHandle, FontSubHandle, -8 ) ;
|
Re: CreateDXFontData.exeに機能 ( No.4 ) |
- 名前:丈槍由紀 日時:2016/03/21 17:58
>表示されないと思いますので、別途字間やY座標のオフセットを指定する関数を用意して、
>その関数を使用して対応していただくことになると思います
そうですか。。。
ならば、数値で指定する他に、仮想ボディの上・下・中央揃えやベースライン揃え等、
よく使いそうなものはライブラリで対応していただけるとありがたいのですが、
難しいでしょうか?
(自前でラッパーを作るにしても、ベースラインの高さを取得できるようにはしてほしいです)
>入れ子構造に対応する予定はありませんでしたが、対応した方が良いでしょうか?
三つ以上指定できる需要はありますので、ネストに対応するか、
サブフォントを複数、優先順も合わせて指定できる様にしていただけると嬉しいです
扱いやすさからすると後者の方がいいのですが、実装が難しいなら前者でも構いません
|
Re: CreateDXFontData.exeに機能 ( No.5 ) |
- 名前:丈槍由紀 日時:2016/03/21 18:13
連投すみません。
追記、補足です
優先度も合わせて、というのは、引数の順番や、関数の呼び出し順などのことです
それと、フォントハンドルにサブのフォントを付け足せる実装の場合、
フォントのデータを持っていない(使える文字が一つもない)、空のフォントハンドルを作る関数を用意してほしいです
要望だらけで申し訳ないのですが、よろしくお願いします
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.6 ) |
- 名前:管理人 日時:2016/03/21 21:03
> ならば、数値で指定する他に、仮想ボディの上・下・中央揃えやベースライン揃え等、
> よく使いそうなものはライブラリで対応していただけるとありがたいのですが、
> 難しいでしょうか?
いろいろあって今の大きな目標である Android への対応が1ヶ月以上滞ってしまっているので
あまり本件の対応を本格的な作業となるようなものにしたくないので、申し訳ありませんが対応は難しいです
ところで「仮想ボディ」とはなんでしょうか?
> (自前でラッパーを作るにしても、ベースラインの高さを取得できるようにはしてほしいです)
分かりましたベースラインの高さを取得できる仕組みを追加します
ただ、現在の dftファイルにはベースラインの高さに関する情報はありませんので、
対応したバージョンで dftファイルを全て作成しなおしていただくことになると思います
> 三つ以上指定できる需要はありますので、ネストに対応するか、
> サブフォントを複数、優先順も合わせて指定できる様にしていただけると嬉しいです
> 扱いやすさからすると後者の方がいいのですが、実装が難しいなら前者でも構いません
優先順とは、例えば同じ文字がどちらのフォントファイルにもある場合、どちらのフォントファイルの
文字を優先するか、などでしょうか?
実装のし易さは同じくらいなのでサブフォントを複数、優先順つきで設定できるようにします
> 優先度も合わせて、というのは、引数の順番や、関数の呼び出し順などのことです
すみません、何を仰っているのか理解できません
引数の順番の優先度・・?
関数の呼び出し順の優先度とは・・?
> それと、フォントハンドルにサブのフォントを付け足せる実装の場合、
> フォントのデータを持っていない(使える文字が一つもない)、空のフォントハンドルを作る関数を用意してほしいです
サブのフォントを付け足せるとはどのような意味でしょうか?
優先順つきでサブフォントを複数指定できる機能があれば空のフォントハンドルを作る関数は
必要が無いという認識でよろしいでしょうか?
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.7 ) |
- 名前:丈槍由紀 日時:2016/03/21 23:31
>いろいろあって今の大きな目標である Android への対応が1ヶ月以上滞ってしまっているので
>あまり本件の対応を本格的な作業となるようなものにしたくないので、申し訳ありませんが対応は難しいです
了解しました、お忙しい中対応・返信ありがとうございます
>ところで「仮想ボディ」とはなんでしょうか?
フォントに定義された文字のサイズのことです
次の文字の位置はこれによって決まるそうです
ttp://www.japanlink.co.jp/dtpjiten/ka/imaginarybody.html
>分かりましたベースラインの高さを取得できる仕組みを追加します
>ただ、現在の dftファイルにはベースラインの高さに関する情報はありませんので、
>対応したバージョンで dftファイルを全て作成しなおしていただくことになると思います
ありがとうございます
>すみません、何を仰っているのか理解できません
>引数の順番の優先度・・?
>関数の呼び出し順の優先度とは・・?
//Sub1 →Sub2 →Sub3の順で検索するように指定
SetSubFontToHandle( FontHandle, FontHandleSub1, FontHandleSub2, FontHandleSub3);
とか
//Sub1 →Sub2 →Sub3の順で検索するように指定
AddSubFontToHandle( FontHandle, FontHandleSub1);
AddSubFontToHandle( FontHandle, FontHandleSub2);
AddSubFontToHandle( FontHandle, FontHandleSub3);
とかみたいな意味を伝えたかったのですが、
蛇足だったようですね
空のフォント作成関数がほしいのは、後者の実装になった場合の話です
空のフォントデータはサイズの情報だけ持っていて、
それに必要なフォントのセットをすべてサブのフォントとして追加ていく、みたいなことがしたかったのです
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.8 ) |
- 名前:管理人 日時:2016/03/22 00:11
> フォントに定義された文字のサイズのことです
> 次の文字の位置はこれによって決まるそうです
ご説明ありがとうございます
現在のDXライブラリの文字列描画処理は「とりあえず問題の無い感じに描画されていればOK」程度のものなので、
仮想ボディやベースラインなども全く考慮していませんので、これらを考慮したちゃんとした文字列描画機能を
実装しようとしたら大幅な作り直しが必要になりそうです・・・
仮想ボディに関する情報も現在の dftファイルには含まれていませんが、無くても大丈夫でしょうか?
> //Sub1 →Sub2 →Sub3の順で検索するように指定
なるほど、理解できました
私が考えていたのは↓のような感じで、第三引数で優先度を指定するようなイメージです
AddSubFontToHandle( FontHandle, FontHandleSub1, 0 ) ;
AddSubFontToHandle( FontHandle, FontHandleSub2, 1 ) ;
AddSubFontToHandle( FontHandle, FontHandleSub3, 2 ) ;
> 空のフォント作成関数がほしいのは、後者の実装になった場合の話です
> 空のフォントデータはサイズの情報だけ持っていて、
> それに必要なフォントのセットをすべてサブのフォントとして追加ていく、みたいなことがしたかったのです
フォントには沢山の情報があるので、サイズの情報だけ持つというのはイメージできません
そのサイズは何に使われるのでしょうか?
今のところ考えているのは、追加されるサブフォントはオリジナルのフォントの情報には一切
影響を受けないものです
例えば全角フォントの FontZenkakuHandle と半角フォントの FontHankakuHandle があり、
AddSubFontToHandle( FontZenkakuHandle, FontHankakuHandle, 0 ) ;
として、FontHankakuHandle を FontZenkakuHandle のサブフォントにしたとします、その状態で
DrawStringToHandle( 0, 0, "あいうえabcd", GetColor( 255,255,255 ), FontZenkakuHandle ) ;
とした場合の描画結果は
DrawStringToHandle( 0, 0, "あいうえ", GetColor( 255,255,255 ), FontZenkakuHandle ) ;
DrawStringToHandle( GetDrawStringWidthToHandle( "あいうえ", -1, FontZenkakuHandle ), 0, "abcd", GetColor( 255,255,255 ), FontHankakuHandle ) ;
とした場合と同じで、サブフォントである FontHankakuHandle の描画には FontZenkakuHandle の
フォントとしての情報の影響は受けない予定です
なので、仮に空フォントを実装する場合はサイズは必要無いと考えているのですが、
サイズが必要なのでしょうか?
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.9 ) |
- 名前:丈槍由紀 日時:2016/03/22 00:25
>現在のDXライブラリの文字列描画処理は「とりあえず問題の無い感じに描画されていればOK」程度のものなので、
>仮想ボディやベースラインなども全く考慮していませんので、これらを考慮したちゃんとした文字列描画機能を
>実装しようとしたら大幅な作り直しが必要になりそうです・・・
今は現状のままで大丈夫ですが、改善の余地があるなら後々本格的なものに置き換えていただきたいですね。。
>私が考えていたのは↓のような感じで、第三引数で優先度を指定するようなイメージです
私はライブラリ側でどのような実装になっているのかわかりませんが、
その方法だと、欠番や同じ優先度への上書きなどということが起こるので
ユーザー、ライブラリ側ともに扱いづらいのではないでしょうか?
>サイズが必要なのでしょうか?
フォントにオフセットを指定するラッパーで、ベースライン揃えや、下揃えにするなどしたときに、
親フォントが空か否かにかかわらず有効なサイズの情報を持っていたほうが扱いやすいと思ったのですが、、
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.10 ) |
- 名前:管理人 日時:2016/03/22 00:57
> 私はライブラリ側でどのような実装になっているのかわかりませんが、
> その方法だと、欠番や同じ優先度への上書きなどということが起こるので
> ユーザー、ライブラリ側ともに扱いづらいのではないでしょうか?
欠番は問題ありません、同じ優先度の場合は上書きではなく後に登録したものの優先度が
先に登録したものより低くなる、などを考えています
> フォントにオフセットを指定するラッパーで、ベースライン揃えや、下揃えにするなどしたときに、
> 親フォントが空か否かにかかわらず有効なサイズの情報を持っていたほうが扱いやすいと思ったのですが、、
うーん、なるほど…
思ったのですが、冷静に考えてみたら、私が実装しようとしている機能程度でしたら
ライブラリに追加する必要はないのではないかと思い始めました
元々丈槍由紀さんが求めていた機能は私が考えているものよりちゃんとしたもので、
その機能を実装することは現状できない以上、ラッパーを組めば済む程度の機能を
追加する意味はあまり無い気がします
因みに、今のところ挙がっている
・サブフォントの登録
・サブフォントの登録の優先順位
・サブフォントのY座標のオフセット
の機能については、全てラッパーを組めば必要が無いものです( 別々のフォントハンドルを自前で
使い分ける場合はサブフォントの登録がそもそも必要ないですし、その場合はサブフォントとする
フォントによる文字描画も自前で行うのでY座標のオフセットも自前で管理することができます )
唯一ベースラインの情報についてはラッパーを組んでも解決できないものだと思うので、
これについてのみ対応しようと思うのですが如何でしょうか?
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.11 ) |
- 名前:丈槍由紀 日時:2016/03/22 01:39
>の機能については、全てラッパーを組めば必要が無いものです( 別々のフォントハンドルを自前で
>使い分ける場合はサブフォントの登録がそもそも必要ないですし、その場合はサブフォントとする
>フォントによる文字描画も自前で行うのでY座標のオフセットも自前で管理することができます )
改行のほうでも話が出ていましたが、一文字ごとにフォントを検索して指定して描画するのでは
ライブラリでまとめて描画するのに比べて遅いのではないでしょうか?
dxfに複数のフォントを混ぜて保存できれば、DXライブラリ側でも利用者(ラッパー)側でも検索の必要がないので
高速に混植フォントが実現できるのではないかと思っていたのですが、難しいようなら仕方ないですね
とりあえずいまは、自前でラッパーを組んで実現しようと思います
ベースラインの取得のほかに、その文字がフォントデータの中に含まれているか否かを取得する手段も必要なので、
その対応をお願いします
将来的に、DXライブラリでレタリングソフトのような文字描画ができるようになることを期待しています
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.12 ) |
- 名前:yumetodo 日時:2016/03/22 20:30
>ライブラリでまとめて描画するのに比べて遅いのではないでしょうか?
>将来的に、DXライブラリでレタリングソフトのような文字描画ができるようになることを期待しています
ラッパー側でなるべく重くならないように工夫することはできるし(キャッシュ)、
そもそもDxLib自体文字列周りはあまり得意じゃないし、求めるものを間違えているように見えるんですが。
まあしかし、そろそろDxLibの文字列周りは作りなおさないといけないのかもしれませんね。
Unicode対応もUTF-16だけというのはどうなんだというのがありますし。
高度な操作に関してはstatic変数ではなく引数経由で構造体を渡すほうがかえってわかりやすいのかもしれません
(みえる型を減らしたいという思いは承知していますが)
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.13 ) |
- 名前:管理人 日時:2016/03/23 03:38
> 改行のほうでも話が出ていましたが、一文字ごとにフォントを検索して指定して描画するのでは
> ライブラリでまとめて描画するのに比べて遅いのではないでしょうか?
どちらの方が速いかといえば当然ライブラリ側で実装した場合の方が速いですが、
ライブラリ側で実装する場合もそうでない場合も複数のフォントを使用した場合は
キャッシュとして使用するテクスチャが分かれてしまうので、複数のテクスチャを
使用することによる処理増大と比べたら微々たるものです…
> ベースラインの取得のほかに、その文字がフォントデータの中に含まれているか否かを取得する手段も必要なので、
> その対応をお願いします
ベースラインの取得をするための関数を追加したバージョンをアップしましたので、よろしければ
ダウンロードしてください
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
以下の関数を追加しました
// フォントハンドルの描画位置からベースラインまでの高さを取得する
// 戻り値 : ベースラインまでの高さ
int GetFontAscentToHandle( int FontHandle ) ;
戻り値がベースラインまでの高さとなります
DrawStringToHandle などで渡す y 座標にこの関数の戻り値を足した値がベースラインの位置となります
あと、フォントデータの中に指定の文字が含まれているかどうかは以下の関数で取得することができます( 既にありました )
// フォントハンドルの指定の文字の描画情報を取得する
// 戻り値 : 0 = 正常終了( 指定の文字が存在した ) -1 = フォントハンドルが無効、若しくはフォントデータの中に指定の文字が存在しなかった
int GetFontCharInfo( int FontHandle, const char *Char, int *DrawX, int *DrawY, int *NextCharX, int *SizeX, int *SizeY ) ;
Char に文字列のポインタを渡すと、先頭の文字の情報を取得することができます
このときフォントデータの中に指定の文字が含まれて居ない場合は戻り値が -1 になりますので、
それでフォントデータの中に指定の文字が含まれているかどうかを判断することができます
その他の引数の DrawX, DrawY, NextCharX, SizeX, SizeY は必要ない場合は NULL を渡してください
> yumetodoさん
> Unicode対応もUTF-16だけというのはどうなんだというのがありますし。
DXライブラリ内部で扱う文字列は UTF-16 ですが、UTF-8 や UTF-32 にも対応しています
( DrawStringToHandle で描画することができます )
DxLib.h の中を #define DX_CHARCODEFORMAT_UTF8 で検索してみてください、対応している文字コードの一覧が見れます
// UTF-8 の文字列を描画する例
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 )
{
return -1 ;
}
SetDrawScreen( DX_SCREEN_BACK ) ;
ClearDrawScreen();
int FontHandle = CreateFontToHandle( NULL, 32, 1 ) ;
// 使用する文字コードを UTF-8 に設定
SetFontCharCodeFormatToHandle( DX_CHARCODEFORMAT_UTF8, FontHandle ) ;
// UTF-8 の文字列を描画
DrawStringToHandle(0, 0, u8"あいうえお", GetColor(255, 255, 255), FontHandle ) ;
ScreenFlip();
WaitKey();
return 0;
}
ただ、内部で UTF-16LE に変換しているので対応している Unicode の範囲は U+0000 〜 U+10FFFF です…
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.14 ) |
- 名前:yumetodo 日時:2016/03/23 15:05
>SetFontCharCodeFormatToHandle
それは知らなかった。けどこれUTF32なのもをどうやって渡すんだろう、DrawStringToHandleにそもそもconst char32_t*を渡せない気が
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.15 ) |
- 名前:だみあん 日時:2016/03/23 23:51
> DXライブラリ内部で扱う文字列は UTF-16 ですが、UTF-8 や UTF-32 にも対応しています
内部コードとあわせてUTF-16LE固定(もしくはUTF-32固定) な感じの方向性も模索できそうなので
試してみようと思ったのですが……。
サンプルのコードの一部変えて
DxLib::SetFontCharCodeFormatToHandle( DX_CHARCODEFORMAT_UTF16LE, fontHandle ) ;
DxLib::DrawStringToHandle(0, 0, u"あいうえお", -1, fontHandle ) ;
としてみたのですが
error C2664: 'int DxLib::DrawStringToHandle(int,int,const TCHAR *,unsigned int,int,unsigned int,int)'
: 引数 3 を 'const char16_t [6]' から 'const TCHAR *' へ変換できません
とDrawStringToHandleの引数のところでエラーになります。
サンプルコードをそのままこぴぺしたUTF-8版も同じようなエラーになりました……
一応環境を書いておきますと
win7 64bit
vc++2015 CTP(update 2)
DxLibは最新のtest版使用
です。
DxLib.hのSetFontCharCodeFormatToHandleの定義のところに( UNICODE版では無効 )とあったので
文字セットをマルチバイト文字にも変えてみたのですが、同じエラーです…。
なにか設定が必要なのでしょうか??
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.16 ) |
- 名前:管理人 日時:2016/03/27 22:05
> yumetodoさん
> けどこれUTF32なのもをどうやって渡すんだろう、DrawStringToHandleにそもそもconst char32_t*を渡せない気が
const TCHAR * にキャストして渡してください
> だみあんさん
> error C2664: 'int DxLib::DrawStringToHandle(int,int,const TCHAR *,unsigned int,int,unsigned int,int)'
> : 引数 3 を 'const char16_t [6]' から 'const TCHAR *' へ変換できません
DrawStringToHandle は定義上は TCHAR を引数としているので、const TCHAR * にキャストする必要があります
DxLib::SetFontCharCodeFormatToHandle( DX_CHARCODEFORMAT_UTF16LE, fontHandle ) ;
DxLib::DrawStringToHandle(0, 0, ( const TCHAR * )u"あいうえお", -1, fontHandle ) ;
> サンプルコードをそのままこぴぺしたUTF-8版も同じようなエラーになりました……
手元では Visual Studio Community 2015 Update 1 でエラーが出ないことを確認しましたが、
CTP update 2 ではエラーになるのですか…
恐らくこちらも
DxLib::SetFontCharCodeFormatToHandle( DX_CHARCODEFORMAT_UTF8, fontHandle ) ;
DxLib::DrawStringToHandle(0, 0, ( const TCHAR * )u8"あいうえお", -1, fontHandle ) ;
と、const TCHAR * にキャストすればコンパイルは通ると思います…
|
Re: CreateDXFontData.exeに機能追加の要望 ( No.17 ) |
- 名前:だみあん 日時:2016/03/28 02:38
> CTP update 2 ではエラーになるのですか…
すみません、文字セットの設定しまちがえてたのか、もう一度やってみたら
サンプルコードをそのままこぴぺしたUTF-8版はちゃんと動きました。
文字セット:マルチバイト指定の場合、u8"XXX"の場合のリテラルはconst charになるので通るのですね
(char8_tとか将来的に出来たりしない限り)
utf16とutf32もconst TCHAR *にキャストすれば実行可能なのを確認しました。
|