/*	
 *	clipwin.c
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2002 Naoyuki Sawa
 *
 *	* Wed Apr 24 09:26:00 JST 2002 Naoyuki Sawa
 *	- 作成開始。
 *	* Sun Jun  2 20:07:00 JST 2002 Naoyuki Sawa
 *	- pceLCDDrawObject()をclipdobj.cに分離。
 */
#include "clip.h"

static PIECE_VRAM* lcdbuff; /* 描画先・転送元となる仮想画面 */

PIECE_VRAM*
pceLCDSetBuffer(PIECE_VRAM* vram)
{
	PIECE_VRAM* old;

	/* 以前の仮想画面を退避します。 */
	old = lcdbuff;

	/* 新しい仮想画面を設定します。 */
	if(vram != INVALIDPTR) lcdbuff = vram;

	/* 以前の仮想画面を返します。 */
	return old;
}


void
pceLCDTrans(HDC dc, int dx, int dy, int dw, int dh, int sx, int sy, int sw, int sh, const RGBQUAD* palette)
{
	int i;
	struct {
		BITMAPINFOHEADER bi;
		RGBQUAD rgb[256];
	} bmi;
	BITMAPINFOHEADER* bi = &bmi.bi;
	RGBQUAD* rgb = bmi.rgb;

	/* DIB仕様: 4バイト(=4ピクセル)単位でなければいけません。 */
	ASSERT((lcdbuff->w & 3) == 0);

	/* 転送元のDIB情報を作成します。 */
	memset(bi, 0, sizeof(BITMAPINFOHEADER));
	bi->biSize = sizeof(BITMAPINFOHEADER);
	bi->biWidth = lcdbuff->w;
	bi->biHeight = -lcdbuff->h; /* トップダウン */
	bi->biPlanes = 1;
	bi->biBitCount = 8;
	if(palette != NULL) {
		memcpy(rgb, palette, sizeof(RGBQUAD) * 256);
	} else {
		for(i = 0; i < 256; i++) {
			rgb[i].rgbRed   =
			rgb[i].rgbGreen =
			rgb[i].rgbBlue  = (unsigned char)(85 * (3 - (i & 3)));
		}
	}

	/* DIBを転送します。 */
	if(sw == 0) sw = lcdbuff->w;
	if(sh == 0) sh = lcdbuff->h;
	StretchDIBits(dc,
		dx, dy, dw, dh,
		sx, sy, sw, sh,
		lcdbuff->buf, (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCCOPY);
}

void
pceLCDSetObject(DRAW_OBJECT* obj, PIECE_BMP* src, int dx, int dy, int sx, int sy, int w, int h, int param)
{
	/* 転送先の設定。 */
	obj->dest = lcdbuff;
	obj->dx   = dx;
	obj->dy   = dy;
	obj->dw   = w;
	obj->dh   = h;

	/* 転送元の設定。 */
	obj->src  = src;
	obj->sx   = sx;
	obj->sy   = sy;

	/* クリッピングの設定。 */
	obj->clip.left   = 0;
	obj->clip.top    = 0;
	obj->clip.right  = lcdbuff->w;
	obj->clip.bottom = lcdbuff->h;

	/* その他の設定。 */
	obj->param = param;
	obj->type  = 0;
}

/* 高速版pceLCDDrawObjectのコードを流用します。
 * 高速版pceLCDDrawObjectがサポートしない機能(1ビット画像など)を使うと、
 * DIE()で終了します。
 */
#define DISP_X			(DIE(), 0)
#define DISP_Y			(DIE(), 0)
#define pceLCDSetBuffer(a)	(DIE(), 0)
#define pceVectorSetKs(a, b)	(DIE(), 0)
#include "clipdobj.c"
int
pceLCDDrawObject(DRAW_OBJECT obj)
{
	return new_LCDDrawObject(obj);
}

/* hook_LCDDrawObject/unhook_LCDDrawObject未使用警告を抑制 */
#pragma warning(disable: 4505)
