diff options
author | Peter Breitenlohner <peb@mppmu.mpg.de> | 2012-01-16 14:44:56 +0000 |
---|---|---|
committer | Peter Breitenlohner <peb@mppmu.mpg.de> | 2012-01-16 14:44:56 +0000 |
commit | c0b77e85fa6f50dcb376db6dad932c2147cff804 (patch) | |
tree | 8bb1fad58bf10bfa14106cbfc345ef0669d1fa00 /Build/source/texk/makejvf/write.c | |
parent | 3fa84a3afddbb0384c56c6ed1de16132a71b30a5 (diff) |
upTeX 1.00 - from TANAKA Takuji <KXD02663@nifty.ne.jp>
git-svn-id: svn://tug.org/texlive/trunk@25119 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/makejvf/write.c')
-rw-r--r-- | Build/source/texk/makejvf/write.c | 475 |
1 files changed, 469 insertions, 6 deletions
diff --git a/Build/source/texk/makejvf/write.c b/Build/source/texk/makejvf/write.c index 0ef2617aa78..2cd309f30dc 100644 --- a/Build/source/texk/makejvf/write.c +++ b/Build/source/texk/makejvf/write.c @@ -3,11 +3,14 @@ #include <kpathsea/config.h> #include "makejvf.h" +#include "uniblock.h" FILE *vfopen(char *name) { FILE *fp; + int fidshift=0; + if (fidzero) fidshift=-1; fp = fopen(name,"w"); if (fp == NULL) { fprintf(stderr,"I cannot create VF file, %s.",name); @@ -21,7 +24,7 @@ FILE *vfopen(char *name) fputnum(10*(1<<20),4,fp); /* TFM design size */ fputc(243,fp); /* fnt_def1 */ - fputc(1,fp); /* Font ID */ + fputc(1+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ @@ -34,7 +37,7 @@ FILE *vfopen(char *name) if (kanatfm) { fputc(243,fp); /* fnt_def1 */ - fputc(2,fp); /* Font ID */ + fputc(2+fidshift,fp); /* Font ID */ fputnum(0,4,fp); /* TFM check sum */ if (chotai) fputnum(zh,4,fp); /* font design size (scaled) */ @@ -46,6 +49,33 @@ FILE *vfopen(char *name) 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; } @@ -53,6 +83,9 @@ 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); @@ -109,7 +142,7 @@ void writevf(int code, FILE *fp) fputc(157+numcount(skip2)-1,fp); /* DOWN */ fputnum2(skip2,fp); } - if (kanatfm) fputc(173,fp); /* FONT_NUM_2 */ + if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2146) fputnum(0x216c,2,fp); /* char code */ @@ -189,7 +222,7 @@ void writevf(int code, FILE *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,fp); /* FONT_NUM_2 */ + if (kanatfm) fputc(173+fidshift,fp); /* FONT_NUM_2 */ fputc(129,fp); /* SET2 */ if (code == 0x2147) fputnum(0x216c,2,fp); /* char code */ @@ -328,14 +361,444 @@ void writevf(int code, FILE *fp) } if (kanatfm) { if (code <= 0x2576) - fputc(173,fp); /* FONT_NUM_2 */ + fputc(173+fidshift,fp); /* FONT_NUM_2 */ else - fputc(172,fp); /* FONT_NUM_1 */ + 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; |