#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>