/*
 *	cliprodg.h
 *
 *	ROaD GENerator
 *
 *	* Fri Jun 02 21:33:04 JST 2017 Naoyuki Sawa
 *	- 1st リリース。
 *	* Sat Jun 03 21:50:28 JST 2017 Naoyuki Sawa
 *	- RodGen_DrawLine2()を追加しました。
 *	  既存のRodGen_DrawLine1()とRodGen_DrawLine2()の違いは、引数の指定方法の違いだけであり、どちらを使っても同じ描画結果が得られます。
 *	  アプリケーション次第で使い易い方の関数を使って下さい。
 *	  一般的には、RodGen_DrawLine1()の方が柔軟性が高いですが、RodGen_DrawLine2()の方が直感的で使い易いです。
 *	  RodGen_DrawLine1()の方が柔軟性が高い理由は、RodGen_DrawLine1()で(zoom_n=0,zoom_d<0)に相当する描画が、RodGen_DrawLine2()では指定出来ないからです。
 *	  とは言え、RodGen_DrawLine1()で(zoom_n=0,zoom_d<0)に相当する描画に依存するようなアプリケーションは稀だと思うので、あまり気にする必要は有りません。
 *	* Sun Jun 04 22:03:50 JST 2017 Naoyuki Sawa
 *	- RodGen_DrawSeg()を追加しました。
 */
#ifndef __CLIP_RODG_H__
#define __CLIP_RODG_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	構造体
 ****************************************************************************/
//ROaD GENerator
typedef struct _ST_RodGen {				//アセンブラ版から参照するのでレイアウト固定です。
	//--- VRAM ---
	uint8_t*		vram;			//+ 0, 4 先頭アドレス
	uint16_t		vram_width;		//+ 4, 2 1ライン当たりのピクセル数		1〜UINT16_MAX
	uint16_t		vram_pitch;		//+ 6, 2 次のラインへのバイトオフセット		1〜UINT16_MAX
	//--- Road GraPHICS ---
	const uint8_t*		rgfx;			//+ 8, 4 先頭アドレス
	uint16_t		rgfx_width;		//+12, 2 1パターン当たりのピクセル数		1〜UINT16_MAX
	uint16_t		rgfx_pitch;		//+14, 2 次のパターンへのバイトオフセット	1〜UINT16_MAX
} ST_RodGen;						//=16
/****************************************************************************
 *	グローバル関数
 ****************************************************************************/
void RodGen_Init(ST_RodGen* pRodGen, uint8_t* vram, int vram_width, int vram_pitch, const uint8_t* rgfx, int rgfx_width, int rgfx_pitch);
void RodGen_DrawLine1(ST_RodGen* pRodGen, int iLine, int iRoad, int offset, int zoom_n/*分子*/, int zoom_d/*分母*/);
void RodGen_DrawLine2(ST_RodGen* pRodGen, int iLine, int iRoad, int x1, int x2);
void RodGen_DrawSeg(ST_RodGen* pRodGen, int iLine1/*含む*/,   int iRoad1, int x11, int x21,	//開始ライン(描く)	┬(iLine1<iLine2)でも(iLine1>iLine2)でも(iLine1==iLine2)でも構いません。
                                        int iLine2/*含まず*/, int iRoad2, int x12, int x22,	//目標ライン(描かない)	┘
                                        int iLineMin/*含む*/, int iLineMax/*含む*/);		//画面の描画範囲
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_RODG_H__
