omuronの備忘録

個人的な備忘録

AFDKO を試す

4月10日はフォントの日です。
ということで、フォントにちなんだことをしたいと思い、AFDKO を触ってみたいと思います。
私はフォントエンジニアでは無いので、仕事でフォント関連のツールを触ることは基本的にはなく、AFDKO も聞いたことがある程度の知識しかありません。

AFDKO

AFDKO は「Adobe Font Development Kit for OpenType」の略。
GitHub はこちら。

github.com

The AFDKO is a set of tools for building OpenType font files from PostScript and TrueType font data.

OpenType フォントを作ったり触ったりするツール群です。

ツール郡

インストールするといくつかツールが入ります。
内容は こちら から抜粋します。

Making/editing fonts

フォントを作るツールたち。
普通の人はあまり使うことはなさそうですが、 otc2otf みたいな変換するのは使うことがあるかも?
www.DeepL.com/Translator(無料版)で翻訳します。

  • psautohint
    • このプログラムはAdobeのオートヒンターであり、独自のプロジェクトリポに住んでいます。いくつかのAFDKOツールで使用されており、AFDKOのプロジェクト要件を通じて自動的にインストールされます。
    • OpenType/CFF と Type 1 フォントの両方に適用することができます。Type 1 および OpenType/CFF フォントでのみ動作します。
  • makeotf
    • このプログラムは、OpenTypeのレイアウト規則とデフォルト値のオーバーライドを定義する機能ファイルと、フォントファイル(Type 1フォント、TrueTypeフォント、Type 1フォントの「detype1」テキスト版、またはUFOフォント)からOpenType/CFFフォントを構築するものです。その他、いくつかのメタデータファイルも必要です。また、TrueTypeソースフォントファイルからOpenType/TTFフォントを構築することもできます。
  • buildmasterotfs
    • このスクリプトは、makeotf を使用して、互換性のある UFO マスターを含む .designspace ファイルから OTF ファイルを構築します。これらの OTF ファイルは、CFF2 変数フォントを構築するための最初のステップとなります。
  • buildcff2vf
    • このスクリプトは、.designspace ファイルと buildmasterotfs の出力 OTF を使用して、CFF2 変数フォント ファイルをアセンブルするものです。
  • makeinstancesufo
    • このスクリプトは、.designspace ファイルと互換性のある UFO マスターのセットから UFO インスタンスを生成するものです。designspace ファイルと補間システムについての詳細は Superpolator.com と DesignSpaceDocument Specification にあります。
  • mergefonts
    • このプログラムは、あるフォントから別のフォントへグリフをマージし、オプションでソースフォントからサブセットをコピーし、グリフの名前を変更します。また、フォント内のグリフ名をサブセットして変更することも可能です。同じフォントを異なるマッピングファイルのソースとして複数回使用することで、グリフを別の名前で複製することができます。また、名前付きキーフォントをCIDキーフォントに変換することもできます。
  • otc2otf
    • OpenType Collection フォントファイル (.ttc または .otc) から、すべての OpenType フォント (.otf または .ttf) を抽出します。
  • otf2otc
    • 2 つ以上の OpenType フォント (.otf または .ttf) から OpenType コレクション・フォント・ファイル (.ttc) を生成します。
  • otf2ttf
    • OpenType-CFFフォントをTrueTypeに変換します。
  • rotatefont
    • このツールは、フォント内のグリフをヒントを含めて回転・平行移動させます。ただし、回転が90度の倍数でない場合、ヒントは破棄されます。
  • sfntedit
    • これは、あるフォントから別のフォントへ、フォントテーブルのバイナリブロック全体をカット・アンド・ペーストすることができるものです。この機能を利用するには、まずソースフォント上で -x オプションを使用してソースフォントからテーブルを別ファイルにコピーし、次に -a オプションを使用してそのテーブルをターゲットフォントに追加します。また、単にテーブルを削除したり、フォントテーブルのチェックサムを修正するのにも使用できます。
  • psstemhist
    • このプログラムは、実は psautohint と同じツールですが、違う顔を持っています。このプログラムは、Type 1 ヒンティングのためのグローバルヒントデータとアライメントゾーンを選択するのに役立つレポートを提供する。このツールのレポートを見て、最も一般的なステム幅を選択し、FontLab や RoboFont などのプログラムを使ってフォントに値を設定する必要がある。これは、フォントのヒンティングを行う前に行う必要があります。Type 1 および OpenType/CFF フォントにのみ対応します。
  • ttfcomponentizer
  • ttx
    • このツールは、OpenTypeフォントから全部または一部のテーブルを、人間が読みやすいテキストXMLファイルにダンプし、このXMLファイルを完全なOpenTypeフォントコンパイルして戻すことができます。これは、いくつかの値を簡単に変更するための理想的なツールです。注意深く使用すれば、広範囲な変更を加えることも可能です。このツールは Just van Rossum 氏によって fontTools ライブラリの一部として提供されています。ここでは便宜上、インストールされたPythonインタプリタを必要としない形で提供されています。
  • tx
    • このツールを使って、ほとんどのフォント形式をCFFまたはType1フォントに変換することができます。TrueType フォントは、この処理でヒンティングが失われます。PostScript から TrueType への変換はできず、TrueType フォントのラスタライズもできません。Type 1 または CFF フォントからの変換に使用すると、サブルーチン化が解除され、共通のパス要素に対してサブルーチンを参照するのではなく、各グリフがすべての描画演算子を含むようになります。ただし、出力されるフォントにサブルーチン化を適用するオプションがあります。
  • type1/detype1
    • この2つのプログラムはそれぞれ、Type 1フォントを編集しやすいプレーンテキスト表現にコンパイルおよびデコンパイルします。これは、個々のフィールドを修正するのに適している。また、特定のパス要素を多くのグリフにコピーするのにも適している。

Proofing

フォントの中身を調べたいときに使うツールたち。
こちらは一般のエンジニアでも使うケースがそこそこありそうです。
ttx は、手っ取り早くフォントの中身を見るときに使ったりしてました。

  • spot
    • このプログラムは、OpenTypeフォントのデータを様々な方法で報告することができます。すべての表は、表の低レベルの構造をテキストレポートとして表示することができます。ほとんどの表は、より人間が読みやすい形式のレポートと一緒に表示することができます。GPOSおよびGSUBレイアウトテーブルを含む一部のテーブルは、プリンタに送信可能なPostScriptファイルを出力したり、Mac OSX PreviewAdobe AcrobatAdobe InDesignで表示することにより、グラフィカルに表示することが可能です。
  • tx
    • このツールには、校正に便利な2つのモードがあります。bcオプションをつけると、ASCII文字を使ってコマンドラインウインドウにグリフをラスタライズする。これはグリフを素早く見たいときに驚くほど便利である. pdfオプションをつけると、フォント内のグリフを1ページあたり320個、または1ページあたり1個表示したpdfファイルを作成する。
  • ttx
    • XML形式の出力は、OpenTypeフォントのほとんどのデータについて有用なレポートを提供します。
  • charplot
    • フォント内の全グリフを表示したpdfファイルを作成します。1ページにつき1グリフを表示します。ノードと制御点を表示します。
  • digiplot
    • フォント内のすべてのグリフを表示するpdfファイルを作成します. 日中韓の開発者が好んで使うフォーマットで、大きな塗りつぶしアウトライン、便利なグリフメトリクス、そしてノードをマークした大きなアウトラインを表示します。
  • fontplot
    • フォント内の全グリフを表示するpdfファイルを作成します。これは、多くのグリフでページを埋め尽くし、小さなポイントサイズで塗りつぶされたアウトラインだけを表示し、各グリフの周りにいくつかの情報を表示します。OpenTypeフォントとType1フォントで動作します。
  • fontsetplot
    • リストフォントのすべてのグリフを表示したpdfファイルを作成します。グリフはグリフID順に、1emの固定間隔で表示され、あるフォントのグリフは1行に、異なるフォントの同じグリフ名を持つグリフは1列になるように表示されます。これは、文字セットが同じであること、グリフの形が似ていることを視覚的に確認するために使われる。これは、あるグリフ名に対してプレースホルダーのグリフアウトラインが貼り付けられたが、正しい形に修正されなかった場合を捕らえるのに便利である。フォントは、まず文字セットの長さでソートされ、次に文字セットのアルファベット順、そして PostScript 名でソートされます。
  • hintplot
    • 1ページに1つのグリフを表示します。ヒントとアライメントゾーンを表示する。
  • waterfallplot
    • フォント内のすべてのグリフについて、ポイントサイズのウォーターフォールを表示します。ヒンティングの評価に使用されます。ヒンティングを見られるようにするために、フォントはPDFに埋め込まれ、グリフはcharコードで参照されます。TrueTypeおよびCIDキー付きフォントではまだ動作しません。

Validation

フォントを確認したりするツールたちかな。
これもフォントを作らない限りあまり使うことはなさそう。

  • psautohint
    • オートヒンティングプログラムは、ヒンティングの問題点を詳細に報告します。たとえば、ステムがヒントゾーンで制御できるのに、幅が少し広すぎたり狭すぎたりした場合のニアミスのレポートなどは無視できます。これらのレポートに従ってステム幅またはヒントゾーンを調整することで、ヒントで制御されるステムをより多くセットに含めることができますが、その努力に見合わないと合理的に判断することも可能です。ただし、曲線の垂直・水平方向の極端にノードがないなど、修正が必要な不満も多い。
  • checkoutlinesufo
    • このツールは、グリフアウトラインデータの品質をチェックするもので、常に使用すべきものである。重なりやパスの方向が正しくないなど、重大な問題を検出するのに非常に優れています。小さな問題をいくつも見つけることには熱心ですが、すべてのエラーメッセージをチェックする価値があるほど、頻繁に正しい結果を出します。また、検出した問題を修正することもできるが、グリフが変更された場合は必ずチェックする必要がある - 修正が元の問題より常に良いとは限らないのである。
  • comparefamily
    • このツールは、ディレクトリ内のすべてのフォントを検査し、多くの品質チェックを実行します。これは、単一のフォントだけでなく、フォントファミリ全体のデータの一貫性をチェックし、比較する唯一のツールです。また、スタイルリンクされたグループ内の命名ミスを指摘します。Adobe Type Departmentでは、Adobe OpenTypeフォントのバグを発見するたびに、ここにチェックを入れるようにしています。これは完全な検証ツールではありませんが、タイポグラファーが犯した数年にわたる間違いの経験を表現しています。
  • sfntdiff
    • このツールは、2つのOpenTypeフォントファイルを低レベルで比較するものです。2 つのフォントが同じかどうか、あるいはどのテーブルが異なるかを素早くチェックするのに最も有用である。
  • ttx
    • 2つのフォントの違いを詳しく見るには、ttxツールを使ってXMLファイルをダンプし、MacBBEditやPCのUltraEditのような優れた差分編集ツールで比較するのが一番良い方法です。このツールはLettErrorのJust van Rossumによって開発され、オープンソースのライセンスで次のサイトから入手できます: https://github.com/fonttools/fonttools
  • ttxn
    • このツールは、2つのフォントが機能的に同じかどうかをテストするために使用します。ttx と tx ツールからの出力をソートして修正し、OTL テーブルレコードの順序、グリフの順序、サブルーチン化の違いなどの問題による差異を排除した正規化テキストダンプを作成します。これは、フォント内の各テーブルに対して1つのファイルを書き込みます。MacではBBEdit、PCではUltraEditのような優れた差分編集ツールで、2つの異なるフォントの出力ファイルを比較することができます。特に、同じフォントの古いバージョンと新しいバージョンを比較するのに便利です。
  • tx
    • このツールには、テストに適したモードがいくつかあります。これは、CFF または TrueType のいずれかのフォントファイル内のフォントプログラムに関するデータのみを表示します。dump オプションは、CFF フォントのグローバルデータとグリフデータのテキストレポートを見るのに適しています。bc オプションは、ラスタライズされたグリフのハッシュをファイルに出力する追加オプションを取ります。あるグリフのセットに対するハッシュファイルが 2 つのフォント間で同じであれば、そのグリフは指定されたポイントサイズで同じようにラスタライズされたことになります。これを使って、アウトラインがまったく同じでなくても、フォントが機能的に同等であるかどうかを判断することができる。最後に、任意のフォントを CFF に変換した場合、フォント データが構文的に正しくなかったり、グリフがヒンティングされていなかったりすると、エラー レポートが出力されます。

インストール

GitHub の README より、Python3.7 以上で使えるようなので、それに従いインストール。

pip3 install afdko

試す

インストールされたツールのうち、面白そうに見えるのは spot なので、こちらを試してみます。
利用するフォントは、以前中身を眺めてみた道路標識フォントの「Nu みちしるべ」です。

spot -h でヘルプを確認。
-F オプションで GPOS/GSUB の feature リストを見ることができるので、どのような feature があるか確認します。

spot -F ./NuMichishirube-Regular-v1.0.0.otf 
GPOS Features:
Script 'DFLT'
    Default language system
        [ 0]='kern' LookupListIndex: 0 ->( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ) 
GSUB Features:
Script 'DFLT'
    Default language system
        [ 0]='aalt' LookupListIndex: 0 1 
        [ 1]='calt' LookupListIndex: 3 ->( 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ) 4 
        [ 2]='dlig' LookupListIndex: 5 
        [ 3]='liga' LookupListIndex: 2 

カーニング、異体字リガチャーなどの feature があるので、わかりやすいリガチャー liga を見てみます。

spot -P liga NuMichishirube-Regular-v1.0.0.otf > liga.ps

ps ファイルが出力されるので ps2pdf 使って PDF に変換して確認します。

ps2pdf ./liga.ps

f:id:omron:20220410110702p:plain

リガチャー使って、矢印の標識を一つの文字にしているようでした。

所感

フォントの日なので、たまにはフォントを触ってみました。
ttx で出力された XML ファイルを眺めることはあったのですが、 spot は使ったことありませんでした。
こちらのツールは、GPOS/GSUB に特化しているので、この中身を見たいときに使うととても簡単に解析ができそうです。
AFDKO はたくさんのツールが入っているので、また暇を見つけて触ってみたいと思います。

参考にした資料