#ifndef		_DISPLAY_H
#define		_DISPLAY_H

#include	<stdio.h>
#include	<egb.h>
#include	<mos.h>

#define POINT(x, y) (point_t){x, y}
#define BOX(x, y, x2, y2) (box_t){x, y, x2, y2}
#define CENTER(p, p2) ((p - p2) / 2)
#define IGRB(i, g, r, b) (i << 31 | g << 19 | r << 11 | b << 3)
#define	G(c) ((c & 0xf80000) >> 19)
#define R(c) ((c & 0xf800) >> 11)
#define B(c) ((c & 0xf8) >> 3)

typedef struct {
    char *EGB,	/* EGB用ワーク */
         *MOS;	/* MOS用ワーク */
} DSP_work_type;
	
typedef struct {
    int     x, y;
}       point_t;

typedef struct {
    point_t   p1, p2;
}       line_t;

typedef struct {
    char    b, r, g;
}       pal_t;

typedef struct {
    int  x, y, mx, my;
}	 box_t;

typedef enum {
    FALSE = 0,
    TRUE = !0
}       bool_t;

typedef enum {
    ON = !0,
    OFF = 0
}       flag_t;

typedef struct {
    flag_t	select;
    flag_t	run;
    flag_t	a_botton;
    flag_t 	b_botton;
    flag_t	up, down;
    flag_t	left, right;
} TOWNSpad_t;

typedef struct {
    char    name[21];
    char   *buf;
    point_t size;
    int     color;
    int     ver;
}       pic_t;

typedef struct {
    FILE   *fp;
    int     ver;
    bool_t  isARTemis;
}       PIC_FILE;

extern DSP_work_type DSP_work;
extern bool_t DSP_isDOS;
/*
  system.c
*/
int     DSP_init(int page0, ...);
int     DSP_end(void);
bool_t  DSP_install(void);

/*
  garph.c
*/
int	DSP_putSjis(int x, int y, char *s);
void    DSP_msg(char *, const point_t *,
		        const int, const int, const int);
void    DSP_gprintf(const point_t *, const char *fmt,...);
int	DSP_getWritePage(void);
int	getds(void);
int	DSP_viewport(box_t *b);
void	DSP_getResolution(int *p0, int *p1);
int	DSP_getPalette(int page, void *pal);
int	DSP_pic_size(int, int, int);
int	DSP_fontSize(int x, int y);

/*
  mouse.c
*/
int     MOS_wait(void);		/* ボタンが押される間で待つ */
int     MOS_point_get(point_t *);

/*
  device.c
*/
TOWNSpad_t *DSP_TOWNSpad(int port, TOWNSpad_t *);

/*
  picture.c
*/
pic_t  *PIC_load(char *name);
int     PIC_put(point_t *p, pic_t *pic);
int     PIC_free(pic_t *pic);
PIC_FILE *PIC2_open(char *name);
pic_t  *PIC2_read(PIC_FILE *p);
int     PIC2_close(PIC_FILE *p);
PIC_FILE *ARTemis_open(char *name);

/*
  effect.c
*/
int	DSP_mono(box_t *b);
int	DSP_mono2(box_t *b);

/*
  libtiff.a
*/
int DSP_TIF_load(char *filename, int ofs_x, int ofs_y);
int DSP_TIF_save(char *filename, int x1, int y1, int x2, int y2, int comp);

#include	"egbdef.h"
#include	"mosdef.h"

/*
  ＢＯＸ
*/
static inline void DSP_box(box_t *b)
{
    EGB_paintMode(DSP_work.EGB, 0x02);
    EGB_box(DSP_work.EGB, b->x, b->y, b->mx, b->my);
}

/*
  ＢＯＸ　塗りつぶし
*/
static inline void DSP_boxf(box_t *b)
{
    EGB_paintMode(DSP_work.EGB, 0x20);
    EGB_box(DSP_work.EGB, b->x, b->y, b->mx, b->my);
}

static inline void DSP_get(char *buf, box_t *b)
{
    EGB_getRect(DSP_work.EGB, buf, b->x, b->y, b->mx, b->my);
}

static inline void DSP_put(char *buf, box_t *b)
{
    EGB_putRect(DSP_work.EGB, 1, buf, b->x, b->y, b->mx, b->my);
}

#define DSP_PSET	DSP_writeMode(0)
#define	DSP_PRESET	DSP_writeMode(1)
#define	DSP_OR		DSP_writeMode(2)
#define DSP_AND		DSP_writeMode(3)
#define DSP_XOR		DSP_writeMode(4)
#define	DSP_NOT		DSP_writeMode(5)
#define	DSP_MATTE	DSP_writeMode(6)
#define	DSP_PASTEL	DSP_writeMode(7)

#define	DSP_OPAQUE	DSP_writeMode(9)
#define	DSP_IMPSET	DSP_writeMode(10)
#define	DSP_IMPRESET	DSP_writeMode(11)
#define	DSP_IMPNOT	DSP_writeMode(12)
#define	DSP_MASKSET	DSP_writeMode(13)
#define	DSP_MASKRESET	DSP_writeMode(14)
#define	DSP_MASKNOT	DSP_writeMode(15)

#endif				/* _DISPLAY_H */

