源暎フォント置き場
御琥祢屋/おこねや

おたもん おたもん(o_tamon)
ツイッター リンク ニコ動 リンク ピクシブ リンク
絵を描いてみたり、MMDでらぶ式ちびミクを愛でてみたり、MMEのエフェクトを書いてみたり。フォント改変にも手を出した。


このページについて

 このページは おたもんが源ノ角ゴシックや源ノ明朝の改変フォントを製作する際に得たノウハウをメモしておくページです。
 このページに記載している内容について無保証であり、あくまでも記載した時点で製作者が認識している情報であることにご注意ください。

 まずは「源ノ書体の改変を Fontforge で行う場合の問題点」を、後半では「TTX を使って問題点を改善する」方法を解説してあります。

 率直に言って非常に面倒な作業ですが、Windows では他に選択肢がないような状態なので「無料で出来るかわりの手間賃」と考えると良いと思います。macOS なら Glyphs を買えば良いかもしれませんが、Win 環境では数万円程度で買えるフォント開発アプリでは別の面倒がある(体験談)ので頑張ります。

Fontforge 関連

  • 巨大なファイルを保存する際の注意

     Fontforge は独自のファイルフォーマットとして sfd(spline font database files)形式ファイルが使われています。

     このファイルはフォントの構成要素を全てテキスト形式で記述されており、テキストエディタで編集を加えることが出来るなど利点も多いのですが、テキスト形式共通の不具合としてファイルサイズが大きくなりがちで、保存に時間が掛かるのが難点です。
     それだけなら待てばいいだけなのですが数千文字をこえるような大規模フォントだと頻繁に「Fontforge で読み込むと異常終了する sfd ファイル」を書き出してくれやがります。テキスト形式のくせに。

     当然ですが、壊れた sfd ファイルは基本的に二度と読み込めません。バックアップが無ければ全ての作業が無駄になるので面倒でも対応しておきましょう。

    1. 巨大なフォントを極力扱わない

       数千文字を扱うと保存がうまくいかないなら小分けにして編集します。自分の場合は「仮名だけ」「英数字だけ」「漢字だけ」のファイルに分けてから作字していきます。こうすれば保存時間も短くなり、編集したい文字も探しやすくなります。

       編集や加工が終われば完全なフォントファイルにコピペしてフォント出力しましょう。

    2. 自動バックアップ機能を使う

       Fontforge の[ファイル]メニューから[環境設定]を開き、[一般]タブ内の「RevisionToRetain」を適当な数字を入力します。
       そうすると保存するたびに「~.sfd」を「~.sfd-1」、「~.sfd-1」を「~.sfd-2」…と設定した数だけバックアップを取ってくれます。

       ただしあるタイミングで読み込めない sfd ファイルになった場合、その後に保存した全てのファイルが読み込めない状態になるようなので、バックアップファイルが無事でも数時間の作業が消えるのは覚悟する必要があります。

       最適な個数は保存する頻度によるでしょうが、消えるぐらいなら10や20はバックアップされるようにしておくべきです。

    3. 作業終わりにはフォントファイルとして出力する

       壊れるのは基本的に sfd 形式だけなので、ある程度作業が進んだら途中で otf や ttf 形式のフォントファイルに出力しておきましょう。背景レイヤーなどが消えますが主な編集作業はサブファイルで行うようにしていれば問題ないはずです。

       本当にごく稀ですがフォントファイル保存中に Fontforge が異常終了すると「sfd ファイルは読み込めず、otf ファイルも保存失敗で 0 Byte」なんて悪夢が発生することがありますので出力先も別フォント名で複数保存しておくと安心です。


  • 日本語 CID-keyed OpenType フォント出力時の不具合

     一般的な日本語OTFフォントを編集して出力する場合に Fontforge は正しい vmtx を出力しません。
    そのため Adobe Photoshop などのアプリで縦組みした場合に各文字の縦方向の位置が大きくズレる症状が発生します(下記画像右)。


     原因は「縦組み時の縦位置を示す値が正常に出力されない」ためであり、本来は「ボディの上辺から一番上の点までの距離」を設定する必要がありますが、Fontforge は OpenType CID でフォント出力を行うと「ベースラインから一番上の点までの距離(高さ)」を設定してしまいます。


     どういうバグで発生しているのかは不明ですが、解決には「ボディの上辺から設定されている値を引く」必要があります。
     ただし Fontforge 上で修正する方法はないため、フォントとして出力後にTTXなどのツールで書き換えます。


     例えば OTF を ttx.cmd で分解して「(フォント名)._v_m_t_x.ttx」の各行にある「tsb="●●●"」を正しい値に書き換えるの単純です。ただし該当する行が数万行もありますので、自前でスクリプトを組むなどの対策が必要だと思います。

     Windows 環境向けに自動計算ツール o_vmtx-fix を公開しているのでご利用ください。


  • 源ノ角ゴシック&源ノ明朝 特有の不具合

     源ノ角ゴシックや源ノ明朝は日中韓台の漢字をカバーするために一般的ではないフォント構成となっています。
     そのため、Fontforge は cmap という Unicode からグリフ番号を取得する情報を正しく解析出来ません。そのために源ノ書体を Fontforge で読み込む→フォントとして出力すると盛大に文字化けしてくれます。

     この不具合は Fontforge に源ノ角ゴシックや源ノ明朝を認識させるために其々の cidmap ファイルを記述することで対策できますが、数万文字ものグリフと Unicode や Adobe-Japan1 Glyph と紐づける作業は苦行でしかなく、源ノ角ゴシックと源ノ明朝では別々であることに加えて源ノ明朝の次の Version 2.0では数千文字が変更されるなど手間が掛かりすぎるため現実的ではないと思います。

     もし改変内容が「仮名を別の形に変更する」など cmap 情報がオリジナルの源ノ書体と変わらない場合は、TTXで cmap を置き換える方が簡単です。
     あとは OTEdit を利用して Adobe-Japan1-4 フォントとしてコピーしてから Fontforge で作業することも出来ます(多くの源ノ改変フォントがコレ)が源ノ書体に用意されている豊富な漢字や異体字を活用できない上に、Fontforge を使う利点も特に無くなるため考慮しておりません。

TTX 関連

  • 合成時にヘッダ情報が正しく計算されない

     ソースを追う限りはプログラムに問題ないため自分の環境だけかもしれませんが、2017年6月時点での最新版やそれ以前の ttx.cmd を使ってフォントをコンパイルした際にファイル先頭部分に記述されている数値(searchRange・entrySelector・rangeShift)が正しく計算されません。

     ほとんどの環境では OS やアプリ側で numTables から再計算をしているのか問題になりませんが、PDFJ というライブラリを使うアプリではエラーになります。計算式は検索すればいくらでも出てくるため、再計算してバイナリエディタで書き換えることで回避することが出来ます。

ttx.cmdを使って不具合を修正する

 自分の環境が Windows 10 なため、Windows 前提の説明になりますが基本的にはどの環境でも大きくは変わらないと思われます。

  • AFDKO のインストール

     まずは Adobe の AFDKO 配布サイト(英語)から最新版をダウンロードします。
     ZIP ファイルを展開すると「FDK」フォルダがあり、その中に「Read_Me_First.html」(英語)を参照しインストールしてください。

     WindowsならFDKを好きなフォルダに入れ、管理者権限で起動したコマンドプロンプトから「FinishInstallWindows.cmd」を実行すればインストール完了です。


  • ttx.cmd を使う準備

     初期状態の ttx.cmd はテキストファイルにデコンパイルする際に1つのファイルにまとめて出力します。その膨大な中身から修正箇所を探すのは大変ですので、テーブルごとに分割してファイルを出力してくれるように変更しましょう。

     まずは「FDK\Tools\win」の中にある「ttx.cmd」を同じフォルダに複製し、「ttxs.cmd」などにファイル名を変更してください。
     そして ttxs.cmd ファイルをテキストエディタで開き、「%AFDKO_Python% %AFDKO_SCRIPTS%\ttx.py %*」という行を「%AFDKO_Python% %AFDKO_SCRIPTS%\ttx.py -a -s %* 」に書き換えて保存します。

     あとは ttxs.cmd のショートカットをデスクトップにでも置いておけば、フォントファイルをドラッグアンドドロップすれば分解され、ttxファイルをドラッグアンドドロップすればフォントに合成されます。

     ※ 注意 ※
     フォントを分割すると10~20程度の ttx ファイルが作成され、しかもそのファイルは作業終了後は不要となるため、作業を行う際はフォントファイルを作業フォルダにコピーしてから行い、作業終了後は中身を削除した方が良いと思います。


  • GenEiKoburiMin-R.otf を例にした作業流れ

    説明しやすいように「GenEiKoburiMin-R.otf」で流れを説明しますが、各フォントファイル名は各々で読み替えてください。

    1. まずは作業フォルダに Fontforge から出力した GenEiKoburiMin-R.otf をコピーする

      今回は作業フォルダに「ttxs.cmd」のショートカットも置いてますが、デスクトップ上などで問題ありません。

    2. GenEiKoburiMin-R.otf を ttxs.cmd にドラッグアンドドロップする

      展開処理に数分かかりますので、気長に待ってください。完了すると沢山のファイルが出来ます。
      今回、修正が必要なファイルは「GenEiKoburiMin-R._v_m_t_x.ttx」と「GenEiKoburiMin-R._c_m_a_p.ttx」の2ファイルです。

    3. GenEiKoburiMin-R._v_m_t_x.ttx を o_vmtx-fix で修正する

      「GenEiKoburiMin-R._v_m_t_x.ttx」を o_vmtx-fix にドラッグアンドドロップすると値を修正し「_GenEiKoburiMin-R._v_m_t_x.ttx」として保存されます。

    4. SourceHanSerifJP-Regular._c_m_a_p.ttx をコピーする

      壊れた cmap を源ノ明朝の cmap で上書きするために、ここまでと同様に SourceHanSerifJP-Regular.otf を ttxs.cmd で分解し「SourceHanSerifJP-Regular._c_m_a_p.ttx」を作業フォルダに用意します。

    5. GenEiKoburiMin-R.ttx を書き換える

      「GenEiKoburiMin-R.ttx」をテキストエディタで開き「src="GenEiKoburiMin-R._c_m_a_p.ttx"」を「src="SourceHanSerifJP-Regular._c_m_a_p.ttx"」に、「vmtx src="GenEiKoburiMin-R._v_m_t_x.ttx"」を「vmtx src="_GenEiKoburiMin-R._v_m_t_x.ttx"」に書き換えて保存します。
      保存した「GenEiKoburiMin-R.ttx」を ttxs.cmd にドラッグアンドドロップすれば「GenEiKoburiMin-R#1.otf」が完成します。

     以上が Fontforge と TTX を利用した 源ノ改変フォントの作り方になります。たいだいの所要時間は5分強ほどです。
     「SourceHanSerifJP-Regular._c_m_a_p.ttx」や「書き換えたGenEiKoburiMin-R.ttx」を別途保存しておけば次回以降で使いまわせますし、文字の修正時に文字の一番上の点の高さが変わらない範囲での修正なら「_GenEiKoburiMin-R._v_m_t_x.ttx」も使い回すことが出来るのでより時間が短縮できます。

 とりあえずですが、この修正を行えば Fontforge で「源ノ角ゴシックの漢字と源ノ明朝の仮名を組み合わせたフォント」や「源ノ明朝の漢字を全て旧漢字(繁体字)に置き換えたフォント」などは作れるようになります。

 検索すれば情報が出てくるので Fontforge 自体の使い方などには触れてませんが Twitter などで質問いただければ追記していきます。

Twitterでシェア はてなブックマークに追加 Pocketで後で読む