/*	
 *	DxlibHelper.h
 *
 *	DxLibヘルパー関数
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015-2016 Naoyuki Sawa
 *
 *	* Mon Dec 21 21:11:43 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	  DxLibの関数を呼び出すために、当モジュールはC++としてコンパイルされる必要が有ります。
 *	  ただし、当モジュールが提供する関数は、Cリンケージで問題ありません。
 *	* Tue Jan 12 16:36:58 JST 2016 Naoyuki Sawa
 *	- 全ての関数に色指定の引数を追加しました。
 *	  色指定の引数は、D3DCOLOR形式(0x??RRGGBB)で指定して下さい。
 *	  D3DCOLOR形式とDxLibのGetrgb()形式は、必ずしも一致するとは限らない事に注意して下さい。
 *	* Wed Jan 13 21:47:42 JST 2016 Naoyuki Sawa
 *	- Direct3D互換のD3DCOLOR形式マクロを追加しました。
 *	- DxLib用の描画関数ラッパーを追加しました。
 *	* Mon Jan 25 21:57:35 JST 2016 Naoyuki Sawa
 *	- play_grp(),stop_grp(),auto_free_grp()を追加しました。
 *	  ムービーグラフィックの再生状態を管理する関数です。
 *	- アプリケーションは、draw_grp()等でムービーグラフィックを描画する場合に、毎フレームplay_grp()を呼び出して下さい。
 *	  毎フレームに一回、auto_free_grp()を呼び出して下さい。
 *	  普通の使い方では、stop_grp()を呼び出す必要は有りません。
 *	- draw_ext()の引数を変更しました。
 *	  任意の位置を中心に、拡縮出来るようになりました。
 *	* Tue Jan 26 21:39:05 JST 2016 Naoyuki Sawa
 *	- play_grp()で再生開始直後、少なくとも最初のムービーフレームがデコードされるまで待つ事にしました。
 *	  最初のムービーフレームがデコードされる前にこのグラフィックハンドルを使ってDrawGraph()等を呼び出すと、ゴミが描画されてしまう問題が生じるからです。
 *	  尚、上記の待ち処理は、再生開始直後のみに限定するのが適切です。
 *	  もし常に毎フレーム待ち処理を行うと、極端に動作が重くなります。
 *	* Sun Jan 31 21:43:46 JST 2016 Naoyuki Sawa
 *	- 特に良く使う描画関数の、優先度付きバージョンを定義しました。
 *	  他にも優先度付き描画を行いたい描画関数が有れば、このモジュールに追加して下さい。
 *	* Mon Feb 01 21:19:50 JST 2016 Naoyuki Sawa
 *	- draw_spr(),draw_spr2()を追加しました。
 *	- CbkQue_draw_spr(),CbkQue_draw_spr2()を追加しました。
 *	* Wed Feb 03 21:48:04 JST 2016 Naoyuki Sawa
 *	- draw_box()を、draw_box()とdraw_box_fill()に分けました。
 *	  draw_oval()を、draw_oval()とdraw_oval_fill()に分けました。
 *	- CbkQue_draw_box()を、CbkQue_draw_box()とCbkQue_draw_box_fill()に分けました。
 *	  CbkQue_draw_oval()を、CbkQue_draw_oval()とCbkQue_draw_oval_fill()に分けました。
 *	- 分けた理由は、塗り潰す方を使う事が大半なので、パラメータで指定するよりも関数を分ける方が使い易いからです。
 *	* Wed Feb 03 22:37:19 JST 2016 Naoyuki Sawa
 *	- load_grp()とfree_grp()も/clip/test.win/cpp.cpp⇒/clip/embedfont.cppへ移しました。
 *	  load_grp()とfree_grp()を、アプリケーションが直接呼び出す必要は無いので、embedfont.cppのローカル関数としました。
 *	- 今後は、アプリケーション側で、load_grp()とfree_grp()を定義する必要は有りません。
 *	  その代わりに、必要に応じてfnPreLoadGraph()を定義して下さい。
 *	  詳細は、ST_TexInf構造体と、load_grp()の実装を参照して下さい。
 *	* Wed Feb 03 22:03:58 JST 2016 Naoyuki Sawa
 *	- get_sprDef()を追加しました。
 *	  □使用例:ムービーをスプライトとして描画するには、以下のように処理して下さい。		⇒{{2016/02/05追記:play_spr(),stop_spr()を使えばもっと簡単に書けるようになりました。}}
 *	  │ST_SprDef stSprDef;
 *	  │get_sprDef(iSpr, &stSprDef); //スプライトのグラフィック番号を取得する。
 *	  │play_grp(stSprDef.iTexNo);   //ムービーを再生,又は,再生継続する。
 *	  │draw_spr(x, y, iSpr);        //ムービーをスプライトとして描画する。
 *	- PlayMovieToGraph()でムービーを再生中のグラフィックを、DrawRectRotaGraph3()で描画しようとした時の問題を、回避する処理を追加しました。
 *	  詳細は、draw_spr2()関数内のコメントを参照して下さい。
 *	* Fri Feb 05 21:49:20 JST 2016 Naoyuki Sawa
 *	- play_spr()とstop_spr()を追加しました。
 *	  これまでもget_sprDef()とplay_grp(),及び,stop_grp()を組み合わせれば可能ではあったのですが、使用頻度が高いので手間を省くためにユーティリティ関数として用意する事にしました。
 *	  □使用例:ムービーをスプライトとして描画するには、以下のように処理して下さい。
 *	  │play_spr(iSpr);       //ムービーを再生,又は,再生継続する。
 *	  │draw_spr(x, y, iSpr); //ムービーをスプライトとして描画する。
 *	* Sun Feb 14 21:59:00 JST 2016 Naoyuki Sawa
 *	- DxLib用のサウンド関数ラッパーを追加しました。
 *	  これまでは/clip/test.win/cpp.cppの中に置いていましたが、ある程度安定したので当モジュールの中へ移す事にしました。
 *	* Wed Feb 17 21:39:25 JST 2016 Naoyuki Sawa
 *	- DxLib用のサウンド関数ラッパーを修正し、TAPセットで複数の論理チャネルが同一のデバイスチャネルを共有した場合も、正しく動作するようにしました。
 *	  これまでは、DxLibにデバイスチャネルの概念が無い事を考慮していなかったので、TAPセットで論理チャネル:デバイスチャネルが1:1の場合しか正しく動作していませんでした。
 *	  今回、デバイスチャネルを当モジュール内で擬似的に管理するようにして、TAPセットで複数の論理チャネルが同一のデバイスチャネルを共有した場合も、正しく動作するようになりました。
 *	  詳細は、DxLib用のサウンド関数ラッパーの実装部を参照して下さい。
 *	  ちなみに、P/ECEの場合は、P/ECEカーネル,又は,CLiPライブラリのサウンド関数にデバイスチャネルの概念が有るので、上記のような擬似的な管理は不要です。
 *	- GetSubMonitorRect()を追加しました。
 *	* Thu Feb 18 21:49:28 JST 2016 Naoyuki Sawa
 *	- draw_ext()の引数を変更しました。
 *	  拡大縮小を、縦横別々に指定出来るようにしました。
 *	* Fri Feb 19 21:59:00 JST 2016 Naoyuki Sawa
 *	- draw_ext()の引数を変更しました。
 *	  これまでは拡縮だけでしたが、回転も出来るようにしました。
 *	  詳細は、draw_ext()の実装箇所のコメントを参照して下さい。
 *	* Fri Feb 26 21:51:12 JST 2016 Naoyuki Sawa
 *	- ST_TexInf.fnPreDrawGraphを追加しました。
 *	  このコールバックを用いる事によって、アプリケーション内の処理で、play_grp()を一か所に纏める事が出来ます。
 *	  それ以外にも、描画の直前に、描画するテクスチャに応じて、描画モードを切り替えるような利用方法も可能です。
 *	- このコールバックで通知されるのは、'テクスチャ番号'であって、'スプライト番号'ではない事に注意して下さい。
 *	  スプライトシートを用いている場合は、このコールバック内で、スプライトシート内の個々のスプライトを識別する事は出来ません。
 *	  とはいえ、このコールバックを追加した目的の大半は、前述のplay_grp()を一か所に纏める目的なので、現在の所は支障有りません。
 *	* Sun Feb 28 23:18:54 JST 2016 Naoyuki Sawa
 *	- デバッグビルド時の、デバッグメッセージの出力先を変更しました。
 *	  変更前は直接stderrへ出力していましたが、変更後はsyslog(LOG_DEBUG,～)へ出力するようにしました。
 *	  ・変更前と同様にstderrにも表示したい場合は、アプリケーションが'openlog(NULL,LOG_PERROR,LOG_USER)'のように設定して下さい。
 *	  ・デバッグにビルド時でも、デバッグメッセージを抑制したい場合は、アプリケーションが'setlogmask(LOG_UPTO(LOG_INFO))'のように設定して下さい。
 *	  尚、リリースビルド時は、これまでと同じく、デバッグメッセージの出力自体を行いません。
 *	* Wed Mar 09 21:18:31 JST 2016 Naoyuki Sawa
 *	- 「Microsoft Platform SDK Febuary 2003 (Last version with VC6 support)」を導入した事に伴い、WINVERと_WIN32_WINNTの定義を、0x0400⇒0x0502に変更しました。
 *	  詳細は、clipstd.h の同日のコメントを参照して下さい。
 *	  それによって、当モジュール内でEnumDisplayMonitors()を明示的に宣言する必要が無くなり、EnumDisplayMonitors()の明示的な宣言を削除しました。
 *	* Fri Mar 11 21:58:48 JST 2016 Naoyuki Sawa
 *	- ファイル名を、embedfont.h,embedfont.cpp⇒DxlibHelper.h,DxlibHelper.cppに変更しました。
 *	  ファイル名を変更した理由は、元々当モジュールは埋め込みテクスチャフォント描画の機能だけを提供していたのですが、その後の関数追加によってDxLib用のヘルパー関数全般を実装するモジュールになり、ファイル名と実態が一致しなくなっていたからです。
 *	  今回、ファイル名を変更した事によって、ファイル名と実態が一致するようになりました。
 *	* Wed Mar 23 21:50:41 JST 2016 Naoyuki Sawa
 *	- get_grp_total_time(),get_spr_total_time()を追加しました。
 *	  2016/03/23現在の所、ogv専用です。
 *	  もし今後、ogv以外(avi等)のムービーに対して当関数を呼び出す必要が生じたら、ogv以外(avi等)のムービーに対する処理を実装して下さい。
 *	  詳細は、get_grp_total_time()関数内のコメントを参照して下さい。
 *	- 今回追加した関数は、DxLibの関数GetMovieTotalFrameToGraph()とGetOneFrameTimeMovieToGraph()をラッピングしたものです。
 *	  追加した目的は、実行時にムービーの長さを求めて、再生し終わるまで待つ場合などに使用するためです。
 *	  別の方法として、GetMovieStateToGraph()を使って待つ方法も考えましたが、その方法は使い辛い事が判ったので、GetMovieStateToGraph()はラッピングしませんでした。
 *	  GetMovieStateToGraph()が使い辛い理由は、CbkQue_draw_grp()等を使ってムービーを再生している場合、実際に再生開始するのがそのフレームの終了時まで遅延してしまい、そのフレームの中で判断を行うと'停止済み'と判断してしまうからです。
 *	  それを回避しようとするとフラグ管理が複雑になってバグの原因になりそうなので、それよりも単純にムービーの総時間を求めてその時間ぶん待つ方が良いと思いました。
 *	* Sun Apr 03 21:51:26 JST 2016 Naoyuki Sawa
 *	- Sofdecムービー対応を追加しました。
 *	  Sofdecムービー対応を有効にしてビルドするには、DxlibHelper.cpp内のUSE_SOFDECシンボルを定義して下さい。
 *	- 2016/04/03現在、/clip/test.win/app.h,及び,cpp.cppにもUSE_SOFDECシンボルが有りますが、全く別物で有る事に注意して下さい。
 *	  DxlibHelper.cppのUSE_SOFDECシンボルは、ライブラリとしてSofdecムービー対応を有効にするかどうかの切り替えです。
 *	  /clip/test.win/app.h,及び,cpp.cppのUSE_SOFDECシンボルは、アプリケーションがSofdecムービーを使用するかどうかの切り替えです。
 *	- Sofdecムービーを使用する場合は、アプリケーション側でSofdecHelper_Init(),SofdecHelper_Exit(),SofdecHelper_Exec()を呼び出して下さい。
 *	  Sofdecムービー対応を有効にしていても、実際にSofdecムービーを使用しない場合は、アプリケーション側でSofdecHelper_Init(),SofdecHelper_Exit(),SofdecHelper_Exec()を呼び出す必要は有りません。
 *	* Mon Apr 04 21:27:10 JST 2016 Naoyuki Sawa
 *	- get_grp_total_time()に、Sofdecムービー対応の処理を追加しました。
 *	* Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
 *	- ST_TexInf構造体に、name_Loopフィールドを追加しました。
 *	  play_grp(),及び,play_spr()関数の、bLoop引数を削除しました。
 *	  play_grp()が自動的に、レジストリデータのテクスチャ定義の、ループフラグを参照するように変更しました。
 *	  もうアプリケーションのプログラム内で、ループムービーか非ループムービーかを指定する必要は有りません。
 *	* Thu Apr 07 21:58:31 JST 2016 Naoyuki Sawa
 *	- ST_TexInf.fnPreDrawGraphを廃止しました。
 *	  play_grp()をローカル変数に変更しました。play_spr()を削除しました。
 *	- ムービーグラフィックを参照する都度(具体的には内部関数load_grp()が呼ばれた時)、内部で自動的にplay_grp()の処理を行うようにしました。
 *	  もう、アプリケーションが明示的にplay_grp()を呼び出す必要は有りません。
 *	  このように変更した理由は、一つはアプリケーションの手間を省くためですが、もう一つ、重要な理由が有ります。
 *	  これまでは、ムービーグラフィックをロードしたにもかかわらずplay_grp()を呼び出さなかった場合、ムービーグラフィックを自動的に破棄する契機が無くなり、ムービーグラフィックが残ってしまう問題が有りました。
 *	  静止画グラフィックならば問題無いのですが、ムービーグラフィックはDxLibの制限で同時に21個位しか存在出来ないようなので(仕様上は100個だが実際に試すと21個位でエラーになる)、残ってしまうと問題が生じます。
 *	  今後は、ムービーグラフィックをロードした瞬間にplay_grp()の処理を行い、その後、ムービーグラフィックを描画しなくなったら自動的に破棄しますので、ムービーグラフィックが残ってしまう問題は無くなりました。
 *	- TBL_PlayingGrp[]のサイズを、MAX_MOVIE_NUM⇒16 に変更しました。
 *	  変更した理由は、以下の通りです。
 *	  これまで、TBL_PlayingGrp[]のサイズを、MAX_MOVIE_NUM(=100)としていました。
 *	  しかし、DxLibの仕様上はMAX_MOVIE_NUM(=100)個のムービーを同時に扱えるはずですが、実際にはムービーサイズに関係無く21個ぐらいでテクスチャが作成出来ないエラーになるようです。(これは前々から気付いていました)
 *	  従って、TBL_PlayingGrp[]のサイズが100もあっても、ほとんど無駄でした。
 *	  本日load_grp()が毎回play_grp()を呼び出すように変更した事に伴い、TBL_PlayingGrp[]のサイズが無駄に大きいと全体への負荷が高くなります。(とは言え100要素リニア比較する程度なので、現在のCPUではほとんど問題無いとは思いますが…)
 *	  そこで、TBL_PlayingGrp[]のサイズを、MAX_MOVIE_NUM⇒16 に変更する事にしました。
 *	  実際には16個もムービーを同時再生する事は無いと思うので、実質アプリケーションへの影響は無いと思います。
 *	* Wed Apr 20 10:51:26 JST 2016 Naoyuki Sawa
 *	- USE_DRAWROTAGRAPHFASTシンボルが定義されたら、DrawRotaGraph系の関数のFastバージョンを使用するようにしました。
 *	  Fastバージョンの関数は、DxLib Ver 3.16aで追加された関数です。
 *	  座標計算のアルゴリズムが簡略化され、±1ピクセル程度の描画誤差が生ずる代わりに、処理負荷が抑えられています。
 *	- draw_mod(),draw_spr3(),CbkQue_draw_mod(),CbkQue_draw_spr3()を追加しました。
 *	* Thu Apr 28 21:03:22 JST 2016 Naoyuki Sawa
 *	- frambpe.cにてBytePairEncodingDecoder_Decode()の引数を追加した事に伴い、当モジュール内のBytePairEncodingDecoder_Decode()を呼び出している個所にも引数を追加しました。
 *	  当モジュールの動作自体には変更有りません。
 *	* Wed May 04 21:28:21 JST 2016 Naoyuki Sawa
 *	- ADX対応を追加しました。
 *	  init_snd()の_use_adx引数に0を指定して初期化すれば、これまで通りDxlibのサウンド機能を使ってサウンドを再生します。
 *	  init_snd()の_use_adx引数に1を指定して初期化すれば、ADXのサウンド機能を使ってサウンドを再生します。
 *	  ADXのサウンド機能を使う場合、init_snd()を呼び出すより前に、アプリケーション側でSofdecHelper_Init()の引数の上位16ビットにチャネル数を指定して初期化しておいて下さい。
 *	  上記以外のプログラムインターフェイスはこれまでと同じであり、アプリケーションはTAPシーケンサとTAPミキサーの関数を介してサウンドを再生して下さい。
 *	- Dxlibのサウンド機能よりも、ADXのサウンド機能の方が、直観的であり使い易いです。
 *	  DxlibはDirectSound由来の構造になっているためか(?)フレーズとチャネルが一体化している使い辛さがあり、現在の当モジュールの使い方では一種類のフレーズを複数のチャネルで同時に鳴らせません。
 *	  それに対して、ADXのサウンド機能はフレーズとチャネルが分離している判り易い構造であり(P/ECEも同様です)、一種類のフレーズを複数のチャネルで鳴らす処理も自然に行えます。
 *	  ただし、ADXは圧縮サウンドファイルの形式が特殊な独自形式で、データを作り辛いという欠点が有ります。(CRIの開発環境のcriatomencd.exe等はフリーソフトではないため)
 *	- そんなわけで、Dxlibのサウンド機能にもADXのサウンド機能にもそれぞれ利点欠点が有るため、当モジュールはどちらも対応出来るようにしておきました。
 *	  どちらを使うかで圧縮サウンドファイルの形式を変える必要が有るので、データを作り始める時にどちらかを選択する方が良いと思います。
 *	* Mon Apr 25 22:45:55 JST 2016 Naoyuki Sawa
 *	- DxLib Ver 3.16c(2016/05/05版)で、GetMovieBaseImageToGraph()にImageUpdateFlagSetOnly引数が追加された事に伴い、ImageUpdateFlagSetOnly=TRUEにして呼び出すように変更しました。
 *	* Mon May 09 21:19:29 JST 2016 Naoyuki Sawa
 *	- ADXのサウンド機能を完全に切り離してビルド出来るようにしました。(前回までは常にSofdecHelper.dllをリンクしてしまっていました。)
 *	  USE_ADXとUSE_SOFDECをどちらも定義しなければ、SofdecHelper.dllが無くても当ライブラリをビルド出来、SofdecHelper.dllが無くてもアプリケーションを実行出来ます。
 *	  純粋にDxLibだけを使うアプリケーションを作成する場合は、上記のようにして当ライブラリをビルドしておいて下さい。
 *	- ADXのサウンド機能対応を有効にしてビルドするには、DxlibHelper.cpp内のUSE_ADXシンボルを定義して下さい。
 *	  2016/05/09現在、/clip/test.win/app.h,及び,cpp.cppにもUSE_ADXシンボルが有りますが、全く別物で有る事に注意して下さい。
 *	  DxlibHelper.cppのUSE_ADXシンボルは、ライブラリとしてADXのサウンド機能対応を有効にするかどうかの切り替えです。
 *	  /clip/test.win/app.h,及び,cpp.cppのUSE_ADXシンボルは、アプリケーションがADXのサウンド機能を使用するかどうかの切り替えです。
 *	* Sun May 15 21:18:41 JST 2016 Naoyuki Sawa
 *	- 既存のauto_free_grp()関数を、auto_stop_grp()に名前変更しました。
 *	  処理内容は変えていません。
 *	- 名前変更した理由は、この関数は「今回のフレームでplay_grp()が呼ばれなかったムービーグラフィックを自動的に停止する」関数であり、言い換えると「自動的にstop_grp()を行う」関数だからです。
 *	  変更前の名前では、「自動的にfree_grp()を行う」関数のように見えますが、実際にはそうではありません。
 *	  この関数は、ムービーグラフィックだけに関する処理であり、静止画グラフィックは開放しません。
 *	  上記のような混乱を避けるために、関数名が実態に合うように変更する事にしました。
 *	* Mon May 16 21:56:02 JST 2016 Naoyuki Sawa
 *	- free_all_res(),free_all_grp(),free_all_snd()を追加しました。
 *	  使用方法は、free_all_res(),free_all_grp(),free_all_snd()の実装部のコメントを参照して下さい。
 *	* Sun Jul 31 21:00:54 JST 2016 Naoyuki Sawa
 *	- Sofdecムービーの再生処理を、ARGBでなくYUVAを使用するようにして高速化しました。
 *	  やや大幅にコードを変更したので、変更前のコードはコメントアウトして残してありません。
 *	  変更前のコードを参照する必要が有る場合は、前回のアーカイブを参照して下さい。
 *	  尚、今回の当モジュールの変更による、グローバル関数仕様の変更は無く、アプリケーションのソースコードの修正は不要です。
 *	- 高速化した方法は、以下の通りです。
 *	  □変更前は、以下の流れで再生処理を行っていました。
 *	  │①Sofdec2のAPI criMana_InitializeFrameARGB32()を使って、デコード済みのYUVプレーンから、ARGB形式の基本イメージデータを取得する。
 *	  │  ・criMana_InitializeFrameARGB32()は、CPUによるYUVA⇒ARGB変換処理であり、かなり遅いようです。これが、速度低下の原因の一つになっていました。
 *	  │  ・criMana_InitializeFrameARGB32()は、バッファへ大量のメモリ書き込みも伴います。これも、速度低下の原因の一つになっていました。
 *	  │②Dxlib関数の、ReCreateGraphFromBaseImage()を使って、ARGB形式のテクスチャを更新します。
 *	  │  ・この時、Dxlib内部でカラーマッチング処理を経由しているか判らないのですが、結構遅いようです。これも、速度低下の原因の一つになっていました。
 *	  │③通常のグラフィック描画と同じ方法で、ムービーテクスチャを描画します。
 *	  □変更後は、以下の流れで再生処理を行うようになりました。
 *	  │①デコード済みのYUVプレーンを直接参照するようにしました。
 *	  │  ・Sofdec2のムービーデコード処理以外には、オーバーヘッドは生じなくなりました。
 *	  │②Dxlib関数の、ReCreateGraphFromBaseImage()を使って、YUVA形式のテクスチャを更新します。
 *	  │  ・UプレーンとVプレーンが少し小さい分、転送面積的に少し高速になりました。
 *	  │    また、この時、Dxlib内部でカラーマッチング処理は経由しないようですし、総合的にARGB形式のテクスチャ更新よりも高速なようです。
 *	  │③通常のグラフィック描画とは処理分けして、ピクセルシェーダを用いて、YUVA形式のムービーテクスチャを描画します。
 *	* Mon Aug 01 21:12:56 JST 2016 Naoyuki Sawa
 *	- DxLibがDirect3D9を選択した場合も、Sofdec2ムービーを再生出来るようにしました。
 *	- 「USE_SOFDEC_D3D9」シンボルを定義すると、DxLibがDirect3D9を選択した場合も、Sofdec2ムービーを再生出来るようにします。
 *	  「USE_SOFDEC_D3D9」シンボルを定義しなければ、DxLibがDirect3D11を選択した場合しか、Sofdec2ムービーを再生出来ません。
 *	  具体的には、以下の通りです。
 *	- 2016/07/31の変更により、Sofdec2ムービーの描画には、ピクセルシェーダを使用するようになりました。
 *	  ピクセルシェーダは、Direct3D9用,又は,Direct3D11用よって、異なるシェーダモデルを使う必要が有り、互換性が有りません。
 *	  2016/07/31の時点ではDirect3D11しか想定していなかったのですが、Direct3D9が選択されてしまうPCもたまに有るので、Direct3D9にも対応しておく事にしました。
 *	  例えば、Intel GMA X3000や、ATI Mobility Radeon HD 4200では、DxLibがDirect3D9を選択するようです。(D3D11のフィーチャーレベル不足のようです。)
 *	- 尚、今回のDirect3D9対応は、表示が出来る程度の対応であり、速度やメモリ効率は考慮していません。
 *	  DxLibにおいて、DX_GRAPHICSIMAGE_FORMAT_3D_ONE_I8はD3D11の場合はD_DXGI_FORMAT_R8_UNORMにマップされますが、D3D9の場合はA8R8G8B8にマップされるようです。
 *	  シェーダの処理的には同じ処理で同じ表示結果になるのですが、おそらく、メモリ効率も速度効率も悪いと思います。(詳細は未検証)
 *	  極力、DxLibがDirect3D11を選択する環境で、実行するようにして下さい。
 *	- もし今後、Direct3D9対応が不要になった場合は、「USE_SOFDEC_D3D9」シンボルを定義しないように変更して下さい。
 *	* Tue Aug 02 21:11:08 JST 2016 Naoyuki Sawa
 *	- 自然遷移通知を追加しました。
 *	  詳細は、cliptaps.c の同日のコメントを参照して下さい。
 *	- 2016/08/02現在はまだ、自然遷移通知を有効に利用しておらず、再生開始処理と同じ処理を行っています。
 *	  今後、当モジュールがADX2のシームレス連続再生機能に対応する時に、自然遷移通知を利用する予定です。
 *	  尚、SofdecHelper.dllは、2016/08/01時点でADX2のシームレス連続再生機能に対応済みです。
 *	* Tue Aug 02 22:11:15 JST 2016 Naoyuki Sawa
 *	- cliptimm.hのST_TimMgrFunc構造体を変更したことに伴い、当モジュールも変更しました。
 *	  詳細は、cliptimm.h の同日のコメントを参照して下さい。
 *	* Sun Aug 07 21:13:31 JST 2016 Naoyuki Sawa
 *	- DxLibにDrawOval_Rect()が追加された事に伴い、draw_oval_subr()が使用する関数を、DrawOval()⇒DrawOval_Rect()に変更しました。
 *	  draw_oval_subr()の描画における誤差が低減しましたが、見た目の動作は変更有りません。
 *	* Fri Aug 12 23:26:15 JST 2016 Naoyuki Sawa
 *	- draw_strf_handle(),draw_strv_handle(),draw_str_handle(),CbkQue_draw_strf_handle()を追加しました。
 *	  DrawExtendStringToHandle()を利用して、文字列を描画します。
 *	  DrawExtendStringToHandle()を利用する事にした理由は、以下の通りです。
 *	- これまで、DxLibのDrawString()系関数は遅いと思っていたので、避けていました。
 *	  その代わりに、埋め込みテクスチャフォントを使用して、draw_str()等で文字列を描画していました。
 *	  しかし、埋め込みテクスチャフォントは小さいので、大きな文字を描画した時に見栄えが悪い問題が有りました。
 *	  改めて試してみた所、DxLibのDrawString()系関数でフォントを変えながら描画すると確かに遅いのですが、DrawStringToHandle()系関数を使えば遅くない事が判りました。
 *	  そこで、DrawStringToHandle()系関数の一つである、DrawExtendStringToHandle()を使って文字列を描画する事にしました。
 *	- draw_str_handle()等のFontHandle引数には、CreateFontToHandle()で作成したフォントハンドルを直接指定して下さい。
 *	  CbkQue_draw_strf_handle()を呼び出す場合、実際に描画が行われるまで、フォントハンドルを削除しないように注意して下さい。
 *	- 今後は、埋め込みテクスチャフォントによる描画(draw_str()等)は敢えて使用する必要は無いかも知れませんが、これまで安定して動作していたので残しておく事にします。
 *	* Sun Aug 14 21:50:35 JST 2016 Naoyuki Sawa
 *	- draw_strf_handle(),draw_strv_handle(),draw_str_handle(),CbkQue_draw_strf_handle()に、引数(ax,ay)を追加しました。
 *	  文字列を描画するアンカーポイントを指定するための引数です。
 *	  例えば、(ax=0.5,ay=1.0)を指定すると、引数(x,y)で指定した座標が、文字列の左右中央,下端に一致するように、文字列を描画します。
 *	- draw_ext(),CbkQue_draw_ext()の、引数の順序を変更しました。
 *	  draw_strf_handle(),draw_strv_handle(),draw_str_handle(),CbkQue_draw_strf_handle()の引数(ax,ay)が、色を指定する引数の直前である事と同様に、
 *	  draw_ext(),CbkQue_draw_ext()の引数(ax,ay)も、色を指定する引数の直前にする方が判り易いと思ったからです。
 *	- draw_str(),draw_strv(),draw_strf(),draw_str_framed(),draw_strv_framed(),draw_strf_framed(),CbkQue_draw_strf(),CbkQue_draw_strf_framed()にも、引数(ax,ay)を追加しました。
 *	  使用方法は、draw_strf_handle()等と同じです。
 *	  詳細は、上記のコメントを参照して下さい。
 *	* Tue Aug 16 21:54:11 JST 2016 Naoyuki Sawa
 *	- DxLib用の埋め込みテクスチャフォント描画の処理を、DxlibHelper.cpp⇒DxlibHelper_EmbFnt.cppへ分離しました。
 *	- DxLib用のスプライトフォント描画を追加しました。
 *	  実装は、DxlibHelper_SprFnt.cppに有ります。
 *	* Wed Aug 31 23:56:52 JST 2016 Naoyuki Sawa
 *	- draw_grp_ts(),draw_spr_ts(),及び,CbkQue_draw_grp_ts(),CbkQue_draw_spr_ts()を追加しました。
 *	* Tue Sep 13 21:11:40 JST 2016 Naoyuki Sawa
 *	- 描画オフセット処理(SetDrawOffset())を追加しました。
 *	  全ての描画処理に対するオフセットを指定するための機能です。
 *	  優先度付きバージョンであるCbkQue_SetDrawOffset()を使用すれば、特定の優先度の範囲の描画に対して個別にオフセットを適用する事も出来ます。
 *	* Sat Sep 17 21:29:14 JST 2016 Naoyuki Sawa
 *	- prep_grp(),prep_spr()を追加しました。
 *	  詳細は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
 *	* Sun Sep 18 21:28:04 JST 2016 Naoyuki Sawa
 *	- prep_phr()を追加しました。
 *	  詳細は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
 *	* Mon Sep 19 22:17:04 JST 2016 Naoyuki Sawa
 *	- SofdecHelper_Prepare()が戻り値を返すようになった事に伴い、prep_grp(),prep_spr()も戻り値を返すように変更しました。
 *	  戻り値の仕様は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
 *	- AdxHelper_Prepare()が戻り値を返すようになった事に伴い、prep_phr()も戻り値を返すように変更しました。
 *	  戻り値の仕様は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
 *	* Sat Sep 24 21:37:23 JST 2016 Naoyuki Sawa
 *	- FullyLoad(),FullyLoadText()を追加しました。
 *	  DxLibのFileRead_fullyLoad()系関数を簡単に使うためのラッパーです。
 *	- DXアーカイブ内にファイルが有ればそれを読み込み、無ければ通常のファイルを読み込みます。
 *	  (SetUseDXArchiveFlag(),SetDXArchivePriority()の設定に依存します。)
 *	* Tue Oct 04 23:23:40 JST 2016 Naoyuki Sawa
 *	- draw_grp_thick_polyline(),draw_spr_thick_polyline(),及び,CbkQue_draw_grp_thick_polyline(),CbkQue_draw_spr_thick_polyline()を追加しました。
 *	* Wed Oct 19 21:15:15 JST 2016 Naoyuki Sawa
 *	- DxlibHelper_SprFnt.cppに、SprFnt_DrawXF(),CbkQue_SprFnt_DrawXF()を追加しました。
 *	* Thu Oct 20 21:11:23 JST 2016 Naoyuki Sawa
 *	- DxlibHelper_SprFnt.cppに、「CbkQue_SprFnt_DrawXF()の使用例」を追記しました。
 *	* Sun Oct 23 10:04:30 JST 2016 Naoyuki Sawa
 *	- draw_polygon(),draw_polygon_fill(),及び,CbkQue_draw_polygon(),CbkQue_draw_polygon_fill()を追加しました。
 *	* Mon Oct 24 21:50:37 JST 2016 Naoyuki Sawa
 *	- vec2i_split_polygon_into_triangles()の戻り値の意味を変更した事に伴い、draw_polygon_fill()の処理も変更しました。
 *	* Sat Nov 05 21:12:06 JST 2016 Naoyuki Sawa
 *	- draw_box_mc(),及び,CbkQue_draw_box_mc()を追加しました。
 *	  '/clip/nuklear/nuklear_dxlib.cpp'のnk_dxlib_draw_rect_multi_color()を本実装するために必要になったからです。
 */
#ifndef __DXLIBHELPER_H__
#define __DXLIBHELPER_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	Direct3D互換のD3DCOLOR形式マクロ
 ****************************************************************************/
//□参照資料:/Program Files/Microsoft Visual Studio/VC98/Include/D3DTYPES.H
#ifndef _D3DTYPES_H_
//┌────┬────┬────┬────┐
//│alpha   │red     │green   │blue    │
//└────┴────┴────┴────┘
#define D3DRGBA(r,g,b,a)	RGBA_MAKE((r)*255,(g)*255,(b)*255,(a)*255)	//これだけ[0.0～1.0]。これ以外は[0～255]。
#define RGBA_MAKE(r,g,b,a)	((((uint8_t)(a))<<24)|(((uint8_t)(r))<<16)|(((uint8_t)(g))<<8)|((uint8_t)(b)))
#define RGBA_GETBLUE(rgba)	((uint8_t)(((int)(rgba))    ))
#define RGBA_GETGREEN(rgba)	((uint8_t)(((int)(rgba))>> 8))
#define RGBA_GETRED(rgba)	((uint8_t)(((int)(rgba))>>16))
#define RGBA_GETALPHA(rgba)	((uint8_t)(((int)(rgba))>>24))
#define RGBA_SETALPHA(rgba,a)	((((uint8_t)(a))<<24)|(((int)(rgba))&0xFFFFFF))
#define RGBA_TORGB(rgba)	RGBA_SETALPHA(rgba,0)
//┌────┬────┬────┬────┐
//│ignored │red     │green   │blue    │
//└────┴────┴────┴────┘
#define D3DRGB(r,g,b)		D3DRGBA(r,g,b,0)				//これだけ[0.0～1.0]。これ以外は[0～255]。
#define RGB_MAKE(r,g,b)		RGBA_MAKE(r,g,b,0)
#define RGB_GETBLUE(rgb)	RGBA_GETBLUE(rgb)
#define RGB_GETGREEN(rgb)	RGBA_GETGREEN(rgb)
#define RGB_GETRED(rgb)		RGBA_GETRED(rgb)
#define RGB_TORGBA(rgb)		RGBA_SETALPHA(rgb,255)
#endif//_D3DTYPES_H_
/****************************************************************************
 *	優先度付き描画
 ****************************************************************************/
#ifdef  __CLIP_CBKQ_H__	//一般的にDxlibHelper.hより先にclipcbkq.hをインクルードするので、DxlibHelper.hの時点で判断出来る。
void CbkQue_SetDrawOffset(ST_CbkQue* pCbkQue, int pri, int x, int y);	//この関数は、DxlibHelper.cpp内でUSE_DRAWOFFSETシンボルを定義した場合のみ使用出来ます。
void CbkQue_SetDrawArea(ST_CbkQue* pCbkQue, int pri, int x1, int y1, int x2, int y2);
void CbkQue_SetDrawAreaFull(ST_CbkQue* pCbkQue, int pri);
void CbkQue_draw_grp(ST_CbkQue* pCbkQue, int pri, int x, int y, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_ext(ST_CbkQue* pCbkQue, int pri, int x, int y, int iGrp, double scale_x, double scale_y, double rot, double ax, double ay, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_mod(ST_CbkQue* pCbkQue, int pri, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_grp_ts(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*u,v*/], int n, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_box(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_box_fill(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_box_mc(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, int rgba1/*左上*/, int rgba2/*右上*/, int rgba3/*右下*/, int rgba4/*左下*/, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_oval(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_oval_fill(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_polygon(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], int n/*3～*/, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_polygon_fill(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], int n/*3～*/, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_line(ST_CbkQue* pCbkQue, int pri, int x1, int y1, int x2, int y2, int w = 1, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_spr(ST_CbkQue* pCbkQue, int pri, int x, int y, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_spr2(ST_CbkQue* pCbkQue, int pri, int x, int y, int iSpr, double scale_x, double scale_y, double rot, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_spr3(ST_CbkQue* pCbkQue, int pri, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_spr_ts(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*u,v*/], int n, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_strf(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, ...);
void CbkQue_draw_strf_framed(ST_CbkQue* pCbkQue, int pri, int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, ...);
void CbkQue_draw_strf_handle(ST_CbkQue* pCbkQue, int pri, int x, int y, int FontHandle, double scale_x, double scale_y, double ax, double ay, int rgb, int edge_rgb, const char* fmt, ...);
void CbkQue_SprFnt_DrawF(ST_CbkQue* pCbkQue, int pri, struct _ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* fmt, ...);
void CbkQue_SprFnt_DrawXF(ST_CbkQue* pCbkQue, int pri, struct _ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* s1, const char* s2, double transition/*0.0～1.0*/);
#endif//__CLIP_CBKQ_H__	//一般的にDxlibHelper.hより先にclipcbkq.hをインクルードするので、DxlibHelper.hの時点で判断出来る。
/****************************************************************************
 *	DxLib用の描画関数ラッパー
 ****************************************************************************/
// - Win32プロジェクト用の、DxLib用の描画関数ラッパーです。
//   これまでは/clip/test.win/cpp.cppの中に置いていましたが、ある程度安定したので当モジュールの中へ移す事にしました。
//   load_grp()とfree_grp()はアプリケーション依存なので、引き続き/clip/test.win/cpp.cppの中に置いています。	⇒2016/02/03変更:load_grp()とfree_grp()も/clip/test.win/cpp.cpp⇒/clip/embedfont.cppへ移しました。
/*--------------------------------------------------------------------------*/
//下記の構造体を、アプリケーション側で定義して初期化して下さい。
//レジストリのアドレスや名前は、アプリケーションのビルド時に決定するので、ライブラリ側では判らないからです。
//テクスチャ描画を使わない場合は、構造体を初期化せずに値が不定のままでも構いません。
typedef struct _ST_TexInf {
	uint16_t		name_Path;			//=RegKey_Path					//┬この範囲のフィールドはアプリケーションのビルド時に静的に定義可能です。
	uint16_t		name_Loop;			//=RegKey_Loop					//│
	void			(*fnPreLoadGraph)(int iGrp);	//LoadGraph()の直前に呼び出される。(NULL可)	//┘
	const uint8_t*		pTexDef;			//=REG_open_key(TBL_RegTbl,RegKey_TexDef)	//─これだけはアプリケーションの実行開始後に動的に設定する必要が有ります。
} ST_TexInf;
extern ST_TexInf stTexInf;	//アプリケーション側で定義して初期化して下さい。
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SetDrawOffset(int x, int y);	//この関数は、DxlibHelper.cpp内でUSE_DRAWOFFSETシンボルを定義した場合のみ使用出来ます。
void draw_grp(int x, int y, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_ext(int x, int y, int iGrp, double scale_x, double scale_y, double rot, double ax, double ay, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_mod(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_grp_ts(const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*u,v*/], int n, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_box(int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_box_fill(int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_box_mc(int x, int y, int w, int h, int rgba1/*左上*/, int rgba2/*右上*/, int rgba3/*右下*/, int rgba4/*左下*/, int mode = DX_BLENDMODE_ALPHA);
void draw_oval(int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_oval_fill(int x, int y, int w, int h, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_polygon(const int xy[/*n*/][2/*x,y*/], int n/*3～*/, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_polygon_fill(const int xy[/*n*/][2/*x,y*/], int n/*3～*/, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_line(int x1, int y1, int x2, int y2, int w = 1, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_strf_handle(int x, int y, int FontHandle, double scale_x, double scale_y, double ax, double ay, int rgb, int edge_rgb, const char* fmt, ...);
void draw_strv_handle(int x, int y, int FontHandle, double scale_x, double scale_y, double ax, double ay, int rgb, int edge_rgb, const char* fmt, va_list ap);
void draw_str_handle(int x, int y, int FontHandle, double scale_x, double scale_y, double ax, double ay, int rgb, int edge_rgb, const char* s);
/*--------------------------------------------------------------------------*/
//下記の構造体を、アプリケーション側で定義して初期化して下さい。
//レジストリのアドレスや名前は、アプリケーションのビルド時に決定するので、ライブラリ側では判らないからです。
//スプライト描画を使わない場合は、構造体を初期化せずに値が不定のままでも構いません。
typedef struct _ST_SprInf {
	uint16_t		name_TexNo;			//=RegKey_TexNo					//┬この範囲のフィールドはアプリケーションのビルド時に静的に定義可能です。
	uint16_t		name_x;				//=RegKey_x					//│
	uint16_t		name_y;				//=RegKey_y					//│
	uint16_t		name_w;				//=RegKey_w					//│
	uint16_t		name_h;				//=RegKey_h					//│
	uint16_t		name_cx;			//=RegKey_cx					//│
	uint16_t		name_cy;			//=RegKey_cy					//│
	uint16_t		name_Param;			//=RegKey_Param					//┘
	const uint8_t*		pSprDef;			//=REG_open_key(TBL_RegTbl,RegKey_SprDef)	//─これだけはアプリケーションの実行開始後に動的に設定する必要が有ります。
} ST_SprInf;
extern ST_SprInf stSprInf;	//アプリケーション側で定義して初期化して下さい。
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct _ST_SprDef {
	int			iTexNo;				//グラフィック番号。draw_grp()等のiGrpに渡せる値です。
	int			sx, sy;				//左上座標
	int			w, h;				//幅、高さ
	int			cx, cy;				//原点オフセット
	int			iParam;				//(未使用)
} ST_SprDef;
void get_sprDef(int iSpr, ST_SprDef* pSprDef);
void draw_spr(int x, int y, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_spr2(int x, int y, int iSpr, double scale_x, double scale_y, double rot, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_spr3(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_spr_ts(const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*u,v*/], int n, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
/****************************************************************************
 *	太いポリラインの描画
 ****************************************************************************/
void draw_grp_thick_polyline(const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*進行方向左側,進行方向右側*/][2/*u,v*/], int n/*0不可*/, int w, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void draw_spr_thick_polyline(const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*進行方向左側,進行方向右側*/][2/*u,v*/], int n/*0不可*/, int w, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_grp_thick_polyline(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*進行方向左側,進行方向右側*/][2/*u,v*/], int n/*0不可*/, int w, int iGrp, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
void CbkQue_draw_spr_thick_polyline(ST_CbkQue* pCbkQue, int pri, const int xy[/*n*/][2/*x,y*/], const double uv[/*n*/][2/*進行方向左側,進行方向右側*/][2/*u,v*/], int n/*0不可*/, int w, int iSpr, int rgba = -1, int mode = DX_BLENDMODE_ALPHA);
/****************************************************************************
 *	DxLib用のムービーグラフィック管理
 ****************************************************************************/
// * Mon Jan 25 21:57:35 JST 2016 Naoyuki Sawa
// - play_grp(),stop_grp(),auto_free_grp()を追加しました。
//   ムービーグラフィックの再生状態を管理する関数です。
// - アプリケーションは、draw_grp()等でムービーグラフィックを描画する場合に、毎フレームplay_grp()を呼び出して下さい。
//   毎フレームに一回、auto_free_grp()を呼び出して下さい。
//   普通の使い方では、stop_grp()を呼び出す必要は有りません。
// * Wed Mar 23 21:50:41 JST 2016 Naoyuki Sawa
// - get_grp_total_time(),get_spr_total_time()を追加しました。
//   2016/03/23現在の所、ogv専用です。
//   もし今後、ogv以外(avi等)のムービーに対して当関数を呼び出す必要が生じたら、ogv以外(avi等)のムービーに対する処理を実装して下さい。
//   詳細は、get_grp_total_time()関数内のコメントを参照して下さい。
// - 今回追加した関数は、DxLibの関数GetMovieTotalFrameToGraph()とGetOneFrameTimeMovieToGraph()をラッピングしたものです。
//   追加した目的は、実行時にムービーの長さを求めて、再生し終わるまで待つ場合などに使用するためです。
//   別の方法として、GetMovieStateToGraph()を使って待つ方法も考えましたが、その方法は使い辛い事が判ったので、GetMovieStateToGraph()はラッピングしませんでした。
//   GetMovieStateToGraph()が使い辛い理由は、CbkQue_draw_grp()等を使ってムービーを再生している場合、実際に再生開始するのがそのフレームの終了時まで遅延してしまい、そのフレームの中で判断を行うと'停止済み'と判断してしまうからです。
//   それを回避しようとするとフラグ管理が複雑になってバグの原因になりそうなので、それよりも単純にムービーの総時間を求めてその時間ぶん待つ方が良いと思いました。
// * Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
// - play_grp(),及び,play_spr()関数の、bLoop引数を削除しました。
// * Thu Apr 07 21:58:31 JST 2016 Naoyuki Sawa
// - play_grp()をローカル変数に変更しました。play_spr()を削除しました。
// * Sun May 15 21:18:41 JST 2016 Naoyuki Sawa
// - 既存のauto_free_grp()関数を、auto_stop_grp()に名前変更しました。
//   処理内容は変えていません。
// - 名前変更した理由は、この関数は「今回のフレームでplay_grp()が呼ばれなかったムービーグラフィックを自動的に停止する」関数であり、言い換えると「自動的にstop_grp()を行う」関数だからです。
//   変更前の名前では、「自動的にfree_grp()を行う」関数のように見えますが、実際にはそうではありません。
//   この関数は、ムービーグラフィックだけに関する処理であり、静止画グラフィックは開放しません。
//   上記のような混乱を避けるために、関数名が実態に合うように変更する事にしました。
void stop_grp(int iGrp);
void auto_stop_grp();
int get_grp_total_time(int iGrp);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
// * Fri Feb 05 21:49:20 JST 2016 Naoyuki Sawa
// - play_spr()とstop_spr()を追加しました。
//   これまでもget_sprDef()とplay_grp(),及び,stop_grp()を組み合わせれば可能ではあったのですが、使用頻度が高いので手間を省くためにユーティリティ関数として用意する事にしました。
// * Wed Apr 06 21:53:01 JST 2016 Naoyuki Sawa
// - play_grp(),及び,play_spr()関数の、bLoop引数を削除しました。
// * Thu Apr 07 21:58:31 JST 2016 Naoyuki Sawa
// - play_grp()をローカル変数に変更しました。play_spr()を削除しました。
void stop_spr(int iSpr);
int get_spr_total_time(int iSpr);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
// * Sat Sep 17 21:29:14 JST 2016 Naoyuki Sawa
// - prep_grp(),prep_spr()を追加しました。
//   詳細は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
// * Mon Sep 19 22:17:04 JST 2016 Naoyuki Sawa
// - SofdecHelper_Prepare()が戻り値を返すようになった事に伴い、prep_grp(),prep_spr()も戻り値を返すように変更しました。
//   戻り値の仕様は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
int prep_grp(int iGrp);
int prep_spr(int iSpr);
/****************************************************************************
 *	DxLib用の埋め込みテクスチャフォント描画
 ****************************************************************************/
// - Win32プロジェクト用の、DxLib用の埋め込みテクスチャフォント描画です。
//   DxLibのDrawString()は遅いので、なるべく以下の関数群を使って下さい。
// - pceFontPut()に相当する、1文字単位の描画関数は、用意しませんでした。
//   高速化が目的なので、非効率的な1文字単位の描画は不要だと思ったからです。
// - 引数w,hには、半角文字の描画サイズを指定して下さい。
//   w=4,h=8を指定すれば、等倍サイズでの描画となります。
void draw_strf(int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, ...);
void draw_strv(int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, va_list ap);
void draw_str(int x, int y, int w, int h, double ax, double ay, int rgb, const char* s);
void draw_strf_framed(int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, ...);
void draw_strv_framed(int x, int y, int w, int h, double ax, double ay, int rgb, const char* fmt, va_list ap);
void draw_str_framed(int x, int y, int w, int h, double ax, double ay, int rgb, const char* s);
/****************************************************************************
 *	DxLib用のスプライトフォント描画
 ****************************************************************************/
typedef struct _ST_SprFnt ST_SprFnt;
/*--------------------------------------------------------------------------*/
ST_SprFnt* SprFnt_Load(const char* fname, const void* pEnmKey, int _RegKey_SprNo, const char* FontName = "Font");
ST_SprFnt* SprFnt_Parse(const char* s, const void* pEnmKey, int _RegKey_SprNo, const char* FontName = "Font");
void SprFnt_Free(ST_SprFnt* pSprFnt);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SprFnt_Draw(ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* s);
void SprFnt_DrawV(ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* fmt, va_list ap);
void SprFnt_DrawF(ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* fmt, ...);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void SprFnt_DrawXF(ST_SprFnt* pSprFnt, int x, int y, double scale_x, double scale_y, double ax, double ay, int rgba, int mode, const char* s1, const char* s2, double transition/*0.0～1.0*/);
/****************************************************************************
 *	DxLib用のサウンド関数ラッパー
 ****************************************************************************/
// - Win32プロジェクト用の、DxLib用のサウンド関数ラッパーです。
//   これまでは/clip/test.win/cpp.cppの中に置いていましたが、ある程度安定したので当モジュールの中へ移す事にしました。
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
//下記の構造体を、アプリケーション側で定義して初期化して下さい。
//レジストリのアドレスや名前は、アプリケーションのビルド時に決定するので、ライブラリ側では判らないからです。
//テクスチャ描画を使わない場合は、構造体を初期化せずに値が不定のままでも構いません。
typedef struct _ST_PhrInf {
	uint16_t		name_Path;			//=RegKey_Path					//┐
	uint16_t		name_Next;			//=RegKey_Next					//├この範囲のフィールドはアプリケーションのビルド時に静的に定義可能です。
	void			(*fnPreLoadSoundMem)(int iPhr);	//LoadSoundMem()の直前に呼び出される。(NULL可)	//┘
	const uint8_t*		pPhrDef;			//=REG_open_key(TBL_RegTbl,RegKey_PhrDef)	//─これだけはアプリケーションの実行開始後に動的に設定する必要が有ります。
} ST_PhrInf;
extern ST_PhrInf stPhrInf;	//アプリケーション側で定義して初期化して下さい。
/*--------------------------------------------------------------------------*/
extern ST_TapSeq*		pTapSeq;			//TAPシーケンサ		//init_snd()で作成されます。アプリケーションから直接使用して下さい。
extern ST_TapMxr*		pTapMxr;			//TAPミキサー		//init_snd()で作成されます。アプリケーションから直接使用して下さい。
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct _ST_SndInf {
	//TAPシーケンサの設定
	uint16_t		nPhr;				//フレーズ数
	uint8_t			nDevCh;				//デバイスチャネル数
	uint8_t			nLogCh;				//論理チャネル数
	uint8_t			nSeqCh;				//シーケンサチャネル数
	uint8_t			iCont;				//ループフレーズ引き継ぎ時間[ms]
	uint8_t			nEvt;				//イベント記録数
	uint8_t			iEvtMsk;			//イベントマスク
	const uint8_t* const	(*TBL_TapSet)/*[nLogCh]*/;	//TAPセット
	//TAPミキサーの設定
	uint8_t			nMxrCh;				//ミキサチャネル数
	const int* const	(*TBL_MxrChMask)/*[nLogCh]*/;	//ミキサーチャネルマスク
} ST_SndInf;
extern ST_SndInf stSndInf;	//アプリケーション側で定義して初期化して下さい。
void init_snd(ST_TimMgr* pTimMgr, int _use_adx);
/*--------------------------------------------------------------------------*/
// * Sun Sep 18 21:28:04 JST 2016 Naoyuki Sawa
// - prep_phr()を追加しました。
//   詳細は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
// * Mon Sep 19 22:17:04 JST 2016 Naoyuki Sawa
// - AdxHelper_Prepare()が戻り値を返すようになった事に伴い、prep_phr()も戻り値を返すように変更しました。
//   戻り値の仕様は、/clip/tool/SofdecHelper/SofdecHelper.cの同日のコメントを参照して下さい。
int prep_phr(int iPhr);
/****************************************************************************
 *	その他のユーティリティ関数
 ****************************************************************************/
int GetSubMonitorRect(RECT* pSubMonitorRect);
void free_all_res();	//─┐
void free_all_grp();	//←┤
void free_all_snd();	//←┘
void* FullyLoad(const char* FilePath);
char* FullyLoadText(const char* FilePath);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__DXLIBHELPER_H__
