フォントの合成 (1)

フォントの合成
フォントを合成する場合、まずは以下の点に注意する必要があります。

  • OpenType と TrueType では、フォントの設定として重要な EM の値が異なるため、この2つを合成する場合は、出力する際のフォントタイプに応じて、どちらかの EM に合わせた上で、グリフの点の座標を拡大縮小する必要があります。
  • フォントは、それぞれでグリフの位置や大きさが微妙に異なるので、合成した時にグリフのバランスが合わないようであれば、グリフの位置や大きさを調整する必要があります。

OpenType (特に CID フォント) と TrueType などを合成する場合は、事前にいくつかの調整が必要になります。

ただし、フォントの形式が同じで、バランスも合っているグリフの場合は、FontForge の「フォントの統合」機能を使うことで、比較的簡単に合成できます。

ここでは、「フォントの統合」機能を使って、フォント形式が同じで、細かな調整が必要ないフォント同士を合成する場合の方法を解説していきます。
統合時の合成の順番
FontForge では、現在開いて編集しているフォントに対して、別のフォントファイルを読み込んで統合するという、便利な機能があります。

CID フォントの場合は少し複雑になりますが、これを使えば、合成自体は簡単に行うことが出来ます。

ただし、この時、フォントを合成する順番に気を付けてください。

A + B の統合
現在の編集フォントを A、統合するフォントを B として、FontForge のフォント統合機能で、A + B を行った場合、A と B で重複するグリフがあった場合は、A のグリフが残ります

そのため、A のフォントを B のグリフで置き換えたい、という場合は、A のフォント上で、あらかじめ、B と重複するグリフを空の状態にしておく必要があります。

このやり方の場合、置き換えるグリフが少ない場合は、手動で A のフォントのグリフを空にして A + B を行えば、特に問題はありません。

しかし、置き換える B のフォントのグリフ数が多い場合、A のフォントのグリフを空にする手間が掛かるので、効率が悪くなります。

B + A の統合
この場合は、逆の手順を考えるとシンプルになります。
つまり、B + A を行うことで、B のグリフは残し、B に含まれない A のグリフを統合する、という方法です

かなフォントと漢字などを含むフォントを合成する場合は、最初にかなフォントを開いて、漢字フォントを後で合成する、という手順になります。
合成の手順
では、実際に合成してみます。

ここでは、例として、かなフォント (OpenType) と日本語フォント (OpenType) を合成することを想定します。
フォント設定やグリフのバランスなどはあらかじめ合っているものとします。
置き換えたいグリフが含まれたフォントを開く
まずは、FontForge で、置き換えたいグリフが含まれたフォントを開きます。

かなフォントと日本語フォントを合成する場合は、先に、かなフォントを開きます。
CID フォントかどうか確認
フォントを開いた後、メニューの「CID」を開いて、OpenType の CID フォントかどうかを確認してください。

CID フォントの場合、以下のように、「フォント名-文字種」といった名前のサブフォントが登録されています。



このような状態の場合は、CID フォントです。

CID フォントというのは、主に、グリフ数の多い CJK (中国語/日本語/韓国語) フォントで使われます。
これは、欧文などで使われる通常の CFF 形式を、大量のグリフに対応できるようにした拡張版です。

CID フォントでは、各グリフに、Unicode などとは別に、"Adobe-Japan-6" などの文字コレクションで定義された CID の番号が割り当てられています。

CID は、Unicode とは全く別のものであり、異体字一つ一つに CID が割り当てられていたり、縦書き用グリフにも独立した CID があるなど、Unicode と比べると、一つ一つのグリフが独立しています。

ただし、CID 値自体は、通常のテキスト描画では使われません。
使われるのは主に DTP ソフト上などで、詳細なフォント処理を行う時です。

FontForge での操作
FontForge で扱う上での CID フォントの特徴は、グリフがいくつかの種類に分かれて、サブフォントが形成されている点です。

FontForge で CID フォントを開いた場合は、メニューの「CID」で、編集するサブフォントを選択する必要があります。

グリフ一覧上では、選択されたサブフォントの中に分類されているグリフしか表示されません。
選択されたサブフォント以外の中に含まれるグリフは表示されないので、注意してください。

また、CID フォントでは、「CID」>「CIDフォント情報」でフォント全体の情報が表示され、「エレメント」>「フォント情報」では、現在選択されているサブフォントの情報が表示されます。
CID フォントの場合、不要な文字種のグリフがあれば削除
CID フォントでは、文字の種類ごとにサブフォントが存在し、グリフがまとめられています。

もしも CID フォント内で、合成に不要なグリフがある場合は、サブフォント自体を削除することで、文字種別に一括してグリフを削除することが出来ます。

まず、グリフ一覧が見やすくなるように、「エンコーディング」>「定義済みのグリフのみ表示」を ON にしておきます。

次に、「CID」メニューから、各サブフォントを選択し、登録されているグリフを表示します。

グリフ一覧を見た上で、このサブフォント内のすべてのグリフが不要であると判断した場合、「CID」>「フォントを削除」で、現在選択されているサブフォントを削除してください。
これを、すべてのサブフォントで繰り返します。

もし、サブフォント内の一部で不要なグリフが含まれるといった場合は、それらのグリフを個別に削除しても構いません。
個々のグリフの削除については、少し後で説明します。
CID フォントの場合、単一化する
CID フォント同士を合成する場合は、Adobe-Japan1-6 といった ROS が一致、または、最初の2つの名前が同じで、最後の番号は 統合先 >= 統合するフォント である必要があります。

今回の合成方法の場合は、そのままで統合させるのは難しいケースが多いと思うので、統合先として CID フォントを使う場合は、単一化を行って、CID フォントではなくなるようにします。

メニューの「CID」>「単一化」を行うと、CID フォントではない状態に変更されます。

※ 単一化を行うと、一部のグリフで Unicode が重複し、フォント出力時に正しいグリフが選択されない場合があります。これについては、後で解説します。

CID フォントでなくなったことで、OpenType 出力時は、欧文と同じように通常の CFF 形式で保存されます。
これによって大きく問題になるようなことはありませんが、以下のような点は変化します。

・出力できる最大グリフ数は、CID フォントよりも少し減ります。
・すべてのグリフの PostScript 名が CFF 内に書き込まれるため、少しファイルサイズが増えます。
・CID 番号でのグリフ参照ができなくなります (DTP などで使わないのであれば問題ありません)。

なお、単一化を行うと、ウィンドウタイトルのファイル名の後に、(Custom) の文字列が指定されていると思います。
これは、文字エンコーディングがカスタム状態になっていることを示します。

CID フォントの場合、エンコーディングは Adobe-*-* で定義された CID 番号によるものでしたが、単一化によって CID ではなくなったため、明確に定義されたエンコーディングではない状態になっています。
※ エンコーディングの指定が何であれ、グリフは常に Unicode とは関連付けられます。

エンコーディングは重要であるため、明確に指定しておく必要があります。
メニューの「エンコーディング」>「エンコーディング変換」>「ISO 10646-1 (Unicode, 完全)」を実行し、Unicode に変換してください。

もし、合成するフォントも含めて、Unicode の U+10000 未満のグリフしか存在しないのであれば、「ISO 10646-1 (Unicode, 基本多言語面)」でも構いません。
縦書きメトリック
現在開いているフォントに縦書き情報がない状態で、これから統合しようとしているフォントに縦書き情報がある場合 (欧文フォントに対して日本語フォントを合成する場合など) は、縦書きメトリックを ON にする必要があります。

メニューの「エレメント」>「フォント情報」を開き、「一般情報」の項目の「縦書きメトリックが存在」のチェックを ON にして、「OK」ボタンで適用します。

ちなみに、同じ項目内の「高さ」「深さ」「EM の大きさ」の値が、合成するフォントですべて同じでないと、グリフのバランスが崩れたり、何かしら問題が出る場合があります。

ここでは、各フォントですべて同じ値であることを前提とします。
不要なグリフの削除
現在開いているフォントには、「これから統合しようとしているフォントで置き換えたいグリフ」または「統合しようとしているフォントに追加したいグリフ」が入っている状態となります。

もし、現在のフォント内で、合成に不要なグリフがあれば、削除しておきます。

かなフォントの場合、漢字などのグリフは本来含まれていないはずですが、実際のフォント内には、漢字などではなく別の形状のグリフが定義されている場合があるので、一度すべてのグリフを確認しておいてください。

削除方法
グリフ一覧を見た上で、不要なグリフがある場合は、削除したいグリフを選択して、
「エンコーディング」>「グリフの切り離し・削除」を実行します。

これを行うと、グリフが空の状態となります。

※「編集」>「Clear」でも削除できますが、この場合、アウトラインが削除されるだけで、グリフ設定は残ります。

なお、「エンコーディング」>「グリフの切り離し」は、似たようなコマンドではありますが、使わないようにしてください。

こちらは、現在のエンコーディングからは切り離されますが、グリフデータ自体は削除されず、存在したままとなります。
切り離し後に一旦 sfd で保存して読み込むと、グリフが復活しています。

グリフの選択方法
  • 一覧上を左クリックで、そのグリフのみ選択。
  • 左ドラッグで、押した位置から離した位置までのグリフを選択。
  • Shift+左クリックで、選択を反転。
  • 非選択のグリフ上を Shift+左ドラッグ で、その範囲のグリフを選択に追加。
  • メニューの「編集」>「選択」で、各コマンドによる選択。
作業状態を一旦保存
ここで、一度作業状態を保存しておきます。

「ファイル名を指定して保存」で、sfd 形式のファイルを保存してください。

FontForge はたまに強制終了することがあるため、手間のかかるような作業を行った後などは、こまめにバックアップを取っておいたほうが良いです。
フォントの統合
次に、フォントを合成します。

「エレメント」>「フォントの統合」で、合成するフォントを選択してください。

フォントが読み込まれた後、以下のようなメッセージが出る場合があります。

Do you want to retain kerning information from the selected font
when one of the glyphs being kerned will come from the base font?

<翻訳>
カーニングされるグリフの1つがベースフォントから取得されるときに、
選択したフォントのカーニング情報を保持しますか?

カーニング (指定文字間の自然な間隔空けを行う) について、選択したフォントの情報を使うかどうかという問いになります。

選択したフォントのカーニングを優先するなら「はい」、
現在のフォントのカーニングを優先するなら「いいえ」となります。

どのようなフォントを合成するかにもよりますが、とりあえず、欧文が含まれるフォントの方を優先したほうが良いでしょう。

実行後、しばらく待つと、グリフ一覧で結果が表示されます。

元のグリフはそのまま残って、他のグリフは選択したフォントからセットされているかどうかを確認してください。
なお、更新されたグリフは、グリフ一覧上で色が付いています。
フォント情報の変更
フォント名などの情報を変更する場合は、「エレメント」>「フォント情報」から、変更してください。
フォントファイルを出力
フォントが合成できたら、最後に、フォントファイルを出力します。

「ファイル」>「フォントを出力」で、出力先と、出力情報を指定します。

形式は、TrueType なら「TrueType」、OpenType なら「OpenType (CFF)」を選択します。
オプションは基本的にデフォルトで構いません。

実行後、以下のようなメッセージが出る場合があります。

The font contains errors.
 ...
Would you like to review the errors or save the font anyway?

<翻訳>
フォントにエラーがあります。
 ...
エラーを確認しますか、それともフォントを保存しますか?

「Review」ボタンを押すと、エラーを確認できます (出力は中断されます)。
「生成」ボタンを押すと、エラーを無視して生成します。

とりあえずエラーは無視しても問題ないので、生成してください。
エラーチェック
フォント出力時に「Validate Before Saving」のチェックを ON にすると、出力する前に、グリフなどに問題がないかどうかのチェックが行われます。

これは、グリフ数が多いと時間がかかりますし、基本的に無視しても問題ないエラーであることが多いので、グリフのエラーチェックはあらかじめ手動で行っておいて、保存時のチェックは OFF にしておいた方がいいでしょう。

手動でチェックを行いたい場合は、「エレメント」>「Validation」>「Validate」を実行します。
フォントの確認
後は、FontForge で、生成したフォントを開いてみたり、生成したフォントを実際にシステムにインストールして描画したりしてみてください。

問題がなければ、完成です。

Windows でフォントが読み込めない場合は、TrueType と OpenType のページをご覧ください。