w3c-memo

WebFont関係まとめ

まだ作成中

ToC

関連仕様、ノート類

WOFF関係のパートはいれた。Brotliの詳細、OFF以降はまだ

TTF/OTF/OFF/CFF関連

OpenTypeの概要

基本的な処理の流れ

Font Variationの方法

RTL対応、文字列の中に別なbidiレベルが出現した場合の処理として

テーブル定義

(一部)

OpenTypeデータ構造

データ型

データレコードは上位の構造の中ではそのまま連続して並べられる。

バージョン表記

各テーブルや全体におけるバージョンについて。

メジャーバージョンの変更は必ず検出しなければならず、未対応なら読まない。マイナーバージョンはテーブル形式の後方互換性を保った変更に限られる。 単一のuint16,uint32でのバージョン番号はマイナーバージョンである。 予約されたフィールドについては、未対応の処理ソフトは無視し、書きだす際には0で埋める。

テーブルディレクトリ

トップレベルのテーブルで、単一フォントの場合は先頭、コレクションの場合はTTCHeaderに記述される場所の開始位置になる。 searchRange, entrySelector, rangeShiftは高速バイナリサーチ構築のための追加データで、16倍はtableRecordのサイズ。 ただし、間違った値を入れる攻撃の可能性があるので、これらの値に依存した処理は非推奨。

全てのテーブルは4byteでアラインされる。テーブルについてのみで、サブテーブルなどはこの限りではない。

フォントコレクションの扱い

を追加することで構成される。また、データのテーブルはフォント間で共用可能。

TTCHeaderは1.0と2.0がある。2.0ではデジタル署名の領域(DSIG)が追加されている。デジタル署名なしの場合は0埋め。

RFC 8081 / フォントメディアタイプ

application/font-xxxapplication/x-font-xxxのようなMIME型でなく、font/xxxの提案とレジストリ。まだProposed Standardの状態。 どのような種類のフォント形式があるかの一覧には役立ちそう。 以下のリストでparameterは基本的にカンマ区切りのリストで、同じ名前は同じ内容となる(ので初出のみ詳述)。

WOFF2の概要

MTXでは以下のような処理を行っており、その中からピックアップされている。Data setへの分割は取り入れられなかった部分。

WOFF2ファイル構成

概要

ファイルの構成ブロックは以下、リストの並び順にファイルの中に並ぶ

テーブル・フォントデータの並び順について(以下の詳細はsection 5.5から)

WOFF v1からの変更

フォントデータのtransformation

glyf

transform後のglyfテーブルのデータ構造

glyphStreamに格納されるデータは一つ前の点座標に対するdeltaで表記され、先頭は(0, 0)に対するdeltaである。 バイト列からのdelta値の再構成の対応表は5.2節 Triplet Encodingにあり、 先頭バイトがIndexでflagStreamからの1バイトを含み2-5バイトで表記される値(glyphStreamからは1-4バイト)で格納され、計算後は(flag, x, y)のセットとなる。 flagStreamからのflag

デコーダの再構成の流れ

loca

独立してtransformationの設定の値を持つが、glyfのtransformationに依存するので現実にはglyfの値と同じとなる

hmtx

transform後のhmtxテーブルのデータ構造

フォントがglyfテーブルを持つなどのTrueType系列の場合にのみ適用可能である。 エンコーダは全グリフについてleftSideBearingがbbox xMinに一致するかを確認する必要があり、一致していればこのtransformを適用する必要がある。 なお、コレクション内でhmtxテーブルが共有されている場合は全ての対応先についてこの確認をする必要がある。

Brotli

WOFF2後のwebfont高速化

Evaluation reportではCSSによるunicode-rangeでのstatic subsetが導入された後のwebfontの問題点として

などが挙げられている。これに対応するためにprogressive subsetが提案され、一つ目については必要なコードポイントの部分のみのダウンロード、 二つ目については整合性のある大きいセットから必要部分だけを持ってくることでshaping/kerningを整合性をもって適用することが可能になる。

evaluation reportでの評価対象

フォント全体を落としてくるという操作に対して、unicode rangeでの複数woff2ファイルへの分割、以外に、2種類の方式が追加で評価されている

評価はいくつかの言語グループを想定して行われている。それぞれ転送されるであろうバイト数、転送速度によるコスト評価が行われた。

評価での結論は、patch subsetもrange requestも高い効果をもたらしたとするが、 patch subsetはサーバの更新が必要だがrange requestは既存のフレームワーク内で処理可能とも指摘。 今後の作業として以下の点を挙げている:

Incremental font transferの提案仕様

2021/3/22版ではpatch subsetの方式(Patch Based Incremental Transfer)のデータ型定義の途中までしかない。 転送方式などについてはなにもまだ掛れていない。データのEncodingにはCBOR (RFC #8949)を利用する。