[Efont-devel] CLWFK の使い方

アーカイブの一覧に戻る

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*****>



Efont-devel メーリングリストの案内
アーカイブの一覧に戻る