/*	
 *	cliplogb.h
 *
 *	ログバッファ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2014 Naoyuki Sawa
 *
 *	* Mon Dec 16 17:34:52 JST 2013 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Sep 17 00:00:00 JST 2014 Naoyuki Sawa
 *	- 文字列描画関数を、呼出し側が提供するようにしました。
 *	  これまではrender_reduced_string()を使っていましたが、読み易さのためにrender_string()でフォント2を使いたいことがあったからです。
 *	  日本語ログを表示する場合は、これまでどおりrender_reduced_string()を使いたい事も考えられるので、可変にするのが良いと思いました。
 *	  以上の理由により、文字列描画関数を呼出し側が提供するようにしました。
 */
#ifndef __CLIP_LOGB_H__
#define __CLIP_LOGB_H__

/****************************************************************************
 *	定数、構造体
 ****************************************************************************/

/* ログバッファ構造体 */
typedef struct _ST_LogBuf {
//{{2014/09/17追加:文字列描画関数を、呼出し側が提供するようにしました。
	int (*fnDraw)(int x, int y, const char* Str);/* アプリケーション定義の文字列描画関数 */
//}}2014/09/17追加:文字列描画関数を、呼出し側が提供するようにしました。
	short LineMax;	/* 最大行(=行数-1) */
	short LinePos;	/* 行位置(0〜LineMax) */
	char* LineMem[0/*LineMax+1*/];	/* 行バッファ(未格納の行はNULL) */
} ST_LogBuf;

/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/

/* ログバッファを作成します。
 * [in]
 *	LineNum		ログバッファの行数。(1以上)
 *  //{{2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
 *	fnDraw		アプリケーション定義の文字列描画関数。(NULL不可)
 *			│(x,y)の位置に(Str)を描画し、行の高さを返してください。
 *			│(Str)は空文字列ではないことと、改行文字が含まれないことを保証します。
 *			│文字列描画関数は、上記を前提として実装しても安全です。
 *  //}}2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
 * [out]
 *	戻り値		ST_LogBuf構造体。
 */
//{{2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
//ST_LogBuf* LogBuf_Init(int LineNum);
//↓2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
ST_LogBuf* LogBuf_Init(int LineNum, int (*fnDraw)(int x, int y, const char* Str));
//}}2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。

/* ログバッファを削除します。
 * [in]
 *	Me		ST_LogBuf構造体。
 */
void LogBuf_Free(ST_LogBuf* Me);

/* ログバッファのログ文字列をクリアします。
 * [in]
 *	Me		ST_LogBuf構造体。
 */
void LogBuf_Clear(ST_LogBuf* Me);

/* ログバッファにログ文字列を追加します。
 * [in]
 *	Me		ST_LogBuf構造体。
 *	Str		ログ文字列。
 */
void LogBuf_Print(ST_LogBuf* Me, const char* Str);

/* ログバッファにログ文字列を追加します。
 * [in]
 *	Me		ST_LogBuf構造体。
 *	Fmt		書式付き文字列。
 * [note]
 *	- 文字列展開バッファとして_def_vbuff[]を利用しています。
 */
void LogBuf_Printf(ST_LogBuf* Me, const char* Fmt, ...);

/* ログバッファを描画します。
 * [in]
 *	Me		ST_LogBuf構造体。
 *  //{{2014/09/17削除:文字列描画関数を、呼出し側が提供するようにしました。
 *  //	r		RENDER構造体。
 *  //}}2014/09/17削除:文字列描画関数を、呼出し側が提供するようにしました。
 *	x,y		描画位置。
 *  //{{2014/09/17削除:文字列描画関数を、呼出し側が提供するようにしました。
 *  //	c		文字色。
 *  //}}2014/09/17削除:文字列描画関数を、呼出し側が提供するようにしました。
 * [note]
 *	- 文字列描画関数としてrender_reduced_string()を利用しています。
 *	  従って16階調表示モードには対応していません。
 */
//{{2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
//void LogBuf_Draw(ST_LogBuf* Me, RENDER* r, int x, int y, int c);
//↓2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。
void LogBuf_Draw(ST_LogBuf* Me, int x, int y);
//}}2014/09/17変更:文字列描画関数を、呼出し側が提供するようにしました。

/****************************************************************************
 *	使用例
 ****************************************************************************/

//	ST_LogBuf* pLogBuf;
//	
//	static int LogBuf_fnDraw(int x, int y, const char* Str) { //ｱﾌﾟﾘｹｰｼｮﾝ定義の文字列描画関数
//		render_reduced_string(&render, x, y, Str, 3);
//		return 10;
//	}
//	
//	void app_init() {
//	  …
//	  pLogBuf = LogBuf_Init(9, LogBuf_fnDraw); //⇒ﾛｸﾞﾊﾞｯﾌｧを作成する｡行数は､画面一杯とする｡(10ﾋﾟｸｾﾙ×9行=90ﾋﾟｸｾﾙ)
//	  …
//	}
//	
//	void app_exit() {
//	  …
//	  LogBuf_Free(pLogBuf); //⇒ﾛｸﾞﾊﾞｯﾌｧを削除する｡
//	  …
//	}
//	
//	void app_main() {
//	  for(;;) {
//	    schedule();
//	    surface_clear(&surface, 0);
//	    if(joy & TRG_A) { LogBuf_Printf(pLogBuf, "乱数値 = %u", RND32(seed)); } //⇒Aﾎﾞﾀﾝが押されたらﾛｸﾞﾊﾞｯﾌｧにﾛｸﾞ文字列を追加する｡(日本語ok)
//	    if(joy & TRG_B) { LogBuf_Clear(pLogBuf); } //⇒Bﾎﾞﾀﾝが押されたらﾛｸﾞﾊﾞｯﾌｧのﾛｸﾞ文字列をｸﾘｱする｡
//	    LogBuf_Draw(pLogBuf, 0, //⇒ﾛｸﾞﾊﾞｯﾌｧを描画する｡
//	     (pLogBuf->LineMem[pLogBuf->LineMax] ? -2 : 0)); //⇒90ﾋﾟｸｾﾙ有る場合は最終行がはみ出すよりも先頭行がはみ出すようにする工夫｡(必須ではない)
//	  }
//	}

#endif /*__CLIP_LOGB_H__*/
