/*
	Render function average benchmarks:
		RenderSingle:			0ms
		RenderSprite:			0ms
		RenderMultiple:			0ms
		RenderMultipleSprites:	2ms
*/

#ifndef __GPUMain__
#error "Main.h must be included for Renders.h to function"
#endif

int GPUAPI RenderMultipleSprites(HDC hdc, BYTE *cart, int SpritesX, int SpritesY, int DrawX, int DrawY, int ZoomFactor)
{

#ifdef _DEBUG
	long tc;
	tc = GetTickCount();
#endif

	for(int ly=0;ly<SpritesY;ly++)
	{
		for(int lx=0;lx<SpritesX;lx++)
		{
			RenderSprite(hdc, cart, DrawX + (lx*16*ZoomFactor), DrawY + (ly*16*ZoomFactor), ZoomFactor);
			cart=cart+64;
		}
	}

#ifdef _DEBUG
	tc = GetTickCount() - tc;

	return tc;
#endif

	return 0;
}


int GPUAPI RenderMultiple(HDC hdc, BYTE *cart, int TilesX, int TilesY, int DrawX, int DrawY, int ZoomFactor)
{

	int MulFactor = (8 * ZoomFactor);

#ifdef _DEBUG
	long tc;
	tc = GetTickCount();
#endif

	for(int ly=0;ly<TilesY;ly++)
	{
		for(int lx=0;lx<TilesX;lx++)
		{
			RenderSingle(hdc, cart, DrawX + (lx*MulFactor), DrawY + (ly*MulFactor), ZoomFactor);
			cart=cart+16;
		}
	}

#ifdef _DEBUG
	tc = GetTickCount() - tc;

	return tc;
#endif

	return 0;
}

int GPUAPI RenderSprite(HDC hdc, BYTE *cart, int DrawX, int DrawY, int ZoomFactor)
{
	int AddFactor = (8 * ZoomFactor);

#ifdef _DEBUG
	long tc;
	tc = GetTickCount();
#endif

	RenderSingle(hdc, cart, DrawX, DrawY, ZoomFactor);
	cart=cart+16;
	RenderSingle(hdc, cart, DrawX + AddFactor, DrawY, ZoomFactor);
	cart=cart+16;
	RenderSingle(hdc, cart, DrawX, DrawY + AddFactor, ZoomFactor);
	cart=cart+16;
	RenderSingle(hdc, cart, DrawX + AddFactor, DrawY + AddFactor, ZoomFactor);

#ifdef _DEBUG
	tc = GetTickCount() - tc;

	return tc;
#endif

	return 0;
}

long GPUAPI RenderSingle(HDC hdc, BYTE *cart, int DrawX, int DrawY, int ZoomFactor)
{
	BYTE GV1; BYTE GV2; BYTE GV3; BYTE GV4; BYTE GV5;
	BYTE BCnt = 0;

#ifdef _DEBUG
	long tc;
	tc = GetTickCount();
#endif

	for (int y=0;y<8;y++)
	{
		GV1 = cart[BCnt];
		GV2 = cart[++BCnt];
		BCnt++;
		for (int x=0;x<8;x++)
		{
			GV3 = (GV1 >> (7-x)) & 1;
			GV4 = (GV2 >> (7-x)) & 1;
			GV5 = (GV3 << 1) | GV4;
			SetPixel(hdc, DrawX + x, DrawY + y, Color[GV5]);
		}
	}

	if (ZoomFactor != 1)
	{
		StretchBlt(hdc, DrawX, DrawY, 8*ZoomFactor, 8*ZoomFactor, hdc, DrawX, DrawY, 8, 8, SRCCOPY);
	}

#ifdef _DEBUG
	tc = GetTickCount() - tc;

	return tc;
#endif

	return 0;
}