#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <msdos.cf>
#include    <egb.h>
#include    "GRAPHIC.H"

extern char	work[];

BLOCK *DSP_push_vram(int x1,int y1,int x2,int y2)
{
	register BLOCK *para;
	int n;

	n = ((x2 - x1 + 8) / 8 * 4) * (y2 - y1 + 1) + 19;	/* 4 Bit Pix */

	if ( (para = (BLOCK *)malloc(n)) == NULL )
	return NULL;

	para->ptn = para->img;
	para->sel = getds();
	para->x1 = x1;
	para->y1 = y1;
	para->x2 = x2;
	para->y2 = y2;
	EGB_getBlock(work,(char *)para);
	return para;
}

void DSP_pop_vram(BLOCK *para)
{
	if ( para == NULL )
	return;
	EGB_putBlock(work,0,(char *)para);
	free(para);
}

void DSP_msg(char *str,int x,int y,int font,int fc,int bc,int mod)
{
    struct {
	short int	x,y;
	short int	len;
	char		str[120];
    } msg;

    msg.x = x;
    msg.y = y + 15;
    msg.len = strlen(str);
    strcpy(msg.str,str);

    EGB_textSpace(work,0);
    EGB_fontStyle(work,font);
    EGB_color(work,0,fc);
    EGB_color(work,1,bc);
    EGB_writeMode(work,mod);
    EGB_sjisString(work,(char *)&msg);
    EGB_fontStyle(work,0);
    EGB_color(work,1,0);
    EGB_writeMode(work,0);
}

void DSP_line(int x1,int y1,int x2,int y2,int fcol,int bcol)
{
    struct {
	short int	x1,y1,x2,y2;
    } line;

    line.x1 = x1;
    line.y1 = y1;
    line.x2 = x2;
    line.y2 = y2;
    EGB_paintMode(work,0x022);
    EGB_color(work,0,fcol);
    EGB_color(work,2,bcol);
    EGB_writeMode(work,0);
    EGB_rectangle(work,(char *)&line);
}

void DSP_lineb(int x1,int y1,int x2,int y2,int col,int mod)
{
    struct {
	short int	x1,y1,x2,y2;
    } line;

    line.x1 = x1;
    line.y1 = y1;
    line.x2 = x2;
    line.y2 = y2;
    EGB_paintMode(work,0x002);
    EGB_color(work,0,col);
    EGB_writeMode(work,mod);
    EGB_rectangle(work,(char *)&line);
    EGB_writeMode(work,0);
}

void DSP_linebf(int x1,int y1,int x2,int y2,int col,int mod)
{
    struct {
	short int	x1,y1,x2,y2;
    } line;

    line.x1 = x1;
    line.y1 = y1;
    line.x2 = x2;
    line.y2 = y2;
    EGB_paintMode(work,0x022);
    EGB_color(work,0,col);
    EGB_color(work,2,col);
    EGB_writeMode(work,mod);
    EGB_rectangle(work,(char *)&line);
    EGB_writeMode(work,0);
}

void DSP_rbox(int x1,int y1,int x2,int y2,int forcol,int boxcol)
{
    struct {
	short int	x1,y1,x2,y2;
    } line;
    struct {
	short int	count;
	short int	x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;
    } connect;

    line.x1 = x1+1;
    line.y1 = y1+1;
    line.x2 = x2-1;
    line.y2 = y2-1;
    EGB_paintMode(work,0x020);
    EGB_color(work,2,boxcol);
    EGB_rectangle(work,(char *)&line);

    connect.count = 5;
    connect.x1 = x1;
    connect.y1 = y2-2;
    connect.x2 = x1;
    connect.y2 = y1+2;
    connect.x3 = x1+2;
    connect.y3 = y1;
    connect.x4 = x2-2;
    connect.y4 = y1;
    connect.x5 = x2;
    connect.y5 = y1+2;
    EGB_paintMode(work,0x002);
    EGB_color(work,0,forcol);
    EGB_connect(work,(char *)&connect);

    connect.x1 = x2;
    connect.y1 = y1+2;
    connect.x2 = x2;
    connect.y2 = y2-2;
    connect.x3 = x2-2;
    connect.y3 = y2;
    connect.x4 = x1+2;
    connect.y4 = y2;
    connect.x5 = x1;
    connect.y5 = y2-2;
    EGB_connect(work,(char *)&connect);
}

void EGB_printf(int x, int y, int fc, int bc, char *form,...)
{
va_list arg;
char	tmp[80];
char	para[128];

	va_start(arg,form);
	vsprintf(tmp,form,arg);

	EGB_writeMode(work,9);

	WORD(para + 0) = x * 8;
	WORD(para + 2) = y * 19 + 15;
	WORD(para + 4) = strlen(tmp);
	strcpy(para + 6,tmp);
	EGB_color(work,0,fc);
	EGB_color(work,1,bc);
	EGB_sjisString(work,para);
	x += WORD(para + 4);

	va_end(arg);
	EGB_color(work,1,0);
	EGB_writeMode(work,0);
}

