$ make COPY=FutoMinA101-Bold $ make COPY=Osaka BASE=Ryumin-Lightなどとすれば、FutoMinA101-Bold CIDFont をベースフォントとする FutoMinA101-Bold-* OCF ファイル群、および、Ryumin-Light CIDFont をベースフォントとする Osaka-* OCF ファイル群が生成されます。
[2002/2/1] 疑似CMapデータを裁断する際、O(N) の計算量を要していた箇所を、O(log N)で済むように大幅に修正致しました。よって、インタプリタがフォント定義ファイルを読み込む際の速度が向上しております。
また、OCFを構成する際に用いられる、いわゆる.notdeffontを、以前はFontType3で作成しておりましたが、他のフォント要素と同じくFontType0 FMapType9で作成するようにしました。よって、構成されたOCFフォントで想定されていないコード領域を印字した場合の挙動が、素のCID- keyedフォントでの挙動と同等になったと思います。
[2002/1/7] 「日本語OCFフォントをCID-keyedフォントから再構成する試み」が、一応成功したみたいなので、ここで報告します。[2002/1/8追記] PostScript3 プリンタにこれらのフォント定義を送り込んで印字させてもきちんと使えているようなので、特に大きな問題はないと思います。
下記の表にあるように、使用頻度を鑑みて、Adobe-official CMapがなくてもOCFとして動作するように作成したのもあります。もっとも、現状のgs-cjkではTrueTypeフォントをCIDFontとしてを使う場合はAdobe-official CMapは必須です。よって、完全にofficial CMapなしに済ますには、Kochi CIDフォントのようなnative CIDFont(CIDFontType0, CFF OpenType等)を使う必要があります。
使い方は簡単で、gs|gs-cjkにおいて、Ryumin-Light CIDFontが(もしくは別名としてそれが)存在すれば、以下に示すファイルをgsのfontsもしくはResource/Fontに置けばすぐに使えるようになります。
FontName Adobe-official CMap FMapType及び摘要 -------- ---------------- ------------------------ Ryumin-Light-H|V 不要 2 Ryumin-Light-EUC-H|V 不要 2 Ryumin-Light-FMap5-EUC-H|V 不要 5 gsで動かない! Ryumin-Light-RKSJ-H|V 不要 6, 2 Ryumin-Light-83pv-RKSJ-H 不要 6, 2 Ryumin-Light-78-H|V 必要 2 Ryumin-Light-78-EUC-H|V 必要 2 Ryumin-Light-78-RKSJ-H|V 必要 6, 2 Ryumin-Light-Ext-H|V 必要 2 Ryumin-Light-Ext-EUC-H|V 必要 5 gsで動かない! Ryumin-Light-Ext-RKSJ-H|V 必要 6, 2 Ryumin-Light-NWP-H|V 必要 2 ------------------------------------------------------------------------
配布アーカイブには、それぞれに対応するGothicBBB-Medium-*も同梱されています(他に必要なエンコーディングの種類等があればご連絡下さい)。
また、FMapType5で構成されたOCF(Ryumin-Light-FMap5-EUC-H|V, Ryumin-Light-Ext-EUC-H|V)は、現在[2002/1/7]のgs|gs-cjkでは正しく動作しません。
次に、典型的な2例の、CIDFontで構成されたOCFの構造を以下に示します。
[ISO2022 94^2コードセット系] ------------------------------------------------------------------------ Ryumin-Light-H FontType 0 FMapType 2 FDepVector [ .notdeffont FontType 0 FMapType 9(nil CMap) Ryumin-Light-H21 FontType 0 FMapType 9 : Ryumin-Light-H28 Ryumin-Light-H30 : Ryumin-Light-H74 ] ------------------------------------------------------------------------
[ShiftJIS系] ------------------------------------------------------------------------ Ryumin-Light-RKSJ-H FontType 0 FMapType 6 FDepVector [ Ryumin-Light-RKSJ-HS00 FontType 0 FMapType 9 .notdeffont FontType 0 FMapType 9(nil CMap) Ryumin-Light-RKSJ-H81-9F FontType 0 FMapType 2 FDepVector [ Ryumin-Light-RKSJ-H81 FontType 0 FMapType 9 : Ryumin-Light-RKSJ-H84 Ryumin-Light-RKSJ-H88 : Ryumin-Light-RKSJ-H9F ] Ryumin-Light-RKSJ-HSA0 FontType 0 FMapType 9 Ryumin-Light-RKSJ-HE0-EA FontType 0 FMapType 2 FDepVector [ Ryumin-Light-RKSJ-HE0 FontType 0 FMapType 9 : Ryumin-Light-RKSJ-HEA ] .usrdeffont FontType 0 FMapType 9(nil CMap) (=.notdeffont) .notdeffont FontType 0 FMapType 9(nil CMap) ] SubsVector <00 80 01 1f 40 10 0c> ------------------------------------------------------------------------
このように、伝統的なJapanese OCFとほぼ同等の構成になっております。
この「CID-keyedフォントからOCFフォントの再構成」の技術は、片山氏のfixeucfont[1]を参考にさせて頂きましたが、fixeucfontでは、FontType3でCIDFont+CMap composefont (or OCF)をくるんでそれをデセンダフォントとして構成しており、一方こちらは、CIDFont+CMap composefontそのものをデセンダフォントとしています。理由は単に目的の違いですが、そのため、いわゆるひとつのCMapデータセットをコードレンジ毎に『裁断』して、Subset CMapデータ群を作成しています。上で示した例で言えば、「RKSJ-HS00, RKSJ-H81 .. RKSJ-H9F, RKSJ-HSA0」は真にCMap辞書の名前を表しています。伝統的なJapanese OCFのベースフォント名ではこれらは、「Roman, sr81 .. sr9F, SuppK」というようなサフィックスに対応しています。
もっとよい方法があるかもしれませんが、「もしJapanese以外のOCF再構成の要望があったら?」という懸念材料があったので、そのようなプログラム構造になってしまっています。よって、Japanese以外や他のエンコーディングへ応用したければ、Ryumin-Light-78-H|Vを改造すれば、それほど難しくなく他の言語等に応用できると思います。[2002/2/1追記] さらにその「汎用性」を徹底しました。ここで用いられている疑似CMapのパーサに、usual Adobe CMapのすべてを処理させても問題がないようなので、Japanese以外でのOCF emulationにも簡単に応用できるようになったと思います。
FontName possible FMapType possible Encoding possible (SubsVector and/or)FDepVector -------- -------- -------- -------- -78-EUC-H 5 JIS12-97-CF no, r21..r28, 78.r30..78.r73, no -78-EUC-V 5 JIS12-97-CF same above except for r21v, r24v, r25v -78-H 2 JIS12-88-CF no, r21..r28, 78.r30..78.r73, no -78-V 2 JIS12-88-CF same above except for r21v, r24v, r25v -78-RKSJ-H 6 [0 1 2 3 4 5 6] (00 80 01 1F 40 10 0C).Roman, no, -78-SuppA-H, .SuppK, -78-SuppB-HV, UserGaiji, no -78-RKSJ-V 6 [0 1 2 3 4 5 6] same above except for -78-SuppA-V -78-SJ-H 2 ShiftJIS12-88-CF no, sr81..sr84, 78.sr88..78.srEA -78-SJ-V 2 ShiftJIS12-88-CF same above except for sr81v..sr83v -78-SuppA-H 2 ShiftJIS-A-CF no, sr81..sr84, 78.sr88..78.sr9F -78-SuppA-V 2 ShiftJIS-A-CF same above except for sr81v..sr83v -78-SuppB-HV 2 ShiftJIS-B-CF 78.srE0..78.srEA -83pv-RKSJ-H 6 [0 1 2 3 4 5 6] (00 80 01 1F 40 10 0C)A Roman, no, -83pv-SuppA-H, .SuppK, -83pv-SuppB-H, UserGaiji, no -83pv-SuppA-H 2 ExtShiftJIS-A-CF no, sr81..sr84, Ext.sr85..Ext.sr88, sr89..sr9F -83pv-SuppB-H 2 [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0] no, srE0..srEA, sr81v..sr83v, Ext.sr87v -EUC-H 5 JIS12-97-CF no, r21..r28, r30..r74 -EUC-V 5 JIS12-97-CF same above except for r21v, r24v, r25v -Ext-EUC-H 5 ExtJIS12-97-CF maybe complex -Ext-EUC-V 5 ExtJIS12-97-CF maybe complex -Ext-H 2 ExtJIS12-88-CF maybe complex -Ext-V 2 ExtJIS12-88-CF maybe complex -Ext-RKSJ-H 6 [0 1 2 3 4 5 6] (00 80 01 1F 40 10 0C).Roman, no, -Ext-SuppA-H, .SuppK, -Ext-SuppB-HV, UserGaiji, no -Ext-RKSJ-V 6 [0 1 2 3 4 5 6] same above except for -Ext-SuppA-V -Ext-SJ-H 2 ExtShiftJIS12-88-CF maybe complex -Ext-SJ-V 2 ExtShiftJIS12-88-CF maybe complex -Ext-SuppA-H 2 ExtShiftJIS-A-CF maybe complex -Ext-SuppA-V 2 ExtShiftJIS-A-CF maybe complex -Ext-SuppB-HV 2 ShiftJIS-B-CF maybe complex -H 2 JIS12-88-CF no, r21..r28, r30..r74 -V 2 JIS12-88-CF same above except for r21v, r24v, r25v -NWP-H 2 ExtJIS12-88-CF maybe complex -NWP-V 2 ExtJIS12-88-CF maybe complex -RKSJ-H 6 [0 1 2 3 4 5 6] (00 80 01 1F 40 10 0C).Roman, no, -SuppA-H, .SuppK, -SuppB-HV, UserGaiji, no -RKSJ-V 6 [0 1 2 3 4 5 6] same above except for -SuppA-V -SJ-H 2 ShiftJIS12-88-CF no, sr81..sr84, sr88..sr9F, srE0..srEA -SJ-V 2 ShiftJIS12-88-CF same above except for sr81v..sr83v -SuppA-H 2 ShiftJIS-A-CF no, sr81..sr84, sr88..sr9F -SuppA-V 2 ShiftJIS-A-CF same above except for sr81v..sr83v -SuppB-HV 2 ShiftJIS-B-CF no, srE0..srEA --------
(注) Level2日本語PostScriptプリンタから見えるfonts/*, Resource/Encoding/*資源のファイル名、及び、VFlib-patched gsから見えるfonts/*資源のファイル名を参考にしてます。
Encoding -------- JIS12-88-CF [ 16#00 1 16#20 { pop 0 } for 16#21 1 16#28 { 16#20 sub } for 16#29 1 16#2F { pop 0 } for 16#30 1 16#74 { 16#27 sub } for 16#75 1 16#FF { pop 0 } for ] JIS12-97-CF [ 16#00 1 16#20 { pop 0 0 } for 16#21 1 16#28 { 16#20 sub 0 exch } for 16#29 1 16#2F { pop 0 0 } for 16#30 1 16#74 { 16#27 sub 0 exch } for 16#75 1 16#FF { pop 0 0 } for ] ShiftJIS-A-CF [ 16#81 1 16#84 { 16#80 sub } for 16#85 1 16#87 { pop 0 } for 16#88 1 16#9f { 16#83 sub } for ] ShiftJIS-B-CF [ 16#e0 1 16#ea { 16#df sub } for 16#eb 1 16#ef { pop 0 } for ] ExtJIS12-88-CF [ 16#00 1 16#20 { pop 0 } for 16#21 1 16#74 { 16#20 sub } for 16#75 1 16#FF { pop 0 } for ] ExtJIS12-97-CF [ 16#00 1 16#20 { pop 0 0 } for 16#21 1 16#74 { 16#20 sub 0 exch } for 16#75 1 16#FF { pop 0 0 } for ] ShiftJIS-A-CF [ 16#81 1 16#9f { 16#80 sub } for ] --------
(注) VFlib-patched gsのソースを参考にしてます。