#include <EGB.h>
#include <conio.h>

typedef enum {FALSE = -1, TRUE} BOOL;
typedef unsigned char   BYTE;

#define DEFAULT_PATH        ""
#define DEFAULT_PIC_SIZE_X  256
#define DEFAULT_PIC_SIZE_Y  256

char    acMDRwork[1536];
char    acMDRpara[64];

int MDRinit(void)
{
	int     ret;
	
	ret = EGB_init(acMDRwork, 1536);
	EGB_resolution(acMDRwork, 0, 17);
	
	return ret;
}

BOOL MDRwritePic(long lStartX, long lStartY, 
					long lSizeX, long lSizeY, BYTE abyPicData[])
{
	BYTE    *pbyPic;
	long    lRTmp, lGTmp, lBTmp;
	long    lA, lB;
	
	if ((pbyPic = (BYTE *)malloc(lSizeX * lSizeY * 3)) == NULL) {
		fprintf(stderr, "Out of Memory\n");
		
		return FALSE;
	} else {
		/*  Decrease Color  */
		lB = 0;
		for (lA = 0; lA < lSizeX * lSizeY * 3; ) {
			lRTmp = abyPicData[lA++] >> 3;
			lGTmp = abyPicData[lA++] >> 3;
			lBTmp = abyPicData[lA++] >> 3;
			pbyPic[lB++] = (lGTmp << 2) + (lRTmp >> 3);
			pbyPic[lB++] = (lRTmp << 5) + (lBTmp);
		}
		/*  Write Picture   */
		DWORD(acMDRpara +  0) = (unsigned int)pbyPic;
		WORD (acMDRpara +  4) = 0x14/*getds()*/;
		WORD (acMDRpara +  6) = lStartX;
		WORD (acMDRpara +  8) = lStartY;
		WORD (acMDRpara + 10) = lStartX + lSizeX - 1;
		WORD (acMDRpara + 12) = lStartY + lSizeY - 1;
		EGB_putBlock(acMDRwork, 0, acMDRpara);
	}
	
	free(pbyPic);
}

int MDRinitVideo(void)
{
	int     ret;
	
	ret = EGB_init(acMDRwork, 1536);
	EGB_resolution(acMDRwork, 0, 16);
	EGB_writePage(acMDRwork, 0);
	EGB_displayStart(acMDRwork, 2, 4, 1);

	EGB_writePage(acMDRwork, 0);
	EGB_writeMode(acMDRwork, 10);
	EGB_color(acMDRwork, 1, 0x8000);
	EGB_clearScreen(acMDRwork);
	EGB_writeMode(acMDRwork, 0);

	EGB_superImpose(acMDRwork, 65);
	EGB_digitize(acMDRwork, 1);
	
	return ret;
}

BOOL MDRreadPic(long lStartX, long lStartY, 
					long lSizeX, long lSizeY, BYTE abyPicData[])
{
	BYTE    *pbyPic;
	long    lHTmp, lLTmp;
	long    lA, lB, lC;
	
	if ((pbyPic = (BYTE *)malloc(lSizeX * (lSizeY * 2) * 3)) == NULL) {
		fprintf(stderr, "Out of Memory\n");
		
		return FALSE;
	} else {
		/*  Read Picture    */
		DWORD(acMDRpara +  0) = (unsigned int)pbyPic;
		WORD (acMDRpara +  4) = 0x14/*getds()*/;
		WORD (acMDRpara +  6) = lStartX;
		WORD (acMDRpara +  8) = lStartY;
		WORD (acMDRpara + 10) = lStartX + lSizeX - 1;
		WORD (acMDRpara + 12) = lStartY + lSizeY * 2 - 1;
		EGB_getBlock(acMDRwork, acMDRpara);

		/*  Increase Color  */
		lB = 0;
		lC = 0;
		for (lA = 0; lA < lSizeX * lSizeY * 3; ) {
			lHTmp = pbyPic[lB++];
			lLTmp = pbyPic[lB++];
			abyPicData[lA++] = (((lHTmp << 3) + (lLTmp >> 5))) << 3;    /*  R */
			abyPicData[lA++] = (lHTmp >> 2) << 3;                   /*  G */
			abyPicData[lA++] = (lLTmp) << 3;                            /*  B */
			/*  Remove Jitter   */
			if (lC == lSizeX) {
				lB += (lSizeX * 2/* + 2*/);
				lC = 0;
			} else {
				lC++;
			}
		}
	}
	
	free(pbyPic);
}



