#include #include "makejvf.h" #include "uniblock.h" #include #include FILE *vfopen(char *name) { FILE *fp; int fidshift=0; if (fidzero) fidshift=-1; fp = fopen(name,"wb"); if (fp == NULL) { fprintf(stderr,"I cannot create VF file, %s.",name); exit(100); } fputc(247,fp); /* PRE */ fputc(202,fp); /* ID */ fputc(0,fp); /* comment size */ fputnum(0,4,fp); /* TFM check sum */ fputnum(10*(1<<20),4,fp); /* TFM design size */ fputc(243,fp); /* fnt_def1 */ fputc(1+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(vtfmname),fp); /* fontname length */ fputstr(vtfmname,strlen(vtfmname),fp); /* directory + fontname */ if (kanatfm) { fputc(243,fp); /* fnt_def1 */ fputc(2+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(kanatfm),fp); /* fontname length */ fputstr(kanatfm,strlen(kanatfm),fp); /* directory + fontname */ } if (ucsqtfm) { fputc(243,fp); /* fnt_def1 */ fputc(3+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(ucsqtfm),fp); /* fontname length */ fputstr(ucsqtfm,strlen(ucsqtfm),fp); /* directory + fontname */ } else if (jistfm) { fputc(243,fp); /* fnt_def1 */ fputc(3+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ else fputnum(zw,4,fp); /* font design size (scaled) */ fputnum(10*(1<<20),4,fp); /* font design size */ fputc(0,fp); /* directory length */ fputc(strlen(jistfm),fp); /* fontname length */ fputstr(jistfm,strlen(jistfm),fp); /* directory + fontname */ } return fp; } void writevf(int code, FILE *fp) { int cc,cc2,cc3,cc4,w,skip=0,skip2=0,height=1000; char buf[256],buf2[256]; int fidshift=0; if (fidzero) fidshift=-1; w = jfmread(code); fputc(242,fp); /* long_char */ skip2=baseshift; switch (code) { case 0x2146: /* ‘ */ case 0x2148: /* “ */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2146) sprintf(buf2,"CH <216C>"); else sprintf(buf2,"CH <216D>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(w+((double)(cc2-height)/1000.0-0.05)*zw); break; } } } else skip=(int)((0.1)*zw); if (code == 0x2146) { skip2+=-(int)((0.65)*zh); } else { skip2+=-(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2146) fputnum(0x216c,2,fp); /* char code */ else fputnum(0x216d,2,fp); /* char code */ return; } case 0x214a: /* ( */ case 0x214c: /* 〔 */ case 0x214e: /* [ */ case 0x2150: /* { */ case 0x2152: /* 〈 */ case 0x2154: /* 《 */ case 0x2156: /* 「 */ case 0x2158: /* 『 */ case 0x215a: /* 【 */ skip = -(zw-w); if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; case 0x2147: /* ’ */ case 0x2149: /* ” */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2147) sprintf(buf2,"CH <216C>"); else sprintf(buf2,"CH <216D>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(((double)(height-cc2)/1000.0+0.05)*zw); break; } } } else skip=(int)((0.4)*zw); if (code == 0x2147) { skip2+=(int)((0.65)*zh); } else { skip2+=(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc+2+88+2+32,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(239,fp); /* XXX1 */ fputc(88,fp); fputs("ps: gsave currentpoint currentpoint translate 180 neg rotate neg exch neg exch translate",fp); if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2147) fputnum(0x216c,2,fp); /* char code */ else fputnum(0x216d,2,fp); /* char code */ fputc(239,fp); /* XXX1 */ fputc(32,fp); fputs("ps: currentpoint grestore moveto",fp); return; } case 0x2121: /* spc */ case 0x2122: /* 、 */ case 0x2123: /* 。 */ case 0x2124: /* , */ case 0x2125: /* . */ case 0x212b: /* ゛ */ case 0x212c: /* ゜ */ case 0x214b: /* ) */ case 0x214d: /* 〕 */ case 0x214f: /* ] */ case 0x2151: /* } */ case 0x2153: /* 〉 */ case 0x2155: /* 》 */ case 0x2157: /* 」 */ case 0x2159: /* 』 */ case 0x215b: /* 】 */ case 0x216b: /* ° */ case 0x216c: /* ′ */ case 0x216d: /* ″ */ if (kanatfm) cc=4; else cc=3; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; default: if (w != zw) { if (((code >= 0x2421 && code <= 0x2576) || code == 0x213c ) && kanatume>=0) { sprintf(buf2,"CH <%X>",code); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); if (jfm_id==9) { switch (code) { case 0x2421: case 0x2423: case 0x2425: case 0x2427: case 0x2429: case 0x2443: case 0x2463: case 0x2465: case 0x2467: case 0x246e: case 0x2521: case 0x2523: case 0x2525: case 0x2527: case 0x2529: case 0x2543: case 0x2563: case 0x2565: case 0x2567: case 0x256e: case 0x2575: case 0x2576: skip=-(int)(((double)(1000-(cc4-cc2)-kanatume*2)/2/1000.0)*zw); break; case 0x213c: skip=-(int)((double)(cc-kanatume)/1000.0*zw); break; default: skip=-(int)(((double)(height-cc4-kanatume)/1000.0)*zw); break; } } else { skip=-(int)(((double)(cc-kanatume)/1000.0)*zw); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; } } } else { skip = -(zw-w)/2; if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } } else { if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } break; } fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) { if (code <= 0x2576) fputc(173+fidshift,fp); /* FONT_NUM_2 */ else fputc(172+fidshift,fp); /* FONT_NUM_1 */ } fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ } void writevfu(int code, FILE *fp) { int cc,cc2,cc3,cc4,w,skip=0,skip2=0,height=1000; char buf[256],buf2[256]; int fidshift=0; if (fidzero) fidshift=-1; w = jfmread(code); fputc(242,fp); /* long_char */ skip2=baseshift; switch (code) { case 0x2018: /* ‘ */ case 0x201c: /* “ */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2018) sprintf(buf2,"CH <2032>"); else sprintf(buf2,"CH <2033>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(w+((double)(cc2-height)/1000.0-0.05)*zw); break; } } } else skip=(int)((0.1)*zw); if (code == 0x2018) { skip2+=-(int)((0.65)*zh); } else { skip2+=-(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ if (code == 0x2018) fputnum(0x2032,2,fp); /* char code */ else fputnum(0x2033,2,fp); /* char code */ return; } else if (ucsqtfm) { /* UniJIS-UCS2-H系へ変換 */ cc=4; skip = -(zw-w); if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(174+fidshift,fp); /* FONT_NUM_3 */ fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ return; } else if (jfm_id == 11 && jistfm) { /* 横書き時はJIS系へ変換 */ /* UCS U+2018 → JIS 0x2146, UCS U+201C → JIS 0x2148 */ cc=4; skip = -(zw-w); if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(174+fidshift,fp); /* FONT_NUM_3 */ fputc(129,fp); /* SET2 */ if (code == 0x2018) fputnum(0x2146,2,fp); /* char code */ else fputnum(0x2148,2,fp); /* char code */ return; } case 0xFF08: /* ( */ case 0x3014: /* 〔 */ case 0xFF3B: /* [ */ case 0xFF5B: /* { */ case 0x3008: /* 〈 */ case 0x300A: /* 《 */ case 0x300C: /* 「 */ case 0x300E: /* 『 */ case 0x3010: /* 【 */ case 0xFF5F: /* JIS X 0213 1-02-54 始め二重バーレーン */ case 0x3018: /* JIS X 0213 1-02-56 始め二重亀甲括弧 */ case 0x3016: /* JIS X 0213 1-02-58 始めすみ付き括弧(白) */ case 0x301D: /* JIS X 0213 1-13-64 始めダブルミニュート */ if (ucs != ENTRY_JQ) skip = -(zw-w); if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; case 0x2019: /* ’ */ case 0x201d: /* ” */ if (jfm_id == 9 && minute) { /* 縦書き時はミニュートへ変換 */ if (afp) { if (code == 0x2019) sprintf(buf2,"CH <216C>"); else sprintf(buf2,"CH <216D>"); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); skip=(int)(((double)(height-cc2)/1000.0+0.05)*zw); break; } } } else skip=(int)((0.4)*zw); if (code == 0x2019) { skip2+=(int)((0.65)*zh); } else { skip2+=(int)((0.6)*zh); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc+2+88+2+32,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(239,fp); /* XXX1 */ fputc(88,fp); fputs("ps: gsave currentpoint currentpoint translate 180 neg rotate neg exch neg exch translate",fp); if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2019) fputnum(0x2032,2,fp); /* char code */ else fputnum(0x2033,2,fp); /* char code */ fputc(239,fp); /* XXX1 */ fputc(32,fp); fputs("ps: currentpoint grestore moveto",fp); return; } else if (ucsqtfm) { /* UniJIS-UCS2-H系へ変換 */ cc=4; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(174+fidshift,fp); /* FONT_NUM_3 */ fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ return; } else if (jfm_id == 11 && jistfm) { /* 横書き時はJIS系へ変換 */ /* UCS U+2019 → JIS 0x2147, UCS U+201D → JIS 0x2149 */ cc=4; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(174+fidshift,fp); /* FONT_NUM_3 */ fputc(129,fp); /* SET2 */ if (code == 0x2019) fputnum(0x2147,2,fp); /* char code */ else fputnum(0x2149,2,fp); /* char code */ return; } case 0x3000: /* spc */ case 0x3001: /* 、 */ case 0x3002: /* 。 */ case 0xFF0C: /* , */ case 0xFF0E: /* . */ case 0x309B: /* ゛ */ case 0x309C: /* ゜ */ case 0xFF09: /* ) */ case 0x3015: /* 〕 */ case 0xFF3D: /* ] */ case 0xFF5D: /* } */ case 0x3009: /* 〉 */ case 0x300B: /* 》 */ case 0x300D: /* 」 */ case 0x300F: /* 』 */ case 0x3011: /* 】 */ case 0xFF60: /* JIS X 0213 1-02-55 終わり二重バーレーン */ case 0x3019: /* JIS X 0213 1-02-57 終わり二重亀甲括弧 */ case 0x3017: /* JIS X 0213 1-02-59 終わりすみ付き括弧(白) */ case 0x301F: /* JIS X 0213 1-13-65 終わりダブルミニュート */ case 0x00B0: /* ° */ case 0x2032: /* ′ */ case 0x2033: /* ″ */ if (kanatfm) cc=4; else cc=3; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; case 0xFF61: case 0xFF62: case 0xFF63: case 0xFF64: case 0xFF65: case 0xFF66: case 0xFF67: case 0xFF68: case 0xFF69: case 0xFF6A: case 0xFF6B: case 0xFF6C: case 0xFF6D: case 0xFF6E: case 0xFF6F: case 0xFF70: case 0xFF71: case 0xFF72: case 0xFF73: case 0xFF74: case 0xFF75: case 0xFF76: case 0xFF77: case 0xFF78: case 0xFF79: case 0xFF7A: case 0xFF7B: case 0xFF7C: case 0xFF7D: case 0xFF7E: case 0xFF7F: case 0xFF80: case 0xFF81: case 0xFF82: case 0xFF83: case 0xFF84: case 0xFF85: case 0xFF86: case 0xFF87: case 0xFF88: case 0xFF89: case 0xFF8A: case 0xFF8B: case 0xFF8C: case 0xFF8D: case 0xFF8E: case 0xFF8F: case 0xFF90: case 0xFF91: case 0xFF92: case 0xFF93: case 0xFF94: case 0xFF95: case 0xFF96: case 0xFF97: case 0xFF98: case 0xFF99: case 0xFF9A: case 0xFF9B: case 0xFF9C: case 0xFF9D: case 0xFF9E: case 0xFF9F: if (jfm_id == 11 && hankana) { /* 半角片仮名、横書き時 */ cc=3; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ return; } default: if (w != zw) { if (((code >= 0x3041 && code <= 0x30F6) || code == 0x30FC ) && kanatume>=0) { sprintf(buf2,"CH <%X>",code); rewind(afp); while (fgets(buf,255,afp)!=NULL) { if (jfm_id==9 && !strncmp(buf,"FontBBox ",9)) { sscanf(&buf[9],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); height=cc4; } if (!strncmp(buf,buf2,strlen(buf2))) { sscanf(&buf[14],"%d %d %d %d",&cc,&cc2,&cc3,&cc4); if (jfm_id==9) { switch (code) { case 0x3041: case 0x3043: case 0x3045: case 0x3047: case 0x3049: case 0x3063: case 0x3083: case 0x3085: case 0x3087: case 0x308E: case 0x30A1: case 0x30A3: case 0x30A5: case 0x30A7: case 0x30A9: case 0x30C3: case 0x30E3: case 0x30E5: case 0x30E7: case 0x30EE: case 0x30F5: case 0x30F6: case 0x3095: /* JIS X 0213 1-04-85 小書き平仮名か */ case 0x3096: /* JIS X 0213 1-04-86 小書き平仮名け */ case 0x31F0: /* JIS X 0213 1-06-78 小書き片仮名ク */ case 0x31F1: /* JIS X 0213 1-06-79 小書き片仮名シ */ case 0x31F2: /* JIS X 0213 1-06-80 小書き片仮名ス */ case 0x31F3: /* JIS X 0213 1-06-81 小書き片仮名ト */ case 0x31F4: /* JIS X 0213 1-06-82 小書き片仮名ヌ */ case 0x31F5: /* JIS X 0213 1-06-83 小書き片仮名ハ */ case 0x31F6: /* JIS X 0213 1-06-84 小書き片仮名ヒ */ case 0x31F7: /* JIS X 0213 1-06-85 小書き片仮名フ */ case 0x31F8: /* JIS X 0213 1-06-86 小書き片仮名ヘ */ case 0x31F9: /* JIS X 0213 1-06-87 小書き片仮名ホ */ case 0x31FA: /* JIS X 0213 1-06-89 小書き片仮名ム */ case 0x31FB: /* JIS X 0213 1-06-90 小書き片仮名ラ */ case 0x31FC: /* JIS X 0213 1-06-91 小書き片仮名リ */ case 0x31FD: /* JIS X 0213 1-06-92 小書き片仮名ル */ case 0x31FE: /* JIS X 0213 1-06-93 小書き片仮名レ */ case 0x31FF: /* JIS X 0213 1-06-94 小書き片仮名ロ */ skip=-(int)(((double)(1000-(cc4-cc2)-kanatume*2)/2/1000.0)*zw); break; case 0x30FC: skip=-(int)((double)(cc-kanatume)/1000.0*zw); break; default: skip=-(int)(((double)(height-cc4-kanatume)/1000.0)*zw); break; } } else { skip=-(int)(((double)(cc-kanatume)/1000.0)*zw); } if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); break; } } } else { skip = -(zw-w)/2; if (kanatfm) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } } else { if (kanatfm || code>=0x10000) cc=4; else cc=3; if (skip) cc+=numcount(skip)+1; if (skip2) cc+=numcount(skip2)+1; fputnum(cc,4,fp); } break; } fputnum(code,4,fp); /* char code */ fputnum(w,4,fp); /* char width */ if (skip) { fputc(143+numcount(skip)-1,fp); /* RIGHT */ fputnum2(skip,fp); } if (skip2) { fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } if (kanatfm) { if (code <= 0x30F6) fputc(173+fidshift,fp); /* FONT_NUM_2 */ else fputc(172+fidshift,fp); /* FONT_NUM_1 */ } if (code>=0x10000) { fputc(130,fp); /* SET3 */ fputnum(code,3,fp); /* char code */ } else { fputc(129,fp); /* SET2 */ fputnum(code,2,fp); /* char code */ } } void vfclose(FILE *fp) { int i,cc; cc = ftell(fp); for (i = 0 ; i < 4-(cc%4) ; i++) { fputc(248,fp); /* POST */ } fclose(fp); } void maketfm(char *name) { char nbuf[256]; FILE *fp; strcpy(nbuf,name); strcat(nbuf,".tfm"); fp = fopen(nbuf,"wb"); if (fp == NULL) { fprintf(stderr,"I cannot create TFM file, %s.",name); exit(100); } fputnum(jfm_id,2,fp); /* JFM ID */ fputnum(1,2,fp); /* number of char type */ fputnum(27,2,fp); /* file words */ fputnum(2,2,fp); /* header words */ fputnum(0,2,fp); /* min of char type */ fputnum(0,2,fp); /* max of char type */ fputnum(2,2,fp); /* width words */ fputnum(2,2,fp); /* height words */ fputnum(2,2,fp); /* depth words */ fputnum(1,2,fp); /* italic words */ fputnum(0,2,fp); /* glue/kern words */ fputnum(0,2,fp); /* kern words */ fputnum(0,2,fp); /* glue words */ fputnum(9,2,fp); /* param words */ fputnum(0,4,fp); /* check sum */ fputnum(10*(1<<20),4,fp); /* design size */ fputnum(0,2,fp); /* char code */ fputnum(0,2,fp); /* char type */ fputnum((1<<24)+(1<<20)+(1<<16),4,fp); /* char info */ fputnum(0,4,fp); /* width */ fputnum(1<<20,4,fp); /* width */ if (jfm_id == 11) { fputnum(0,4,fp); /* height */ fputnum((int)((1<<20)*0.9),4,fp); /* height */ fputnum(0,4,fp); /* depth */ fputnum((1<<20)-(int)((1<<20)*0.9),4,fp); /* depth */ } else { fputnum(0,4,fp); /* height */ fputnum(1<<19,4,fp); /* height */ fputnum(0,4,fp); /* depth */ fputnum(1<<19,4,fp); /* depth */ } fputnum(0,4,fp); /* italic */ fputnum(0,4,fp); /* tan */ fputnum(0,4,fp); /* kanjiskip */ fputnum(0,4,fp); /* +kanjiskip */ fputnum(0,4,fp); /* -kanjiskip */ fputnum(1<<20,4,fp); /* zh */ fputnum(1<<20,4,fp); /* zw */ fputnum(0,4,fp); /* xkanjiskip */ fputnum(0,4,fp); /* +xkanjiskip */ fputnum(0,4,fp); /* -xkanjiskip */ fclose(fp); }