/*	
 *	clipsprf.h
 *
 *	スプライトフォント
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2017 Naoyuki Sawa
 *
 *	* Sat Mar 18 22:13:04 JST 2017 Naoyuki Sawa
 *	- 作成開始。
 *	  既存のDxlibHelper_SprFnt.cppを元にして作成しました。
 *	  当モジュールを作成する事にした理由は以下の通りです。
 *	- 既存のDxlibHelper_SprFnt.cppの関数はなかなか使い勝手が良く、実際のアプリケーション上でも2016/08〜2017/03の間に十分な動作検証が行えました。
 *	  そこで、DxlibHelper_SprFnt.cppを元にして、各環境でも同様の機能を使用できるようにしようと思いました。
 *	  具体的には、既存のDxlibHelper_SprFnt.cppの関数はC++言語とDxlib専用でしたが、C言語とP/ECEや、C#言語とUnity等でも使いたいと思いました。
 *	  そのために、DxlibHelper_SprFnt.cppがDxlibに依存している部分をアプリケーション定義のコールバック関数に分離して、共通化出来る部分をC言語で実装したのが当モジュールです。
 *	  当モジュールのC言語版を元にして、C#言語版版も実装して、libclip.netフォルダ内のライブラリに追加しました。
 *	- 既存のDxlibHelper_SprFnt.cppとの特に大きな違いとして、これまではスプライトフォント定義をYamlで記述し実行時にパースしていましたが、今後は専用のスクリプトで定義して予めdSprFntC.exeでコンパイルするようにしました。
 *	  そうした理由は、現在の所、C#言語(.NET Framework)でYamlをパースする標準的な方法が無いようだからです。
 *	  元々の理由は上記の通りではありますが、予めコンパイルするようになった事によって、実行時のパースエラーが発生しなくなったので、結果的に使い易さも改善したと思います。
 *	  (元々、既存のDxlibHelper_SprFnt.cppでYamlを使用して実行時にパースしていたのは、Yaml自体の勉強のためという理由が大きく、Yamlでなければいけない理由は特に無かったので…)
 *	* Sun Mar 19 22:19:43 JST 2017 Naoyuki Sawa
 *	- 1st リリース。
 *	* Mon Mar 20 22:44:17 JST 2017 Naoyuki Sawa
 *	- SprFnt_PrintXF_subr()にて、演算誤差で位置がぶれる問題を修正しました。
 *	  理論上は、常に補間処理を行っても同じ結果になるはずなのですが、実際には、演算誤差のために微妙にぶれが発生します。
 *	  特に、同じ座標同士で補間処理を行った場合に、文字の位置は変わらないはずなのに微妙にぶれるので目立ってしまいます。
 *	  実際の所、クロスフェードする文字同士の位置は同じ座標である事の方が圧倒的に多いので、この問題はかなり目立ちます。
 *	  そこで、この問題を回避するために、同じ座標である場合は、補間処理を行わずに、そのままの値を使う事にしました。
 *	  尚、異なる座標同士で補間処理を行う場合の演算誤差は対策していませんが、その場合はクロスフェード中に文字が移動するのに紛れて目立たないので問題無いと思います。
 *	* Tue Apr 04 23:33:32 JST 2017 Naoyuki Sawa
 *	- スプライトフォント描画に回転機能を追加しました。
 *	* Wed Apr 19 22:11:14 JST 2017 Naoyuki Sawa
 *	- SprFnt_GetSize()をローカル関数⇒グローバル関数に変更しました。
 */
#ifndef __CLIP_SPRF_H__
#define __CLIP_SPRF_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	定数
 *****************************************************************************/
//スプライトフォント,又は,スプライトフォント行のレジストリキーに属する、値の名前
// - 当モジュールの内部処理,及び,/clip/tool/dSprFntC/winapp.cにて使用しています。
//   アプリケーションが、これらの値を意識する必要は有りません。
#define SprFnt_SprNo	0	//0(blank),又は,スプライト番号(1〜0xFFFF)
#define SprFnt_NextX	1	//列ストライド。この文字を描いた後、この値の分、右へ進みます。
#define SprFnt_NextY	2	//行ストライド。一行に描いた文字の、この値の内、最大の値の分、改行時に下へ進みます。
#define SprFnt_DrawX	3	//描画オフセットX。スプライト原点Xを、この位置に描画します。
#define SprFnt_DrawY	4	//描画オフセットY。スプライト原点Yを、この位置に描画します。
/*****************************************************************************
 *	グローバル関数
 *****************************************************************************/
//{{2017/04/04変更:スプライトフォント描画に回転機能を追加しました。
//void SprFnt_Print(  const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double ax, double ay, int color, const char* s);
//void SprFnt_PrintV( const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double ax, double ay, int color, const char* fmt, va_list ap);
//void SprFnt_PrintF( const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double ax, double ay, int color, const char* fmt, ...);
//void SprFnt_PrintXF(const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double ax, double ay, int color, const char* s1, const char* s2, double transition/*0.0〜1.0*/);
//↓2017/04/04変更:スプライトフォント描画に回転機能を追加しました。
void SprFnt_Print(  const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, double rot, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, const char* s);
void SprFnt_PrintV( const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, double rot, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, const char* fmt, va_list ap);
void SprFnt_PrintF( const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, double rot, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, const char* fmt, ...);
void SprFnt_PrintXF(const void* pSprFnt, void (*fn)(void* user_data, int x, int y, double scale_x, double scale_y, double rot, int color, int iSprNo), void* user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, const char* s1, const char* s2, double transition/*0.0〜1.0*/);
//}}2017/04/04変更:スプライトフォント描画に回転機能を追加しました。
void SprFnt_GetSize(const void* pSprFnt, const char* s, /*[out]*/ int* p_size_x, /*[out]*/ int* p_size_y);	//{{2017/04/19追加:SprFnt_GetSize()をローカル関数⇒グローバル関数に変更しました。}}
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_SPRF_H__
