File:  [RetroPC.NET] / np2 / generic / softkbd.c
Revision 1.5: download - view: text, annotated - select for diffs
Mon Mar 29 04:50:25 2004 JST (21 years, 7 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix 86PCM (T.Yui)

#include	"compiler.h"

#if defined(SUPPORT_SOFTKBD)

#include	"bmpdata.h"
#include	"softkbd.h"
#include	"keystat.h"

#define	SOFTKEY_MENU	0xfe
#define	SOFTKEY_NC		0xff

#if (SUPPORT_SOFTKBD == 1)
#include	"softkbd1.res"
#elif (SUPPORT_SOFTKBD == 2)
#include	"softkbd2.res"
#else
#include	"softkbd.res"
#endif

#if 0
typedef struct {
	BMPDATA	inf;
	BYTE	*ptr;
	int		height;
	int		yalign;
} CMNBMP;

static BOOL cmnbmp_4(const BYTE *dat, CMNBMP *ret) {

	BMPDATA		inf;
const BMPFILE	*bf;

	bf = (BMPFILE *)dat;
	if ((bf == NULL) ||
		(bf->bfType[0] != 'B') || (bf->bfType[1] != 'M') ||
		(bmpdata_getinfo((BMPINFO *)(bf + 1), &inf) != SUCCESS) ||
		(inf.bpp == 4)) {
		return(FAILURE);
	}
	if (ret) {
		ret->inf = inf;
		ret->ptr = ((BYTE *)bf) + (LOADINTELDWORD(bf->bfOffBits));
		ret->yalign = bmpdata_getalign((BMPINFO *)(bf + 1));
		if (inf.height < 0) {
			ret->height = inf.height * -1;
		}
		else {
			ret->ptr += (inf.height - 1) * ret->yalign;
			ret->height = inf.height;
			ret->yalign *= -1;
		}
	}
	return(SUCCESS);
}
#endif


typedef struct {
	BYTE	*bmp;
	UINT	width;
	UINT	height;
	UINT8	key;
} SOFTKBD;

static	SOFTKBD	softkbd;



// ----

void softkbd_initialize(void) {

	BMPFILE	*bf;
	BMPDATA	inf;

	softkbd.bmp = NULL;
	softkbd.width = 0;
	softkbd.height = 0;
	softkbd.key = SOFTKEY_NC;
	bf = (BMPFILE *)bmpdata_solvedata(np2kbd_bmp);
	if (bf != NULL) {
		if ((bf->bfType[0] == 'B') && (bf->bfType[1] == 'M') &&
			(bmpdata_getinfo((BMPINFO *)(bf + 1), &inf) == SUCCESS) &&
			(inf.bpp == 4)) {
			softkbd.bmp = (BYTE *)bf;
			softkbd.width = inf.width;
			if (inf.height > 0) {
				softkbd.height = inf.height;
			}
			else {
				softkbd.height = 0 - inf.height;
			}
		}
		else {
			_MFREE(bf);
		}
	}
}

void softkbd_deinitialize(void) {

	BYTE	*bmp;

	bmp = softkbd.bmp;
	softkbd.bmp = NULL;
	if (bmp) {
		_MFREE(bmp);
	}
}

BOOL softkbd_getsize(int *width, int *height) {

	if (softkbd.bmp == NULL) {
		return(FAILURE);
	}
	if (width) {
		*width = softkbd.width;
	}
	if (height) {
		*height = softkbd.height;
	}
	return(SUCCESS);
}

BOOL softkbd_paint(CMNVRAM *vram, CMNPALCNV cnv) {

	cmddraw_bmp16(vram, softkbd.bmp, cnv, CMNBMP_LEFT | CMNBMP_TOP);
	return(TRUE);
}

BOOL softkbd_down(int x, int y) {

	UINT8	key;

	softkbd_up();
	key = getsoftkbd(x, y);
	if (key == SOFTKEY_MENU) {
		return(TRUE);
	}
	else if (key != SOFTKEY_NC) {
		keystat_senddata((UINT8)key);
		softkbd.key = key;
	}
	return(FALSE);
}

void softkbd_up(void) {

	if (softkbd.key != SOFTKEY_NC) {
		keystat_senddata((REG8)(softkbd.key | 0x80));
		softkbd.key = SOFTKEY_NC;
	}
}
#endif


RetroPC.NET-CVS <cvs@retropc.net>