/*	
 *	clipspr.h
 *
 *	簡易スプライトドライバを定義します。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2007 Naoyuki Sawa
 *
 *	* Sat Apr 24 06:00:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 *	* Thu Oct 25 11:37:22 JST 2007 Naoyuki Sawa
 *	- sprite_draw()をASM化しました。
 *	- SPRITE、SPRITE_DRIVER構造体に、レイアウト固定のコメントを追記しました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_SPR_H__
#define __CLIP_SPR_H__

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

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

/* Thu Oct 25 11:37:22 JST 2007 Naoyuki Sawa
 * - sprite_draw()のASM版からオフセット固定で直接扱うため、レイアウト固定とします。
 */
typedef struct _SPRITE {
	unsigned char texno;	/* +0,1: テクスチャ番号 */
	unsigned char x, y;	/* +1,2: 左上座標       */
	unsigned char w, h;	/* +3,2: 幅、高さ       */
	         char cx, cy;	/* +5,2: 原点オフセット */
	unsigned char param;	/* +7,1: pceLCDSetObject()のparamと同じです */
} SPRITE;			/* =8 */

/* スプライト番号宣言用。enumの中で使ってください。 */
#define SPRITE_INIT1(name,texno,x,y,w,h,cx,cy,param) name,

/* スプライト定義用。SPRITE[]の中で使ってください。 */
#define SPRITE_INIT2(name,texno,x,y,w,h,cx,cy,param) {(texno),(x),(y),(w),(h),(cx),(cy),(param)},

/*****************************************************************************
 *	内部使用
 *****************************************************************************/

/* Thu Oct 25 11:37:22 JST 2007 Naoyuki Sawa
 * - sprite_draw()のASM版からオフセット固定で直接扱うため、レイアウト固定とします。
 */
typedef struct _SPRITE_DRIVER {
	RENDER* render;					/* + 0,4 */
	const SPRITE* sprites/*[sprite_count]*/;	/* + 4,4 */
	int sprite_count;				/* + 8,4 */
	TEXTURE* textures/*[texture_count]*/;		/* +12,4 */
	int texture_count;				/* +16,4 */
} SPRITE_DRIVER;					/* =20 */

extern SPRITE_DRIVER sprite_driver;

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

/* スプライトドライバを初期化します。
 * [in]
 *	render		描画に利用するレンダラー。
 *	sprites		スプライト定義の先頭アドレス。
 *	sprite_count	スプライト定義の数。
 *	textures	テクスチャ定義の先頭アドレス。
 *	texture_count	テクスチャ定義の数。
 */
void sprite_init(RENDER* render,
	const SPRITE* sprites/*[sprite_count]*/, int sprite_count,
	TEXTURE* textures/*[texture_count]*/, int texture_count);

/* スプライトを描画します。
 * [in]
 *	x		スプライト原点のX座標。
 *	y		スプライト原点のY座標。
 *	sprno		スプライト番号。
 *	param		スプライト定義のparamとXORします。
 *			例えば、スプライト定義のparamにDRW_REVXが指定されている場合、
 *			param引数にもDRW_REVXを指定すると、相殺して反転無しで描画します。
 * [note]
 *	* あらかじめsprite_init()を呼んで、スプライトドライバを初期化しておいてください。
 */
void sprite_draw(int x, int y, int sprno, int param);

/* 拡縮回転スプライトを描画します。
 * [in]
 *	x		スプライト原点のX座標。
 *	y		スプライト原点のY座標。
 *	sprno		スプライト番号。
 *	param		スプライト定義のparamとXORします。
 *			例えば、スプライト定義のparamにDRW_REVXが指定されている場合、
 *			param引数にもDRW_REVXを指定すると、相殺して反転無しで描画します。
 *	scale_x		横拡大率。
 *	scale_y		縦拡大率。
 *	rot		回転角度。
 * [note]
 *	* あらかじめsprite_init()を呼んで、スプライトドライバを初期化しておいてください。
 */
void sprite_draw2(int x, int y, int sprno, int param, fixed scale_x, fixed scale_y, fixed rot);

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

#endif /*__CLIP_SPR_H__*/
