File:  [RetroPC.NET] / mkfont32 / mkfntbmp.c
Revision 1.1: download - view: text, annotated - select for diffs
Mon Jun 7 00:33:09 2004 JST (21 years, 4 months ago) by yui
Branches: MAIN
CVS tags: HEAD
initialize version (T.Yui)

#include	"compiler.h"
#include	"bmpdata.h"
#include	"parts.h"
#include	"dosio.h"
#include	"fontmng.h"
#include	"mkfnt.h"
#include	"fntdat.h"


static const BMPDATA fntinf = {2048, 2048, 1};
static const BYTE fntpal[8] = {0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0x00};


static void setank(BYTE *ptr, void *fnt, UINT from, UINT to) {

	char	work[2];
	FNTDAT	dat;
const BYTE	*p;
	BYTE	*q;
	int		width;
	int		height;
	BYTE	bit;
	int		i;

	ptr += (2048 * (2048 / 8)) + from;
	work[1] = '\0';
	while(from < to) {
		work[0] = (char)from;
		dat = fontmng_get(fnt, work);
		if (dat) {
			width = min(dat->width, 8);
			height = min(dat->height, 16);
			p = (BYTE *)(dat + 1);
			q = ptr;
			while(height > 0) {
				height--;
				q -= (2048 / 8);
				bit = 0xff;
				for (i=0; i<width; i++) {
					if (p[i]) {
						bit ^= (0x80 >> i);
					}
				}
				*q = bit;
				p += dat->width;
			}
		}
		from++;
		ptr++;
	}
}

static void patchank(BYTE *ptr, const BYTE *fnt, UINT from) {

	int		r;
	int		y;

	ptr += (2048 * (2048 / 8)) + from;
	r = 0x20;
	do {
		y = 16;
		do {
			ptr -= (2048 / 8);
			*ptr = ~(*fnt++);
		} while(--y);
		ptr += (16 * (2048 / 8)) + 1;
	} while(--r);
}

static void patchepsongrp(BYTE *ptr) {

	UINT	i;

	ptr += (2048 * (2048 / 8)) + 0x80;
	for (i=0; i<5; i++) {
		ptr[i - ((15 - (i * 2)) * (2048 / 8))] = 0xff;
	}
}

static void setjis(BYTE *ptr, void *fnt, BOOL epson) {

	BOOL	(*isjis)(UINT16 jis);
	UINT16	(*jiscnv)(UINT16 jis);
	char	work[4];
	UINT16	h;
	UINT16	l;
	UINT16	jis;
	UINT	sjis;
	FNTDAT	dat;
const BYTE	*p;
	BYTE	*q;
	int		width;
	int		height;
	UINT16	bit;
	int		i;

	isjis = (epson)?isjis83:isjis78;
	jiscnv = (epson)?jiscnv8390:jiscnv7890;
	work[2] = '\0';
	ptr += ((0x80 - 0x21) * 16 * (2048 / 8)) + 2;
	for (h=0x2100; h<0x8000; h+=0x100) {
		for (l=0x21; l<0x7f; l++) {
			jis = h + l;
			if ((*isjis)(jis)) {
				jis = (*jiscnv)(jis);
				sjis = jis2sjis(jis);
				work[0] = (BYTE)(sjis >> 8);
				work[1] = (BYTE)sjis;
				dat = fontmng_get(fnt, work);
				if (dat) {
					width = min(dat->width, 16);
					height = min(dat->height, 16);
					p = (BYTE *)(dat + 1);
					q = ptr;
					while(height > 0) {
						height--;
						q -= (2048 / 8);
						bit = 0xffff;
						for (i=0; i<width; i++) {
							if (p[i]) {
								bit ^= (0x8000 >> i);
							}
						}
						q[0] = (BYTE)(bit >> 8);
						q[1] = (BYTE)bit;
						p += dat->width;
					}
				}
			}
			ptr -= 16 * (2048 / 8);
		}
		ptr += ((0x7f - 0x21) * 16 * (2048 / 8)) + 2;
	}
}

static void patchextank(BYTE *ptr, const BYTE *fnt,
										UINT jish, UINT jisl, UINT count) {

	UINT	r;

	ptr += ((0x80 - jisl) * 16 * (2048 / 8)) + (jish * 2);
	r = count * 16;
	do {
		ptr -= (2048 / 8);
		*ptr = ~(*fnt++);
	} while(--r);
}

static void patchextfnt(BYTE *ptr, const BYTE *fnt,
										UINT jish, UINT jisl, UINT count) {

	UINT	r;

	ptr += ((0x80 - jisl) * 16 * (2048 / 8)) + (jish * 2);
	r = count * 16;
	do {
		ptr -= (2048 / 8);
		ptr[0] = (BYTE)(~fnt[0]);
		ptr[1] = (BYTE)(~fnt[1]);
		fnt += 2;
	} while(--r);
}

void makepc98bmp(const char *filename, const TCHAR *fontface, BOOL epson) {

	void	*fnt;
	BMPFILE	bf;
	UINT	size;
	BMPINFO	bi;
	BYTE	*ptr;
	FILEH	fh;
	BOOL	r;

	fnt = fontmng_create(16, 0, fontface);
	if (fnt == NULL) {
		goto mfnt_err1;
	}
	size = bmpdata_setinfo(&bi, &fntinf);
	bmpdata_sethead(&bf, &bi);
	ptr = (BYTE *)_MALLOC(size, filename);
	if (ptr == NULL) {
		goto mfnt_err2;
	}
	FillMemory(ptr, size, 0xff);
	setank(ptr, fnt, 0x20, 0x7f);
	setank(ptr, fnt, 0xa1, 0xe0);
	patchank(ptr, pc98_16 + 0*32*16, 0x00);
	patchank(ptr, pc98_16 + 1*32*16, 0x80);
	patchank(ptr, pc98_16 + 2*32*16, 0xe0);
	if (epson) {
		patchepsongrp(ptr);
	}
	setjis(ptr, fnt, epson);
	if (epson) {
		patchextfnt(ptr, jis28xx, 0x08, 0x21, 0x20);
	}
	patchextank(ptr, jis29xx, 0x09, 0x21, 0x5e);
	patchextank(ptr, jis2axx, 0x0a, 0x21, 0x5e);
	patchextank(ptr, jis2bxx, 0x0b, 0x21, 0x5e);
	patchextfnt(ptr, jis2cxx, 0x0c, 0x24, 0x4c);

	fh = file_create(filename);
	if (fh == FILEH_INVALID) {
		goto mfnt_err3;
	}
	r = (file_write(fh, &bf, sizeof(bf)) == sizeof(bf)) &&
		(file_write(fh, &bi, sizeof(bi)) == sizeof(bi)) &&
		(file_write(fh, fntpal, sizeof(fntpal)) == sizeof(fntpal)) &&
		(file_write(fh, ptr, size) == size);
	file_close(fh);
	if (!r) {
		file_delete(filename);
	}

mfnt_err3:
	_MFREE(ptr);

mfnt_err2:
	fontmng_destroy(fnt);

mfnt_err1:
	return;
}


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