恵梨沙フォントの解析

何かTAKEがWindowsで8×8ドットフォント使ってて、どうせなら恵梨沙フォントが使いたいと四苦八苦してたので、何となく恵梨沙フォントがどういう構造になってるのか調べてみた。
8ビット世代の古い頭で考えると、恐らく1バイト=8ビットがそのまま横8ドット分のパターンに相当すると思うので、8バイトで1文字分のフォントデータになるハズ。
恵梨沙フォント(ELISA100.FNT)は6,877文字収録されているそうなので、8バイト×6,877文字=55,016バイト。これはELISA100.FNTのファイルサイズと一致する。つまり、そういうことか。
中身をビットパターンに直して見てみると、先頭からJISコード順に格納されている模様。ただし、文字が割り当てられていない部分は飛ばされている。
具体的にはJISコード上位バイトが21〜7E、下位バイトが21〜7Eで、一般記号などが2121〜222E、集合記号などが223A〜2241、論理記号などが224A〜2250、幾何記号などが225C〜226A、音楽記号などが2272〜2279、丸記号が227E、数字が2330〜2339、英大文字が2341〜235A、英小文字が2361〜237A、ひらがなが2421〜2473、カタカナが2521〜2576、ギリシャ大文字が2621〜2638、ギリシャ小文字が2641〜2658、キリル大文字が2721〜2741、キリル小文字が2751〜2771、罫線が2821〜2840、第一水準漢字が3021〜4F53、第二水準漢字が5021〜7426なので、これらを対象にELISA100.FNTの先頭から順次読み出せば使えることになる。
ただ、ELISA100.FNTには第二水準漢字の末尾にある2文字(JISコード7425「凜」、JISコード7426「熙」)が含まれていない模様(含まれていたら全部で6,879文字になる)。第三水準漢字は当然含まれていない。
てなことが判ったので、ELISA100.FNTをX Window System等で使われているbdf形式のフォントファイルに変換するプログラムを作ってみた。と、言ってもそれっぽく変換してるだけで使えないかも知れない(笑)試してないので。

#include <stdio.h>

int main(int argc,char *argv[]) {
	FILE *fp;
	unsigned char buf[8];
	int i,j;

	fp=fopen("ELISA100.FNT","rb");
	printf("STARTFONT 2.1\n");
	printf("COMMENT \n");
	printf("FONT -Elisa-Fixed-Medium-R-Normal--8-70-75-75-C-100-JISX0208.1983-0\n");
	printf("SIZE 8 75 75\n");
	printf("FONTBOUNDINGBOX 8 8 0 0\n");
	printf("STARTPROPERTIES 19\n");
	printf("FONTNAME_REGISTRY \"\"\n");
	printf("FOUNDRY \"Elisa\"\n");
	printf("FAMILY_NAME \"Fixed\"\n");
	printf("WEIGHT_NAME \"Medium\"\n");
	printf("SLANT \"R\"\n");
	printf("SETWIDTH_NAME \"Normal\"\n");
	printf("ADD_STYLE_NAME \"\"\n");
	printf("PIXEL_SIZE 8\n");
	printf("POINT_SIZE 70\n");
	printf("RESOLUTION_X 75\n");
	printf("RESOLUTION_Y 75\n");
	printf("SPACING \"C\"\n");
	printf("AVERAGE_WIDTH 100\n");
	printf("CHARSET_REGISTRY \"JISX0208.1983\"\n");
	printf("CHARSET_ENCODING \"0\"\n");
	printf("DEFAULT_CHAR 8481\n");
	printf("FONT_DESCENT 2\n");
	printf("FONT_ASCENT 6\n");
	printf("COPYRIGHT \"Copyright 1993,1994,1995 (C) by ELISA FONT PJ all rights reserved.\"\n");
	printf("ENDPROPERTIES\n");
	printf("CHARS 6877\n");
	i=0x2121;
	while(i<=0x7e7e) {
		if((i>=0x2121 && i<=0x222e) ||
			(i>=0x223a && i<=0x2241) ||
			(i>=0x224a && i<=0x2250) ||
			(i>=0x225c && i<=0x226a) ||
			(i>=0x2272 && i<=0x2279) ||
			i==0x227e ||
			(i>=0x2330 && i<=0x2339) ||
			(i>=0x2341 && i<=0x235a) ||
			(i>=0x2361 && i<=0x237a) ||
			(i>=0x2421 && i<=0x2473) ||
			(i>=0x2521 && i<=0x2576) ||
			(i>=0x2621 && i<=0x2638) ||
			(i>=0x2641 && i<=0x2658) ||
			(i>=0x2721 && i<=0x2741) ||
			(i>=0x2751 && i<=0x2771) ||
			(i>=0x2821 && i<=0x2840) ||
			(i>=0x3021 && i<=0x4f53) ||
			(i>=0x5021 && i<=0x7426)) {
			if(fread(buf,1,8,fp)==0) break;
			for(j=0;j<8;j++) {
				printf("COMMENT ");
				if(buf[j] & 0x80) printf("XX"); else printf("  ");
				if(buf[j] & 0x40) printf("XX"); else printf("  ");
				if(buf[j] & 0x20) printf("XX"); else printf("  ");
				if(buf[j] & 0x10) printf("XX"); else printf("  ");
				if(buf[j] & 0x08) printf("XX"); else printf("  ");
				if(buf[j] & 0x04) printf("XX"); else printf("  ");
				if(buf[j] & 0x02) printf("XX"); else printf("  ");
				if(buf[j] & 0x01) printf("XX"); else printf("  ");
				printf("\n");
			}
			printf("STARTCHAR %04x\n",i);
			printf("ENCODING %d\n",i);
			printf("SWIDTH 640 0\n");
			printf("DWIDTH 8 0\n");
			printf("BBX 8 8 0 0\n");
			printf("BITMAP\n");
			for(j=0;j<8;j++) {
				printf("%02x\n",buf[j]);
			}
			printf("ENDCHAR\n");
		}
		i++;
		if((i&0xff)>0x7e) i+=0xa2;
	}
	printf("ENDFONT\n");
	fclose(fp);
}