/*	
 *	clipwin.h
 *
 *	Windows専用ルーチンを集めました。
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2002 Naoyuki Sawa
 *
 *	* Wed Apr 24 09:26:00 JST 2002 Naoyuki Sawa
 *	- 作成開始。
 *	* Sat May 25 17:42:00 JST 2002 Naoyuki Sawa
 *	  P/ECEの関数仕様に近づけるため、書き直し。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_WIN_H__
#define __CLIP_WIN_H__

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

/* piece.hより */
#define INVALIDVAL (-1)
#define INVALIDPTR ((void*)-1)

/* piece_bmp.hより */
typedef struct _PIECE_VRAM {
	short w;
	short h;
	unsigned char* buf;
} PIECE_VRAM;

/* バイナリ互換 */
typedef TEXTURE PIECE_BMP;

/* draw.hより */
#define DRW_PARAM	0x3f	/* パラメータマスク */
#define DRW_NOMAL	0x00	/* ・ベタ転送       */
#define DRW_REV		0xc0	/* 反転ビットマスク */
#define DRW_REVX	0x80	/* ・横反転フラグ   */
#define DRW_REVY	0x40	/* ・縦反転フラグ   */

/* draw.hより */
typedef struct _DRAW_OBJECT {
	PIECE_VRAM* dest;
	short dx, dy;
	short dw, dh;
	PIECE_BMP* src;
	short sx, sy;
	RECT clip;
	unsigned char disp;
	unsigned char param;
	unsigned char type;
	unsigned char layer;
} DRAW_OBJECT;

/* 仮想画面を設定します。
 * [in]
 *	vram		設定する仮想画面。
 *			INVALIDPTRを指定すると、設定は変更せずに、現在の仮想画面を返します。
 * [out]
 *	戻り値		以前に設定されていた仮想画面を返します。
 * [note]
 *	* P/ECEでは仮想画面サイズが固定なので、直接、バッファアドレスを指定しますが、
 *	  Windowsでは仮想画面サイズが可変なので、PIECE_VRAMを指定します。
 *	* vramには、SURFACE構造体へのポインタをキャストして指定することができます。
 *	  SURFACE構造体の前半部分は、PIECE_VRAM構造体とバイナリ互換だからです。
 *	  <例>
 *		SURFACE surface = { DISP_X, DISP_Y, vbuff, zbuff };
 *		(中略)
 *		pceLCDSetBuffer((PIECE_VRAM*)&surface);
 */
PIECE_VRAM* pceLCDSetBuffer(PIECE_VRAM* vram);

/* 仮想画面を転送します。
 * [in]
 *	dc		転送先ＤＣ。
 *	dx,dy,dw,dh	転送先矩形。
 *	sx,sy,sw,sh	転送元矩形。
 *			※swに0を指定すると、サーフェイスの幅　が用いられます。
 *			※shに0を指定すると、サーフェイスの高さが用いられます。
 *	palette		パレットテーブル(RGBQUAD[256])。
 *			NULLを指定すると、4色グレイスケール(白,明,暗,黒)の64回繰り返しとなります。
 * [note]
 *	* この関数内では、転送先DCの伸縮BLTモードを変更していません。
 *	  高速化のために、呼び出し側で「SetStretchBltMode(dc, COLORONCOLOR)」を行ってください。
 *	  または高品質(低速)のために、「SetStretchBltMode(dc, HALFTONE)」とすることもできます。
 */
void pceLCDTrans(HDC dc, int dx, int dy, int dw, int dh, int sx, int sy, int sw, int sh, const RGBQUAD* palette);

/* TODO: 説明書け */
void pceLCDSetObject(DRAW_OBJECT* obj, PIECE_BMP* src, int dx, int dy, int sx, int sy, int w, int h, int param);

/* TODO: 説明書け */
int pceLCDDrawObject(DRAW_OBJECT obj);

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

#endif /*__CLIP_WIN_H__*/
