OpenType specification

OpenType

[44] TrueTypeOpenType は現在最も広く使われているフォント形式です。

仕様書

[20] 当初 AppleTrueType を開発し Microsoft も採用しましたが、 後に MicrosoftAdobe がそれを拡張する形で OpenType を開発しました。

[21] 現在 Apple は自社ウェブサイトで TrueType仕様書を公開しています >>42Microsoft は自社ウェブサイトで OpenType仕様書を公開しています >>3

[22] 従って TrueType よりも OpenType の方が新しいバージョンで機能が豊富ということになるのですが、 仕様書としては別物で、技術的に共通でも仕様書は同内容ではありません。 そして両者それぞれに改訂されているので、 OpenType 仕様書になく TrueType 仕様書にはある機能もいくつかあります。 この機能は Apple の仕様書を見よ、 この機能は Microsoft の仕様書を見よ、 と相互に参照しあっています。

[23] 両仕様書には、 Microsoft はこう実装している、 Apple はこう実装している、 名前を挙げずにこういう実装もある、 というような記述も含まれています。 公的な工業標準というよりは企業の技術公開文書という性質の強い、 私的な規格ですが、事実上の標準の地位を得ています。

[24] 曖昧な記述が多く行間を読むことや実装状況を自分で調べることが必要で、 技術ドキュメントとしては良くても工業標準としてみると品質には不満がありますが、、、 仕様書だけを読んで相互運用可能に実装できるとはとても思えません。

[28] AppleMicrosoft も自社の技術文書の公開サイトの1項目として仕様書を提供しているので、 仕様書として独立した形になっていないのが困ったところです。

[29] 本段落執筆時点では Microsoft 版の変更履歴に 「Version 1.9 Released December 2021」 と書かれているのですが、 ページの日付 (おそらく Microsoft のドキュメント管理システムがつけているもの) は 「2022/06/16」 となっていて、半年新しいことになってます。でもそれが何を意味しているのかわかりません。

[30] Webサイトで最新版(だけ)が公開されているのに、バージョンがついていて、 でもそのバージョンと無関係に更新されていて、今見てるのがバージョン何なのかわからない、 引用して数年後に記述が食い違っていたらどう理解したらいいのかわからない、 という困った状況です。


[25] ISO/IECISO/IEC 14496-22 として国際標準になっています。 規格票ISOWebサイトで無償公開されています >>41。 その内容は MicrosoftOpenType 仕様書をアレンジしたもののようです。 (そんな品質でも国際標準になれるのですね。)

[27] 時点の最新版はです。 一方 Microsoft 版の最新版はのものです。 こうしたものは一度国際標準の判子を押されたら後は放置されがちですが、 比較的きちんとメンテナンスされているみたいですね。

[26] 一般には ISO/IEC よりも Microsoft の仕様書が参照されているようです。 両者の内容は完全に一致しているわけではないのですが、 差分ははっきりしないので、 ISO/IEC 版を参照するのはリスキーといえます。

[31] Microsoft の仕様書には

OpenType 1.9 incorporates revisions in Draft Amendment 2 of the 4th edition of the ISO/IEC 14496-22 “Open Font Format” standard.

と書かれています。ということは(少なくてもこの版では) まず ISO/IEC 版の改訂を作って、それを Microsoft 版に適用する、という順番で開発してるようです。 DAM 段階で先走ってるのは、投票で覆ることはないという前提で進んでるのでしょうか。

入門

[4] , https://www.iwatafont.co.jp/news/img/about_font.pdf

[8] OpenType フォント・フォーマット, https://aznote.jakou.com/prog/opentype/index.html

フォントファイル

[59] OpenType フォントデータ
[7] OpenType ファイル

タグ

[32] 用字系機能などの識別にはタグが使われています。 タグは4文字のASCII文字です。

[57] データ型としての Tag は、 uint8 の4つの配列です。 [ 0x20, 0x7E ] で UTF-8バイトと解釈されます。 >>56

[58] タグ0x20 SPACE は末尾でのみ使えます。 最大3文字で、最初の1文字は 0x20 以外でなければなりません。 >>56

[37] こういうプロトコル要素では記号類は敬遠されがちですが、 TrueType / OpenType ではそういう忌避はないみたいで、 OS/2 のように / が入っていたり、 CFF のように が入っていたりします。

[39] 大文字・小文字を区別する上に、大文字小文字のどちらも使われています。 パッと見た感じ大文字小文字の区別だけで使い分けられているものはまだ無いみたいですが。

[38] お陰で変数名にしたいときに困ります。

[101] 大文字私用 (カスタムタグ) のために割り振られていることもありますが、 タグごとに状況が違います。(各項参照。)


[33] 以外のタグMicrosoft の仕様書に登録簿 (Registry) があって、そこに登録できることになっています。 Microsoft を含むフォント関係事業者各社が登録しているようです。

[34] なぜか登録制度になっていますが、仕様書に組み込まれていて、 他の規格のように仕様書の改版と独立して登録できる制度とは違うようです。

[35] ISO/IEC 版の ISO/IEC 14496-22 も登録簿部分も規格本文に含めています。

[36] 要求を即時に反映できるとか、 通常の標準化手続きより手軽に登録できるとかのメリットはなさそうで、 名前だけ登録して処理モデルを明確に定義しないで済む相互運用性の抜け穴になっているような。


[43] TrueType / OpenTypeタグ

版と書式

[60] 仕様書は度々改訂されて版番号が付いていますが、 新しい仕様は古い仕様への追加と修正なので、 (OpenTypeTrueType の違い >>22 を除けば) 常に最新版の仕様書を参照をすれば間違いありません。 この意味で仕様書の版は重要ではありません。


[61] OpenType フォントファイル中で使われるいくつかの構造には (version) があります。 によって (field) が増減したり、解釈が変わったりすることがあります。 フォントの生成時には適切な版番号を設定する必要がありますし、 フォントの解釈時には版番号によって処理を変更する必要があります。

[62] この各構造のは、仕様書とは連動していません。 また、ある構造のがこれなら他の構造のはこれ、 といった制約も基本的にはなくて、 各構造の記述や実装の都合でそれぞれ好きに選べるようです。

[83] ほとんどの版番号大版 (major version) 小版 (minor version) で表されます。 小版に相当する番号のみで構成されることもあります。

[64] 版番号のデータ形式は5種類あります。 >>63

[84] を読む実装は、 版番号を検査しなければなりません (must) >>63

[85] 小版(だけ)の変更は、 その書式変更 (format change) 互換性のある拡張 (compatible extension) であることを意味しています。 当該大版を理解する実装は、 小版に関わらず安全に処理を進められます。 対応していない小版で拡張された (field) を検知できないだけです。 >>63

[87] 未定義 (undefined) 予約 (reserved) とされた欄は、 小版の変更により意味を割り当てられることがあります。 実装はその値に何ら仮定を置くべきではなく (should never) 、 それらを無視できます。 フォントを出力する際は、 0 を常に書き込むべきです (should) 検証器は非 0 のとき警告するべきです (should) >>63

[86] 大版が認識できないときは、 そのを読んではなりません (must not) が存在しないものと扱うべきです (should) >>63

[89] post のように実際に大版の違いでがあったりなかったりする事例があります。 post の場合は数値が大きな (そして新しい) 大版で以前の大版にあったが削除されていたり、 数値が大きな大版が現在主に使われているものではなかったりします。


[88] いくつかの部分表には uint16 (type) 書式 (format) があります。 書式と同じく構造を定める役割を担っています。

[90] 例えば lookuplookupType があります。

[91] 書式はどちらかというと大版の違いに近いものです。 機能性が値によって大きく違っていたり、 の構成がまったく違っていたりします。

sfntVersion

[93] 単独のフォントの最上位に当たる TableDirectory には uint32sfntVersion があり >>92フォントOpenTypeを表します。

[94] フォントデータのではありません

[96] このの値はを表すタグである >>63 ないしタグと解釈し得ることがある >>92 とされています。 このの一部の値はタグの構文要件を満たしていません。

[95] TrueType outlineOpenType フォントでは、値 0x00010000 を使うべき (should) とされます。 >>92

[97] CFF データを含む OpenType フォントでは、値 OTTO (0x4F54544F) を使うべき (should) とされます。 >>92

[98] OpenType フォントTrueType フォントを表す true, typ1 を使うべきではない (should not) とされます。 >>92

[100] OpenType font collectionTTCヘッダーでは、 ttcTag と呼ばれており、 値 ttcf とします。 >>99

TrueType vs OpenType

[102] 5-4. フォントの技術情報, , http://www.akenotsuki.com/eyeben/fonts/fontinfo.html

MIME 型

[10] TrueTypeOpenTypeMIME型
[12] MIME型
MIME型
font/opentype
説明
OpenType フォント
拡張子
.otf
[13] MIME型
MIME型
font/otf
説明
OpenType フォント
拡張子
.otf
[14] MIME型
MIME型
application/x-truetype-font
説明
TrueType フォント
拡張子
.ttf
[15] MIME型
MIME型
x-font/ttf
説明
TrueType フォント
拡張子
.ttf
[16] MIME型
MIME型
font/ttf
説明
TrueType フォント
拡張子
.ttf

[2] RFC 8081 - The "font" Top-Level Media Type () https://tools.ietf.org/html/rfc8081#section-4.4.3

[5] ffmpeg Documentation (, ) https://ffmpeg.org/ffmpeg.html#stdin-option

Note that for Matroska you also have to set the mimetype metadata tag:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(assuming that the attachment stream will be third in the output file).

拡張子

[11] .otf, .otc (OpenType), .ttf, .ttc (TrueType) がよく使われています。

[54] OpenType フォントファイルは、拡張子 .otf, .ttf, .otc, .ttc を使うべき (should) です。 >>53

[55] .otc, .ttc は、 font collection file にのみ使うべき (should) です。 >>53

[40] TrueType 形式でグリフが格納された OpenType フォント.ttf ファイルとするなど、 .otf 系と .ttf 系はあまり厳密に使い分けられていません (し拡張子で区別しても意味はありません)。

処理

文字のレンダリング

実装

[47] MicrosoftOpenType Layout Services library (OTLS) を開発し Windows に搭載しています。 OpenType フォントによる文字のレンダリングのための APIWindowsアプリケーションに提供しています。 >>46

[48] 提携企業に公開しているらしいですが、 OSS ではなさそうです。

[46] OpenType glyph processing (part 1) - Typography | Microsoft Docs, alib-ms, https://docs.microsoft.com/ja-jp/typography/develop/processing-part1

The OpenType font format is the central element of the Windows glyph processing model. The OpenType Layout Services library (OTLS), on the other hand, is not essential, but it has great benefits to application developers who need to support glyph processing but want to be insulated from details of the font file format.

[49] 欧米東アジアの古くからの文字のレンダリング処理だけなら OTLS で実現できるのですが、インド系文字なども扱うには Uniscribe が必要になります。 (UniscribeOTLS を置き換えるものではなく、 OTLS と併用するか、 OTLS を内部で間接的に呼び出す形になります。)


[50] その他に各種 OS, DTP ソフトウェア, フォント編集等のソフトウェア, Webブラウザーなどが OpenTypeTrueType を実装しています。 その対応の程度は様々です。

[51] 近年では Webフォントの普及と機能拡張が進んで、 OS よりも Webブラウザーの方が OpenType の実装として高機能化してきているかもしれません。

[1] ttfdump, opentype.js, Typr

[6] fonts - What is the status of TTF support in Internet Explorer? - Stack Overflow ( 版) http://stackoverflow.com/questions/17694143/what-is-the-status-of-ttf-support-in-internet-explorer

[103] OpenType font viewer, , https://manakai.github.io/otfontviewer/

[104] manakai/opentypejs: A modified copy of opentype.js, https://github.com/manakai/opentypejs

歴史

[45] OpenType overview - Typography | Microsoft Docs, PeterCon, https://docs.microsoft.com/ja-jp/typography/opentype/

[52] Issues · MicrosoftDocs/typography-issues · GitHub, https://github.com/MicrosoftDocs/typography-issues/issues

メモ

[9] OpenTypeフォント: vanillaの日記 () http://vanillasky-room.cocolog-nifty.com/blog/2008/02/opentype-e54f.html

[17] OpenType Feature File Specification | afdko, , http://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html

[18] 全字庫フォント: name Unicode名の他に MacChineseTrad 名も入っている (ものもある)。

[19] Nosutaru-dot M+H 10 Regular: name Unicode名の他に MacJapanese 名も入っている。 MacRoman 名はほぼ全項目に入っている。

[105] GitHub - MPEGGroup/OpenFontFormat: Official MPEG repository to discuss issues on Open Font Format (ISO/IEC 14496-22), https://github.com/MPEGGroup/OpenFontFormat