/*
 *	clip7seg.h
 *
 *	7セグメントディスプレイ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2015 Naoyuki Sawa
 *
 *	* Fri Nov 15 00:12:35 JST 2013 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'～'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Tue Dec 01 21:56:21 JST 2015 Naoyuki Sawa
 *	- render_7seg()を、'#ifdef  PIECE'～'#endif//PIECE'で囲みました。
 *	  Get7SegPat()は汎用なのでWin32プロジェクトでも使いたい事が有り、その時にrender_7seg()がコンパイルエラーになる事を避けるためです。
 *	  今回の変更による、既存のP/ECEプロジェクトへの影響は有りません。
 *	* Wed Dec 02 21:55:07 JST 2015 Naoyuki Sawa
 *	- render_font7(),render_string7(),render_printf7(),
 *	  render_font7_framed(),render_string7_framed(),render_printf7_framed()を追加しました。
 *	  これらは、render_7seg()を利用して、標準的な関数仕様の文字/文字列描画ルーチンとしたものです。
 *	  clipfnt8.cの実装をベースにして作成しましたので、詳細はclipfnt8.cを参照して下さい。
 *	- render_7seg()を、'小数点のみ'の場合のみ、セルの左下の位置にドットを打つように変更しました。
 *	  これまでは、'小数点のみ'の場合も、'数値部分+小数点'と同様に、描画幅=(w+3)で描いていました。
 *	  そのため、以下二点の問題が生じていました。
 *	  ①'小数点のみ'の左側に不自然な空白が出来て、見た目に不自然である。本来は、小数点の右側に空白が出来る方が、見た目に自然であり望ましい。
 *	  ②'小数点のみ'を描画した場合にも、固定ピッチでなくなる。'数値部分+小数点'を描画した場合に固定ピッチでなくなるのは止むを得ないが、'小数点のみ'でも固定ピッチでなくなるのは不便である。
 *	  今回の変更により、'小数点のみ'の描画幅は、'数値部分のみ'と同様の、描画幅=(w+1)となりました。
 *	  また、'小数点のみ'の場合にドットを打つ位置を、セルの左端にしました。
 *	  今回の変更により、前述の①②の問題点が解決しました。
 *	  ①'小数点のみ'の左側ではなく、右側に空白が出来るようになりました。
 *	  ②'小数点のみ'を描画した場合は、固定ピッチを維持できるようになりました。
 *	  なお、'数値部分+小数点'については、これまでと変わっていません。
 *	  '数値部分+小数点'を描画した場合は、固定ピッチでなくなる事に注意して下さい。
 *	- Get7SegPat()に、'-'に対して「-」,'_'に対して「_」のパターンを返す処理を追加しました。
 *	  これまでは、'-','_'に対しても'それ以外全て⇒「.」'と判断して、「.」のパターンを返していました。
 *	  数値とアルファベットと小数点以外は対応しないという方針のためにそうしていたのですが、実際に使って見ると'-','_'が表示出来ないのは不便でした。
 *	  そこで、'-','_'だけは特別に対応する事にしました。
 *	* Thu Dec 03 00:00:01 JST 2015 Naoyuki Sawa
 *	- Get7SegPat()のパターンを全て変更しました。
 *	  変更前は、数字,アルファベット,小数点,'-','_'だけに対応していましたが、変更後は、ASCII文字と半角カナ(JIS X 0201)に対応しました。
 *	  □参照ページ
 *	  │「無柵庵 +日記+」(http://rangycrow.hp2.jp/diary/diary.html)さんの、『2012 03 02 Fri』(http://rangycrow.hp2.jp/diary/1203diary.html#120301)の記事
 *	  │「WentWayUp: WebLog」(http://wentwayup.tamaliver.jp/)さんの、『7セグメントカタカナフォント』(http://wentwayup.tamaliver.jp/e67936.html)の記事
 */
#ifndef __CLIP_7SEG_H__
#define __CLIP_7SEG_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *
 ****************************************************************************/

/* 7セグメントディスプレイの個々のセグメント */
#define _7SEG_A   0x80 /* 上     */
#define _7SEG_B   0x40 /* 右上   */
#define _7SEG_C   0x20 /* 右下   */
#define _7SEG_D   0x10 /* 下     */
#define _7SEG_E   0x08 /* 左下   */
#define _7SEG_F   0x04 /* 左上   */
#define _7SEG_G   0x02 /* 中     */
#define _7SEG_DP  0x01 /* 小数点 */
#define _7SEG_ALL 0xFF /* 上記全ての組み合せ */

/****************************************************************************
 *
 ****************************************************************************/

/* 数字とアルファベットに対応する、7セグメントディスプレイのパターンを取得する。
 * [in]
 *	c	文字コード
 * [out]
 *	戻り値	_7SEG_A～_7SEG_DPの組み合せによる、7セグメントディスプレイのパターンを返す。
 *	    //{{2015/12/03削除:Get7SegPat()のパターンを全て変更しました。変更前は、数字,アルファベット,小数点,'-','_'だけに対応していましたが、変更後は、ASCII文字と半角カナ(JIS X 0201)に対応しました。
 *	    //	文字コードとパターンの対応は、以下の通り:
 *	    //	'0'～'9'          ⇒ 数字のパターンを返す。
 *	    //	'A'～'Z','a'～'z' ⇒ アルファベットのパターンを返す。大文字小文字の違いは無い。
 *	    //	' ','\t'          ⇒ 空白のパターンを返す。
 *	    //	'-'               ⇒ マイナスのパターンを返す。			//{{2015/12/02追加:Get7SegPat()に、'-'に対して「-」,'_'に対して「_」のパターンを返す処理を追加しました。}}
 *	    //	'_'               ⇒ アンダーバーのパターンを返す。		//{{2015/12/02追加:Get7SegPat()に、'-'に対して「-」,'_'に対して「_」のパターンを返す処理を追加しました。}}
 *	    //	それ以外          ⇒ 小数点のパターンを返す。(表現できない文字であるという意図)
 *	    //}}2015/12/03削除:Get7SegPat()のパターンを全て変更しました。変更前は、数字,アルファベット,小数点,'-','_'だけに対応していましたが、変更後は、ASCII文字と半角カナ(JIS X 0201)に対応しました。
 */
int Get7SegPat(int c);

#ifdef  PIECE
/* 7セグメントディスプレイのパターンを描画する。
 * [in]
 *	pat	_7SEG_A～_7SEG_DPの組み合せによる、7セグメントディスプレイのパターン。
 *	pat以外の引数は、render_font()と互換です。
 * [out]
 *	戻り値	render_font()と互換です。
 *		具体的には、以下の値を返す:
 *		・下位8ビット=フォントの幅
 *		  ((pat&_7SEG_DP)==0)ならば  ⇒ (w+1)
 *		  ((pat&_7SEG_DP)!=0)ならば  ⇒ (w+1)+2
 *		・上位8ビット=フォントの高さ ⇒ (h+1)
 * <使用例>
 *	//「-1.23E45」と表示します。
 *	x = 0;
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9,                 _7SEG_G, 3); //xは(5+1)  ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('1')|_7SEG_DP,3); //xは(5+1)+2ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('2'),         3); //xは(5+1)  ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('3'),         3); //xは(5+1)  ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('E'),         3); //xは(5+1)  ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('4'),         3); //xは(5+1)  ピクセル右へ進む
 *	x += (unsigned char)render_7seg(&render, x,0, 5,9, Get7SegPat('5'),         3); //xは(5+1)  ピクセル右へ進む
 */
int render_7seg(RENDER* render, int x, int y, int w, int h, int pat, int color);

/* * Wed Dec 02 21:55:07 JST 2015 Naoyuki Sawa
 * - render_font7(),render_string7(),render_printf7(),
 *   render_font7_framed(),render_string7_framed(),render_printf7_framed()を追加しました。
 *   これらは、render_7seg()を利用して、標準的な関数仕様の文字/文字列描画ルーチンとしたものです。
 *   clipfnt8.cの実装をベースにして作成しましたので、詳細はclipfnt8.cを参照して下さい。
 */
int render_font7(RENDER* render, int x, int y, int w, int h, int code, int color);
int render_string7(RENDER* render, int x, int y, int w, int h, const char* str, int color);
int render_printf7(RENDER* render, int x, int y, int w, int h, int color, const char* fmt, ...);
int render_font7_framed(RENDER* render, int x, int y, int w, int h, int code, int color);
int render_string7_framed(RENDER* render, int x, int y, int w, int h, const char* str, int color);
int render_printf7_framed(RENDER* render, int x, int y, int w, int h, int color, const char* fmt, ...);
#endif//PIECE

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif/*__CLIP_7SEG_H__*/
