`Yen to BackSlash' patches for TrueType fonts 09/02/1997 Keisuke Mori (ksk@ntts.com) Windows 95 の TrueType font「MSゴシック」「MS明朝」の中の ASCII コード 0x5b の文字(¥記号)を、バックスラッシュに置き換える パッチです。 以下のファイルが入っています。 README このファイル MSGOTHIC.COM 「MSゴシック」MSGOTHIC.TTC へのパッチ MSMINCHO.COM 「MS明朝」MSMINCHO.TTC へのパッチ TTyen2bs.bat パッチ当て作業を行うバッチファイル パッチファイル MSGOTHIC.COM, MSMINCHO.COM は、自己更新形式の実行 ファイルです。いずれも amaproワキチさん作の WSP V1.50 で作成した 自己更新形式の実行ファイルに、さらに毎黒仮節渡万さん作の「WSP自 己展開差分タイムスタンプ比較抑制ツール」 WSPST V1.0 を適用したも のです。 作業は以下の手順で行います。 (1) MS-DOS モードで起動する。 (2) 復旧用に各フォントファイルのバックアップを作っておく。 (3) フォントファイルのディレクトリに移動し、自己更新形式のパッチ ファイルを実行する。 (4) TrueType フォントキャッシュファイル(c:\windows\ttfcache)の隠 し属性を外し、削除する。 (5) Windows 95 を再起動する。 バッチファイル TTyen2bs.bat は、上記の (2), (3), (4) の手順を自 動的に行うバッチファイルです。先頭の三行の変数の値を設定して実行 してください。もちろんこのバッチファイルを使用せず、手作業で行っ ても構いません。 com_dir : .COM ファイルが展開されているディレクトリ org_dir : バックアップファイルをコピーするディレクトリ win_dir : Windows95 のインストールされているディレクトリ なお、作者は TrueType Font format を正確に理解して作成したわけで はありませんので、このパッチを当てても全く問題がないという保証は できません。したがって、このパッチの使用は全て使用者の責任で行っ てください。このパッチを使用して生じたいかなる損害に対しても作者 は責任を負いません。 謝辞: このパッチを作成するにあたって、角川裕次さん作の VFlib-2.22-PL8 のコードとライブラリを非常に活用させていただきま した。この場を借りてお礼申し上げます。ありがとうございました。 参考資料: ・TrueType 1.0 Font Files Technical Specification, Revision 1.66, November 1995 ftp://ftp.microsoft.com/developr/drg/TrueType/ttspec.zip ・VFlib-2.22-PL8 http://www.se.hiroshima-u.ac.jp/~kakugawa/Hacks/Hacks-JIS.html ----8<--------8<--------8<--------8<--------8<--------8<--------8<---- 付録: 参考までに、作者が解析した `/' 文字の glyph データと、それを左右 反転させたバックスラッシュ文字のデータを以下につけます。これは単 なる作者のメモ書きなので、特に理解する必要はありません。 **** msgothic.ttc xMin = -0, yMin = -35, UPE = 256 `/' 46(0x2e); slash GlyphIndex: 18df90 ( - 18e000d) dumps: 0018df90: 0001 0005 fff8 0079 00bb 0003 0064 4051 .......y.....d@Q 0018dfa0: 6401 6b03 7401 7b03 0444 014b 0354 015b d.k.t.{..D.K.T.[ 0018dfb0: 0304 2401 2b03 3401 3b03 0400 0114 011b ..$.+.4.;....... 0018dfc0: 0303 dd03 ed03 f601 fd03 0407 0136 0166 .............6.f 0018dfd0: 0168 0377 0179 0387 0189 03a6 01a9 03cd .h.w.y.......... 0018dfe0: 030b 0103 0300 017f 029f 02bf 02df 0204 ................ 0018dff0: 022f 5dcc dcdc 002f 2f31 3001 5d5d 7171 ./]....//10.]]qq 0018e000: 7171 3707 2737 796a 0a6a b5bd 06bd qq7.'7yj.j...... 0001 number of contours 0005 xmin fff8 ymin 0079 xmax 00bb ymax 0003 max number of points 0064 number of bytes for instructions (...) instructions (listed below) 37 07 27 37 flags list 79 6a 0a 6a x list b5 bd 06 bd y list flags start:18e002 p flags x y geometory(in VFlib) p0 0x37 0x79(+121) 0xb5(+181) (121,40) p1 0x07 0x6a(-106) 0xbd(-189) (15,229) p2 0x27 0x0a(-10) 0x06(+6) (5,223) p3 0x37 0x6a(+106) 0xbd(+169) (111,34) flags: bit OR of: REPEAT_FLAGS(0x08) ONCURVE(0x01) XSHORT(0x02) | SHORT_X_IS_POS(0x10) or NEXT_X_IS_ZERO(0x10) YSHORT(0x04) | SHORT_Y_IS_POS(0x20) or NEXT_Y_IS_ZERO(0x20) VFLib form geometory is calculated as: ((-xMin + x), (UPE - (-yMin + y)) see VF_TT.c: TTread_font() function Instructions 2f MDAP[a] p(02) ; Move Direct Absolute Point 5d DELTAP1 n(04), (02,df), (02, bf), (02, 9f), (02, 7f) DELTAP1 size chart 0 -> 9 1 -> 10 2 -> 11 3 -> 12 4 -> 13 5 -> 14 6 -> 15 7 -> 16 8 -> 17 9 -> 18 a -> 19 b -> 20 c -> 21 d -> 22 e -> 23 f -> 24 cc MDRP[bc] p(01) ; Move Direct Relative Point dc MDRP[abc] p(00) dc MDRP[abc] p(03) 00 SVTCA[] ; set projection vector, freedom vector to y-axis 2f MDAP[a] p(03) 2f MDAP[a] p(01) 31 IUP[a] : x-axis 30 IUP[] : y-axis 01 SVTCA[a] : set vectors to x-axis 5d DELTAP1 n(0b), (03,cd), (03,a9), (01,a6), (03,89), (01,87), (03,79), (01,77), (03,68), (01,66), (01,36), (01,07) 5d DELTAP1 n(04), (03,fd), (01,f6), (03,ed), (03,dd) 71 DELTAP2 n(03), (03,1b), (01,14), (01,00) 71 DELTAP2 n(04), (03,3b), (01,34), (03,2b), (01,24) 71 DELTAP2 n(04), (03,5b), (01,54), (03,4b), (01,44) 71 DELTAP2 n(04), (03,7b), (01,74), (03,6b), (01,64) *** msgothic.ttc xMin = -0, yMin = -35, UPE = 256 `\' 91(0x5b); Yen GlyphIndex: 18fed6 - flags starts: 18ff7c (omit) *** msgothic.ttc xMin = -0, yMin = -35, UPE = 256 `\' 91(0x5b); back slash GlyphIndex: 18fed6 ( - 18ff53) dumps: 0018fed0: xxxx xxxx xxxx 0001 0005 fff8 0079 00bb 0018fee0: 0003 0064 4051 6b01 6403 7b01 7403 044b 0018fef0: 0144 035b 0154 0304 2b01 2403 3b01 3403 0018ff00: 040f 011b 0114 0303 d203 e203 f901 f203 0018ff10: 0408 0139 0169 0167 0378 0176 0388 0186 0018ff20: 03a9 01a6 03c2 030b 0103 0300 017f 029f 0018ff30: 02bf 02df 0204 022f 5dcc dcdc 002f 2f31 0018ff40: 3001 5d5d 7171 7171 3717 3727 056a 0a6a 0018ff50: b5bd 06bd 0001 number of contours 0005 xmin fff8 ymin 0079 xmax 00bb ymax 0003 max number of points 0064 number of bytes for instructions (...) instructions (listed below) 37 17 37 27 flags list 05 6a 0a 6a x list b5 bd 06 bd y list flags starts: 18ff44 p flags x y geometory(in VFlib) p0 0x37 0x05(+5) 0xb5(+181) (5,40) p1 0x17 0x6a(+106) 0xbd(-189) (111,229) p2 0x37 0x0a(+10) 0x06(+6) (121,223) p3 0x27 0x6a(-106) 0xbd(+169) (15,34) Instructions 2f MDAP[a] p(02) ; Move Direct Absolute Point 5d DELTAP1 n(04), (02,df), (02, bf), (02, 9f), (02, 7f) cc MDRP[bc] p(01) ; Move Direct Relative Point dc MDRP[abc] p(00) dc MDRP[abc] p(03) 00 SVTCA[] ; set projection vector, freedom vector to y-axis 2f MDAP[a] p(03) 2f MDAP[a] p(01) 31 IUP[a] : x-axis 30 IUP[] : y-axis 01 SVTCA[a] : set vectors to x-axis 5d DELTAP1 n(0b), (03,c2), (03,a6), (01,a9), (03,86), (01,88), (03,76), (01,78), (03,67), (01,69), (01,39), (01,08) 5d DELTAP1 n(04), (03,f2), (01,f9), (03,e2), (03,d2) 71 DELTAP2 n(03), (03,14), (01,1b), (01,0f) 71 DELTAP2 n(04), (03,34), (01,3b), (03,24), (01,2b) 71 DELTAP2 n(04), (03,54), (01,5b), (03,44), (01,4b) 71 DELTAP2 n(04), (03,74), (01,7b), (03,64), (01,6b) *** msmincho.ttc xMin = -0, yMin = -35, UPE = 256 `/' 46(0x2e); slash GlyphIndex: 19a632 ( - 19a665) dumps: 0019a630: 0708 0001 0009 ffed 0076 00c7 0003 001a .........v...... 0019a640: 400d 4600 6600 7600 0300 0202 0300 012f @.F.f.v......../ 0019a650: ccdc dc00 2f2f 3130 015d 1727 3717 1007 ....//10.].'7... 0019a660: 6607 1304 d604 0002 000c 0002 0073 00b1 f............s.. 0001 number of contours 0009 xmin ffed ymin 0076 xmin 00c7 ymin 0003 max number of points 001a number of bytes for instructions (...) instructions(listed below) 17 27 37 17 flags list 10 07 66 07 x list 13 04 d6 04 y list flags starts: 19a65a p flags x y geometory p0 0x17 0x10(+16) 0x13(-19) (16,16) p1 0x27 0x07(-7) 0x04(+4) (9,20) p2 0x37 0x66(+102) 0xd6(+214) (111,234) p3 0x17 0x07(+7) 0x04(-4) (118,230) Instructions: 2f MDAP[a] p(01) cc MDRP[bc] p(00) dc MDRP[abc] p(03) dc MDRP[abc] p(02) 00 SVTCA[] 2f MDAP[a] p(02) 2f MDAP[a] p(00) 31 IUP[a] 30 IUP[] 01 SVTCA[a] 5d DELTAP1 n(03), (00, 76), (00, 66), (00, 46) *** msmincho.ttc `\' 91(0x5b); Yen GlyphIndex: 19d23e - (omit) *** msmincho.ttc xMin = -0, yMin = -35, UPE = 256 `\' 91(0x5b); back slash GlyphIndex: 19d23e ( - 19d271) dumps: 0019d230: xxxx xxxx xxxx xxxx xxxx xxxx xxxx 0001 0019d240: 0009 ffed 0076 00c7 0003 001a 400d 4900 0019d250: 6900 7900 0300 0202 0300 012f ccdc dc00 0019d260: 2f2f 3130 015d 1737 2707 6f07 6607 1304 0019d270: d604 0001 number of contours 0009 xmin ffed ymin 0076 xmin 00c7 ymin 0003 max number of points 001a number of bytes for instructions (...) instructions(listed below) 17 37 27 07 flags list 6f 07 66 07 x list 13 04 d6 04 y list flags starts: 19a65a p flags x y geometory p0 0x17 0x6f(+111) 0x13(-19) (111,16) p1 0x37 0x07(+7) 0x04(+4) (118,20) p2 0x27 0x66(-102) 0xd6(+214) (16,234) p3 0x07 0x07(-7) 0x04(-4) (9,230) Instructions: 2f MDAP[a] p(01) cc MDRP[bc] p(00) dc MDRP[abc] p(03) dc MDRP[abc] p(02) 00 SVTCA[] 2f MDAP[a] p(02) 2f MDAP[a] p(00) 31 IUP[a] 30 IUP[] 01 SVTCA[a] 5d DELTAP1 n(03), (00, 79), (00, 69), (00, 49) ----8<--------8<--------8<--------8<--------8<--------8<--------8<----