KANOU Hiroki
kanou****@khdd*****
2005年 5月 1日 (日) 22:48:31 JST
狩野です。 岩井さん、ご指摘ありがとうございました。CVS の efont/ff+clwfk 以下に パッチを置きました。 (CVSWeb では http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/efont/ から たどれます) > 少し話はずれますが、wadalab-fontkit について、 kanjidata/load.l で > extra.l を load していますが、ファイルが存在しないのでエラーになります。 これも commit し忘れていたので置きました。 (今まで誰も実行した人がいなかったということですね…。) いい機会ですので、和田研フォントキットの使い方を解説しておこうと思います。 ◆コンパイル 現在、CMU Common Lisp 19a でしか実行確認をしていませんが、 移植時には GNU clisp 2.33 でも確認していました。(clisp は Cygwin にも移植されているので、Windows 上でも FF+CLWFK が 動かせるかもしれません。) ファイルは日本語 EUC で書かれていますので、環境変数 LANG を 日本語 EUC の OS 標準の名称に設定しておいてください。 efont/wadalab-fontkit/renderer が、文字作成エンジン部分です。 このディレクトリの下で make してください。私の環境では、 コンパイルしないと「assq, memq を再定義しようとした」という 意味のエラーメッセージを吐いて動きません。(fboundp でチェック しているつもりなのですが…)。 ◆実行 efont/sazanami/makeall.l や efont/wadalab-fontkit/build/ の下のサンプル ファイルを見て頂ければ分かりますが、まず最初に和田研フォントキットと そのデータを読み込む必要があります。 下の、---- の間に挟まれた部分は (load-directory で指定するディレクトリを 実際の場所に合わせることを除いて) 固定の内容です。後半は簡単な漢字「仆」の サンプルです。 ;------------------------------------------------------------- (and (equal (lisp-implementation-type) "CMU Common Lisp") (setq *top-level-auto-declare* t)) (defvar base-directory) ; コンパイラが通らない時は次の行をコメントアウト (defparameter source-load nil) (let* ((base-directory dir)) (load (concatenate 'string base-directory "/" "load.l")))) (load-directory "../wadalab-fontkit/renderer/") (load-directory "../wadalab-fontkit/primdata/") (load-directory "../wadalab-fontkit/jointdata/") (load-directory "../wadalab-fontkit/kanjidata/") ;------------------------------------------------------------- ;; 部品の並びを表す抽象的な定義 ;(print 仆) ;; 構成部品の定義 ;(print にんべん) ;(print 卜) ;; 構成部品 (にんべん, 卜) と、それらの拡大/縮小・平行移動を表す変換行列 ;(print (expandkanji 仆)) ;; 各ストローク (hidari, tate, tate, ten) の通る点の位置 ;(print (applykanji 仆 'gothic)) ;; それを 400×400 にバランスよく収まるように調整し、肉付けに不要な情報を除去 ;(print (rm-limit (normkanji (applykanji 仆 'gothic)))) ;; 4 本のストロークの左右に輪郭線を引き、線端を繋いで 4 個のアウトラインを作る ;(print (skeleton2list (rm-limit (normkanji (applykanji 仆 'gothic))) 'gothic)) ;; 重なり合うアウトラインを結合し、独立した 2 個のアウトラインに整理する ;(print ; (makeoutline ; (skeleton2list (rm-limit (normkanji (applykanji 仆 'gothic))) 'gothic))) (quit) これらの print 文のコメントアウトを一つずつ外して実行してみれば、処理が どのように順を追って行われるかを理解できると思います。 上記の内容を test.l として保存して、 lisp -quiet -batch -load test.l を実行してみてください。 ◆プリミティブのデータ形式 とくに重要なのは、expandkanji (再帰的な組合せ定義を展開し、各部品の大きさの バランスを求めて配置する関数) を行った後のデータ形式です。それ以上分解不可能 な部品 (プリミティブ) も、これと同じ形式で定義されています。primdata/ の下の ファイルは一般に、データをこの形のリストで与えています。FontForge の CLWFK 対応の改造は、このデータを編集できるようにすることが当面の目標です。 「仆」の場合、以下のようになります (点の座標は丸め、シンボルは小文字で表示 しています) (((176.4 12.4) (123.5 135.1) (0.0 210.3) (117.6 125.8) (117.6 392.8) (148.4 -10.3) (148.4 402.1) (244.5 136.5) (400.0 250.9) (243.6 0.0) (243.6 400.0)) ((hidari (0 1 2) (link 3)) (tate (3 4)) (xlimit (5 6)) (ten (7 8)) (tate (9 10) (link 7) (link 0))) (xunit . 156.41472) (yunit . 154.63916) (ylimit 0 400) (center)) リストの最初の要素は、点の座標の一覧です。全角が 400×400 の大きさで、 左上が (0, 0) となっています。FontForge で使う座標系とは上下逆ですので ご注意ください。2 本以上のストロークの終端が集まる (つまり、角になる) 点の場合、その点が角であることを (176 12 (link-ok t)) のように表します。 次の要素は、ストロークの一覧です。例えば最初のストロークは次のように なっています。 (HIDARI (0 1 2) (LINK 3)) ストロークの第一要素 は、種類を表すシンボル (この場合、左払いなので hidari) です。第二要素は、ストロークを構成する折れ線の点番号一覧のリストで、先ほどの 点の座標リストの中の並び順で表します。そして、(LINK 3) は、このストロークの 途中の位置 (点 3 のある場所) で、他のストロークと接続することを表します。 2 番目のストロークが (TATE (3 4)) ですので、この縦画の開始位置が左払いの 途中に存在することを表します。 xlimit は構成部品の境界を表す仮想的なストロークで、後の処理で削除されます。 点一覧とストローク一覧に続く第 3 要素以降は、このプリミティブが組合せ られた時のバランスを算出するためのデータです。 xunit, yunit は、それぞれ縦画同士・横画同士の平均間隔に相当する値です。 2 つの部品を縦横に組み合わせる時、この値が一定になるように組み合わせます。 ◆フォントの出力 実際にフォントを出力するためには、いくつかの関数がありますが、FontForge で 編集可能な SFD ファイルを出力する関数は以下の構文です。 (out-to-sfd-all kanjilist 'mincho "output.sfd" "fontname") ここで、kanjilist は、漢字シンボルからなるリストです。 'mincho の代わりに 'gothic, 'maru のどちらかを指定することができます。 3 番目の引数は、書き出すファイル名です。 最後は、SFDに格納されるフォント名です。 Type1 フォントが埋め込まれた PostScript ファイル (各文字を格子状に並べて 枠つきで印字する) を出力するには、以下のようにします。 (out-to-ps-all kanjilist 'mincho "output.ps") あらかじめパラメータを設定しておくことにより、フォントの太さを変えられます。 フォントキットを読み込んだ後、文字の処理を行う前に設定してください。 (setq minchowidth 8.0) (setq gothicwidth 12.0) どちらも、この数値の 2 倍が実際の画の太さ (明朝の場合は縦画の太さ) となり ます。全角は 400 ですから、幅が 8.0 と指定された場合、線の太さは 全角の 25 分の 1 の太さとなります。 より詳しい内部構造などは後日説明したいと思います。 狩野 宏樹 <kanou****@khdd*****>