Ruputer で恵梨沙フォント対応アプリケーションを作る方法 かわはらなおや (nkf@pluto.dti.ne.jp) ■恵梨沙フォントの読み込み 恵梨沙フォント用のドライバは存在しないので、各々のアプリケーションに恵 梨沙フォントを読み込んで使用することになります。 恵梨沙フォントは 56KB もあり、Ruputer のアプリケーションで使用可能なメ モリは 64KB なので、大抵の場合は非漢字+第一水準のみを用いることになる と思われます。以下では非漢字+第一水準を扱うコトを前提として解説します。 以下のように読み込みバッファを静的に確保しておきます。 #define FONTFILE "b:\\system\\apps\\elisaR10.fon" #define FONTSIZE (3488 * 8) unsigned char font8x8[FONTSIZE]; /* フォントデータ */ 読み込みは以下のようなコードで行います。 /* フォント読み込み */ fhnd = dos_fopen(FONTFILE, 0); if (fhnd > 0) { gv_kput(0, 40, "reading font", 2, 0, 0); dos_fread(fhnd, font8x8, FONTSIZE); dos_fclose(fhnd); dy = 0; cls(4); OneView(); } else { gv_kput(0, 40, "cannot read font", 2, 0, 0); } ■コードの変換 恵梨沙フォントのデータには JIS コードの空き部分のフォントデータは含まれていず、 その部分が詰まった形式で保存されています。 そのため、 Shift-JIS の漢字コードから恵梨沙フォントのデータにアクセスするためには、 以下のような関数を用いて変換する必要があります。 int sjis2code(int u, int d) { int c if (d > 0x7f) d--; d -= 0x40; u -= 0x81; c = u * 0xbc + d; if (c >= 4375) { /* 第二水準のあたりなのでパス */ return 0x6c; } else if (c >= 1410) { /* 漢字である */ return c + (0x20c - 1410); } else if (c >= 690) { /* 禁止領域の文字 */ return 0x6c; } else if (c >= 658) { /* 罫線素 */ return c + (0x1ec - 658); } else if (c >= 612) { /* ロシア小 */ return c + (0x1cb - 612); } else if (c >= 564) { /* ロシア大 */ return c + (0x1aa - 564); } else if (c >= 502) { /* ギリシャ小 */ return c + (0x192 - 502); } else if (c >= 470) { /* ギリシャ大*/ return c + (0x17a - 470); } else if (c >= 376) { /* カタカナ */ return c + (0x124 - 376); } else if (c >= 282) { /* ひらがな */ return c + (0xd1 - 282); } else if (c >= 252) { /* 英小文字 */ return c + (0xb7 - 252); } else if (c >= 220) { /* 英大文字 */ return c + (0x9d - 220); } else if (c >= 203) { /* 数字 */ return c + (0x93 - 203); } else if (c >= 187) { /* 記号(◯) */ return 0x92; } else if (c >= 175) { /* 記号(ʼn♯♭♪†‡¶) */ return c + (0x8a - 203); } else if (c >= 153) { /* 記号(∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬) */ return c + (0x7b - 153); } else if (c >= 135) { /* 記号(∧∨¬⇒⇔∀∃) */ return c + (0x74 - 135); } else if (c >= 119) { /* 記号(∈∋⊆⊇⊂⊃∪∩) */ return c + (0x6c - 119); } else return c; /* 記号(その他) */ } ■表示 上記の関数を用いれば、SJIS からその文字の恵梨沙フォントの格納位置が font8x8 + trans( SJISの上位8bit , SJISの下位8bit) * 8 のようにして求めることができるようになります。 グラフィックモードでの恵梨沙フォントの画面への表示は gv_aput 関数を用 いて行います。 例えば、「桃」(SJIS 0x938d) を VRAM(20,30) に表示する場合には以下のよ うにします。 gv_aput(20, 30, 8, 8, font8x8 + trans(0x93, 0x8d) * 8, 0); ■半角フォントについて 半角のフォントは elisaR10.fon の中には入っていないので、 アプリケーション自身が持っておく必要があります。 eview のアーカイブに入っている ank4x8.c は、 私が作った半角のフォントです。 プログラム中に extern unsigned char ank4x8[1024]; のように extern 宣言を書いておき、 gv_aput(20, 30, 4, 8, ank4x8 + code * 4, 0); のようにして使用することができます。 ■おわりに あとはテキトーに eview を hack して理解してください。