Windowsのフォント一覧画面を見るとフォントの種類として「OpenType」、「TrueType」、それと「ラスター」の何れかが表示されます。
「ラスター」とは要するにビットマップのフォントということで分かりますが、「OpenType」、「TrueType」はアウトラインフォントという事になりますが、両者の違いはご存じでしょうか。
フォントを使う側の立場では認識できる違いは無いので、違いを気にする必要は無いでしょう。しかし名前が違う以上、何某かの差異があるわけですので、その差異を知りたい人は先を読み進めてください。
歴史
「歴史」とは題しましたが、ここで言いたいのはTrueTypeが先、OpenTypeはその発展形という事です。
マイクロソフト社がWindows3.1をリリースした時、TrueTypeが実装されました。アウトラインフォントがWindowsで使えるようになったのはこの時からです。
当時はアウトラインフォントの技術としてはAdobe社のPostScriptという仕様で、DTPあるいは印刷用途ではスタンダードな地位にあったと言えるでしょう。
両者を較べると、PostScriptはフォントのデータをギリギリまでパッキングし、また多用・多彩なアウトラインの描画命令を持ち、パッキングと呼べる程の事はしていない、命令はBスプラインのみという、「冗長」とも言えるのがTrueTypeでしたが、逆にこの冗長がTrueTypeの柔軟性・発展性に繋がりっていきます。
TrueTypeは固有のタグ名が付けられた「テーブル」と呼ばれるデータブロックを追加していくだけで仕様を拡張していく事ができるので拡張性が非常に高く、また多用・多彩な描画命令は、フォント製作者にしてみれば面倒くさいものなのでしょう。
少なくてもWindows用のフォントとしてはTrueTypeが標準的となっていきます。
OpenTypeは、TrueTypeがPostScriptを吸収合併したものと言えます。より正確には、PostScriptのアウトラインデータをテーブルとして持つことができるようになり、PostScriptの遺産を取り込むことが容易にできるようになりました。
TrueTypeとOpenType
TrueTypeとOpenType、それぞれが何を指しているのか捉えどころがないのはこのような経緯からです。
Windowsのフォント一覧で「TrueType」、「OpenType」と表示されるのはフォントファイルのヘッダーの先頭にあるシグネチャーの違いに過ぎないと言ってよいでしょう。中身を表しているわけではありません。
TrueTypeフォントは内部のアウトラインを格納したテーブルは必ずTrueType形式のアウトラインとなっていますが、OpenTypeフォントはTrueType形式、またはPostScript形式、あるいはSVG形式の何れかですが、TrueType形式である事が多いので、結局のところTrueTypeはOpenTypeと大体同じと言えてしまいます。
ちなみにアウトラインデータのテーブルのタグ名は、下記の通りです。
新PostScript形式は、PostScript形式のアウトラインデータを可変フォントの拡張を加えたものです。TrueType形式の可変フォントの拡張は別のタグ名のテーブルで拡張しています。それぞれに「らしい」拡張の方法をしています。
さて、気が付いた事と思いますが「TrueType」という言葉はフォントファイルの形式を指している場合と、フォントファイル内のアウトラインデータを指している場合があり、いささか紛らわしいのです。
どちらを指しているのか文脈から判断する事が必要です。
アウトラインデータ TrueType形式とPostScript形式
アウトラインデータ TrueType形式とPostScript形式の違いを説明します。
上図に示した通り、PostScript形式の方がTrueType形式よりも複雑であることが分か課と思います。TrueType形式は「×」で示した「OFF点」と「□」で示した「ON点」の二種類だけでアウトラインが作られます。「ON」とか「OFF」とかはアウトライン線上にあるか無いかを示しているのですが、OFFの場合はBスプラインの制御点として曲線を作る点を示します。つまりTrueType形式は移動、Bスプライン、直線の3命令だけでアウトラインを作成する仕様となています。
一方、PostScript形式は様々な命令を持っています。
- 移動
rmoveto / vmoveto / hmoveto - 直線
rlineto / vlineto / hlineto - 直線+曲線
rcurveline / rlinecurve - 曲線
rrcurveto / vvcurveto / hhcurveto / hvcurveto / vhcurveto / hflex / flex / hflex1 / flex1
これ以外にも算術演算、論理演算、サブルーチン、ヒント命令を持ち、さらにスタックを持ち、逆ハンガリアン記法により、さながら「プログラミング」によりアウトラインを作成します。