#include #include #include #include static unsigned char buf[1048576]; static int sjis2offset[0x8000]; /* FONTX2 header: this font is kanji only */ #define CODETYPE_KANJI 1 /* common */ typedef struct { uint8_t identifier[6]; uint8_t fontname[8]; uint8_t xsize; uint8_t ysize; uint8_t codetype; } __attribute__((packed)) FONTX2_HEADER; /* sjis */ typedef struct { FONTX2_HEADER h; uint8_t tnum; } __attribute__((packed)) FONTX2_KANJI; typedef struct { uint16_t start; uint16_t end; } __attribute__((packed)) FONTX2_CODETABLE; static FONTX2_CODETABLE region[256]; static int region_entry; #if 0 static unsigned char Data[] = { // uint8_t length; // sizeof(bitmap) + sizeof(data) // uint8_t pad; // uint16_t sjis_code; // big-endian // uint8_t bitmap[36]; // uint8_t data[]; }; #endif static void decode(unsigned char *out, unsigned char *in) { int i; int bmp_index, bmp_bit, tmp_index, data_index; unsigned char *bmp, *data; unsigned char tmp[6]; bmp = in; data = in + 0x24; /* initial state: all zero */ memset(tmp, 0, sizeof(tmp)); data_index = 0; for (i = 0; i < 288; i++) { bmp_index = i / 8; bmp_bit = 7 - (i % 8); tmp_index = i % sizeof(tmp); if (bmp[bmp_index] & (1 << bmp_bit)) { tmp[tmp_index] = data[data_index++]; } if (!((tmp_index + 1) % sizeof(tmp))) { memcpy(out, tmp, sizeof(tmp)); out += sizeof(tmp); } } return; } static void dump_font(FILE *fp) { unsigned char b[288]; int i; for (i = 0; i < 0x7fff; i++) { if (!sjis2offset[i]) continue; decode(b, &buf[sjis2offset[i] + 4]); fwrite(b, sizeof(b), 1, fp); } return; } static void dump_header(FILE *fp) { FONTX2_KANJI k; strncpy(k.h.identifier, "FONTX2", sizeof(k.h.identifier)); strncpy(k.h.fontname, "FSSR023 ", sizeof(k.h.fontname)); k.h.xsize = k.h.ysize = 48; k.h.codetype = CODETYPE_KANJI; k.tnum = region_entry; fwrite(&k, sizeof(k), 1, fp); fwrite(region, sizeof(FONTX2_CODETABLE), region_entry, fp); return; } static void create_table(void) { int i, j; region_entry = 0; for (i = 0; i < 0x7fff; ) { if (!sjis2offset[i]) { i++; continue; } region[region_entry].start = i | 0x8000; for (j = i + 1; sjis2offset[j]; j++); region[region_entry].end = (j - 1) | 0x8000; i = j; printf("region #%d: %4x - %4x\n", region_entry, region[region_entry].start, region[region_entry].end); region_entry++; } return; } static void create_offset(void) { int i, offset, sjis; memset(sjis2offset, 0, sizeof(sjis2offset)); for (i = 0x8000; i < 0xf200; i += 4) { offset = (buf[i + 1] << 24) | (buf[i + 0] << 16) | (buf[i + 3] << 8) | buf[i + 2]; if (!offset) continue; sjis = (buf[offset + 2] << 8) | buf[offset + 3]; printf("sjis %x offset %x\n", sjis, offset); sjis2offset[sjis & 0x7fff] = offset; } return; } static void load(void) { int i; FILE *fp; memset(buf, 0, sizeof(buf)); fp = fopen("fssr023a.bin", "rb"); if (fp != NULL) { for (i = 0; i < sizeof(buf) / 2; i++) { buf[i] = fgetc(fp); } fclose(fp); } fp = fopen("fssr023b.bin", "rb"); if (fp != NULL) { for (i = sizeof(buf) / 2; i < sizeof(buf); i++) { buf[i] = fgetc(fp); } fclose(fp); } return; } int main(int argc, char *argv[]) { FILE *fp; load(); create_offset(); create_table(); fp = fopen("fssr023.fnt", "wb"); if (fp != NULL) { dump_header(fp); dump_font(fp); fclose(fp); } return 0; }