まだ作成中
ToC
WOFF関係のパートはいれた。Brotliの詳細、OFF以降はまだ
sfnt
コンテナ構造を利用しているFont face
: 特定のデザインパラメータによるグリフデータの一つの集合で、メトリクス値、名前、などのメタデータが添付されていることがあるFont resource
: フォントとして機能する(最小でも最低限の)必要なテーブルセットを含むOpenTypeデータFont family
: 共通のフォント名を持つフォントのセット、同じ名前がname ID 16 (Typographics Family Name)かname ID 1に記載されるAxis of variation
: 同じファミリーの中でvariationとして変化させている種類Variable font
: 同じファミリーの複数フォントフェイスを持つフォントリソース、OpenType Font Variationsの機構を利用するGlyph design grid
: グリフのアウトラインがデザインされている平面Design-variation space
: variationの軸で構成されるフォントファミリー内での変化、fvar
テーブルに定義される軸によるn次元空間Variation data
: variationで設定される値に対応するフォントフェースを実現するためのデフォルト値からの差異もしくは変換値Variation tables
: OpenType Font Variationsに直結するテーブルは以下のリストになる
avar
: Axis variationscvar
: CVT (control value table) variationsfvar
: font variationsgvar
: glyph variationsHVAR
: horizontal metrics variationsMVAR
: metrics variationsVVAR
: vertical metrics variationsPoint
: グリフデザイングリッド中の平面上の座標Variation instance
: variationの値の組のそれぞれに対応するインスタンスNamed instance
: variation instance
のうちのfvar
テーブルで固有の名前が定義されているもの (UIのドロップダウンでフォント名として出てくるようなやつ)User coordinate scale
: あるvariationの軸における特徴づけに利用されるスケール
fvar
テーブルに軸の利用される最大・最小が記述されより制限されることもある。Normalized coordinate scale
: variable fontのデータから特定の表示用にするさいに、正規化の中でnormalized scale
(-1から1の間)を適用して各軸のユーザスケールでのデータをこの正規化されたデータに変換する
fvar
テーブルに各軸のスケールの最小・規定・最大値を指定可能で、それらが正規化の際に(-1, 0, 1)
にマップされるavar
テーブルにそれ以外の値のマッピングが定義されていることもあるTuple
/ N-tuple
: variationの空間の中における座標を定義するのに利用される順序付きの座標値
tuple
ではない (OpenTypeではtuple variation data
となる)Region
: あるvariationでの変換が適用される領域
Region
が定義可能Master
: フォント開発フローの中で特定のフォントフェースについて揃ったアウトラインデータを含むソースDeltas
/ Adjustment deltas
: variation空間の中やある軸の一部分といった部分領域に対するデータに加える補正データDelta set
: あるRegion
に関連するAdjustment deltas
のセットScalars
: 特定のvariationで必要となる補正値を生成するためにdeltas
に掛ける補正係数Interpolation
: 補正値を計算するプロセスcmap
テーブルを利用して、入力された文字コードの列をグリフIDの列に変換するGSUB
テーブルを利用して、グリフIDの列に対して、代替配置・縦書き、リガチャなどの変換を加えるGPOS
テーブルを利用して配置場所を、BASE
テーブルからベースラインを取得、グリフを配置するdesign coordinates
においてデバイス非依存の改行位置を判定 (デバイス非依存の改行???)JSTF
テーブルを利用して、揃え処理を行うdesign coordinates
からグリフを出力先に合わせてdevice coordinates
に変換するfvar
(font variations)テーブルを持ち、利用しているvariationの種類が記述されており、既定値も定義されている
STAT
(Style attributes)を各variationについての詳細の為に含めることができ、単独軸のパラメータについてや複数軸を合わせての名前付けができUIで利用されるfvar
の仕様が更新され、fmtx
が利用されなくなったxMin
に一致し、head
テーブルのflags
のbit 1が立っている必要があるhead
テーブルのflags
のbit 5が落ちてる必要があるGPOS
での配置位置など)ので、GSUB
やGPOS
など各テーブルの機能ごとでの変更テーブルが利用される。
rvrn
(Required Variation Alternates)機能も参照glyf
はグリフの既定のアウトライン、gvar
(glyph variations)は各variationでの変更を記述する、などfvar
に定義されている全軸の既定値の状態に対応するデータが可変のためのテーブルがなくなっている場合に利用されるfvar
仕様にaxis tag
として定義されている (weightとか)
User coordinate
とNormalized coordinate
の関係は、min/default/maxの3点をマップした変換空間の座標変換
avar
テーブルで定義でき、追加点を含む複数制御点による折れ線の線形変換GSUB
のFeatureVariations
テーブルとrvrn
を組み合わせることが可能。glyf
テーブルに対しては、gvar
テーブルのvariationのデータは、適用対象のRegion
用のdelta
の値となる
cvar
テーブルに入るOS/2
テーブルに対してはMVAR
テーブルを利用する
MVAR
テーブル自体は他のgasp
, hhea
, post
, vhea
テーブルなどに対しても適用できるCFF2
テーブルにはその中に含めることができる (CFF 1.0では対応していない)
CFF2
のみでは不可能なので、hmtx
/vmtx
に加えてHVAR
/VVAR
が必須hmtx
とvmtx
テーブルに対しては、それぞれHVAR
とVVAR
テーブルが対応する
glyf
テーブルのxMin
などから四隅を算出できるがコスト高いことから、これらのテーブルを含めることが推奨されるGDEF
, GPOS
, JSTF
を必要に応じて追加。また、BASE
にvariationのデータを追加する。ltrm
を利用して処理を行うltra
を利用してより精緻なグリフ選択を行うi
がOMPL
(OpenType Mirroring Pairs List; U+0028/U+0029など)でj
にマップされ、cmap(j)
が有値なら、文字i
についてcmap(j)
のグリフを利用するrtlm
を利用して処理を行うrtla
を利用してより精緻なグリフ選択を行う(一部)
cmap
: 文字とグリフのマッピングhead
: フォントヘッダhhea
: 水平方向ヘッダhmtx
: 水平方向のメトリクスmaxp
: 最大プロファイルname
: 名前付け用テーブルOS/2
: OS/2
とWindows特有のメトリクスpost
: PostScript情報cvt
: (optional) 制御値fpgm
: (optional) フォントプログラムglyf
: グリフのデータloca
: データ位置の列prep
: (optional) CVTプログラムgasp
: (optional) グリッド合わせ、スキャン変換CFF
: CFF 1.0データCFF2
: CFF 2.0データVORG
: (optional) 垂直原点、縦書き対応のフォントでは持つことを強く推奨されているSVG
: SVGテーブルEBDT
: ビットマップデータEBLC
: ビットマップデータへの位置情報EBSC
: スケールデータCBDT
: カラービットマップデータCBLC
: カラービットマップデータへの位置情報sbix
: 標準的なビットマップ画像GSUB
: グリフ代用情報 - 1対1、リガチャなどの1対多・多対多、芸術的な代替、コンテキスト依存GPOS
: グリフ位置補正のためのX/Y位置情報 - 単独、グリフペア、草書体、付属マーク、コンテキスト依存BASE
: スクリプトごとのベースラインオフセット情報JSTF
: 空白とKashidaを含む揃えの情報GDEF
: フォント中の全個別グリフの情報 - タイプ(simple, ligature, combining mark)、追加の点 (あれば)、リガチャグリフの場合に分割点MATH
: 数式用レイアウトavar
: 軸情報cvar
: CVTに対して (TrueType)fvar
: フォントバリエーションgvar
: グリフに対して (TrueType)HVAR
: 水平メトリクスに対してMVAR
: メトリクスに対してSTAT
: スタイルに対してVVAR
: 垂直メトリクスに対してCOLR
: 色テーブルCPAL
: 色パレットCBDT
: 色付きビットマップCBLC
: CBDT
位置情報sbix
: 標準ビットマップ画像出の表記SVG
: SVGでの表記DSIG
: デジタル署名hdmx
: 水平デバイスメトリクスkern
: カーニングLTSH
: 線形スレッショルドデータMERG
: マージ用meta
: メタデータSTAT
: スタイル属性PCLT
: PCL 5のデータVDMX
: 垂直デバイスメトリクスvhea
: 垂直メトリクスのヘッダvmtx
: 垂直メトリクスuint8
, int8
, uint16
, int16
, uint24
, uint32
, int32
FWORD
(int16), UFWORD
(uint16)F2DOT14
(2.14
とも記述される、小数点部14bitの符号付実数、int16
として評価して14bit/16384で割った値)LONGDATETIME
: 64bit符号付整数で表す、1904年1/1 12:00真夜中、からの経過秒数Tag
: uint8を4つ、テーブル、variation軸、スクリプト、言語、機能、ベースライン、などを示すタグ (0x20-0x7Eの4文字分)Version16Dot16
: 32bitにパッケージされたメジャー・マイナーバージョンの値Offset16
, Offset32
データレコードは上位の構造の中ではそのまま連続して並べられる。
各テーブルや全体におけるバージョンについて。
uint16
: 通例0から始まるバージョンの値uint16
: major/minorの2つの値、通常1.0から始まるuint32
での定義された列挙値uint32
の数値、DSIG
とmeta
でのみ利用されるVersion16Dot16
表記、maxp
, post
, vhea
でのみ利用される (後方互換性)メジャーバージョンの変更は必ず検出しなければならず、未対応なら読まない。マイナーバージョンはテーブル形式の後方互換性を保った変更に限られる。
単一のuint16
,uint32
でのバージョン番号はマイナーバージョンである。
予約されたフィールドについては、未対応の処理ソフトは無視し、書きだす際には0で埋める。
トップレベルのテーブルで、単一フォントの場合は先頭、コレクションの場合はTTCHeaderに記述される場所の開始位置になる。
searchRange
, entrySelector
, rangeShift
は高速バイナリサーチ構築のための追加データで、16倍はtableRecord
のサイズ。
ただし、間違った値を入れる攻撃の可能性があるので、これらの値に依存した処理は非推奨。
uint32
sfntVersion
: 0x00010000 (TrueTypeの場合) もしくはOTTO
(0x4F54544F; CFFの場合)uint16
numTables
: 含まれるテーブル数uint16
searchRange
: numTables
に一致か小さい最大の2のべき乗値に16を掛けた値uint16
entrySelector
: numTables
に一致か小さい最大の2のべき乗値のべきの値unit16
rangeShift
: numTables
* 16 - searchRange
tableRecord
: numTables
の数分の配列
Tag
tableTag
: glyf
などのテーブルのタグuint32
checksum
Offset32
offset
: フォントファイル先頭からのオフセットuint32
length
: テーブルの長さ全てのテーブルは4byteでアラインされる。テーブルについてのみで、サブテーブルなどはこの限りではない。
.ttc
(TrueType)もしくは.otc
(CFF,CFF2)を追加することで構成される。また、データのテーブルはフォント間で共用可能。
TTCHeaderは1.0と2.0がある。2.0ではデジタル署名の領域(DSIG
)が追加されている。デジタル署名なしの場合は0埋め。
TAG
ttcTag
: ttcf
uint16
majorVersion
: 1 or 2uint16
minorVersion
: 0uint32
numFonts
: TTC内のフォント数Offset32
tableDirectoryOffsets
: numFonts
数分のオフセット値の配列uint32
dsigTag
: DSIG
uint32
dsigLength
: 署名の長さ、付けなければ0uint32
dsigOffset
: TTCファイル先頭からのオフセットapplication/font-xxx
やapplication/x-font-xxx
のようなMIME型でなく、font/xxx
の提案とレジストリ。まだProposed Standardの状態。
どのような種類のフォント形式があるかの一覧には役立ちそう。
以下のリストでparameterは基本的にカンマ区切りのリストで、同じ名前は同じ内容となる(ので初出のみ詳述)。
font/snft
: Generic SFNT font
TTF
(TrueType), CFF
(PostScript/CFF), SVG
(SVF)OTL
(OpenType text layout), AAT
(Apple Advanced Typography), SIL
(Graphite SIL)font/ttf
: TTF font
font/otf
: OpenType Layout font
font/collection
: Collection font
font/woff
: WOFF 1.0font/woff2
: WOFF 2.0MTXでは以下のような処理を行っており、その中からピックアップされている。Data setへの分割は取り入れられなかった部分。
glyf
(重複情報削除), loca
(いれない、デコード時に再生成), cvt
(より小さく格納), hdmx
(bitエンコード), VDMX
(bitエンコード)に変換を掛けた
glyf
の変換はTriplet Encoding
を含め、WOFF2の変換に持ち込まれているglyf
のアウトラインデータとその他のテーブル全部、cvt
, hdmx
, VDMX
, glyf
を圧縮、その他は非圧縮glyf
のpush dataを格納
概要
ファイルの構成ブロックは以下、リストの並び順にファイルの中に並ぶ
wOF2
ttcf
などのフォントコレクションといったフォーマットの指定0
glyf
テーブルなどの記述によって展開後に異なる可能性があるので参照用のみ)0..5
の6bitがテーブル定義(63
以外は定義値、63
は次の値を利用)、6..7
の2bitがプリプロセスでのtransformationのバージョン番号0-3
を示すflags=63
の時のテーブル名4文字、後ろ空白パディングCollectionHeader
とCollectionFontEntry
のリストで構成され、一つのCollectionHeader
の直後に定義された数のCollectionFontEntry
が並ぶCollectionHeader
はテーブル数の定義
CollectionFontEntry
は各フォントに対応するテーブルのピックアップ用のデータ
sfnt
versionnumTables
分の配列): TableDirectory
のエントリを0始まりで数えたときの利用するテーブルの番号の配列index
の中に同じ番号が出現してもよい(逆に同じテーブルデータを複数回含むことは禁止)
glyf
とloca
のペアについて、片方のみを共有しているような設定は禁止checkSum
の値が正しいものである必要がある(再計算必要)、また全体に対してcheckSumAdjustment
の値を再計算しhead
テーブルを更新するglyf
, loca
, hmtx
に適用される
glyf
: アウトラインデータの保持loca
: それぞれのグリフのデータがglyf
のどこに保持されているかのオフセットデータhmtx
: グリフの水平方向のメトリクスの保持DSIG
テーブルは含めないhead
テーブルのflags
のbit 11をたてないといけない(ロスレス変換を経たということの提示のため)テーブル・フォントデータの並び順について(以下の詳細はsection 5.5から)
ascending alphabetical order
としているが、WOFFでは処理の高速化のために制限をつけているglyf
とloca
は常にペアでこの順に配置されている必要がある。reverse transformがglyf
に設定されている時にloca
が必要なため。glyf
とloca
はWOFFが一つのフォントセットのみの場合は間に別なものが入っていいが、フォントコレクションの場合は必ず対応関係のglyf
とloca
は連続しなければならない
cmap
, glyf
, hhea
, hmtx
, loca
, maxp
の並び順は可能cmap
, glyf
, loca
, hhea
, hmtx
, glyf
, loca
, maxp
, post
のような並び順になる必要があるglyf
3
: null transform (unmodified)0
: table transformation, 重複情報の削除と実際のグリフアウトラインに対する効率的なエンコード
origLength
とデコード後のサイズは一致しない可能性があるglyf
テーブル内でのオフセットがloca
テーブルの値になるglyf
テーブルのデータ構造loca
テーブルのオフセットの形式、head
テーブルのindexToLocFormat
と一致nCounter
ストリームのバイト数nPoints
ストリームのバイト数flag
ストリームのバイト数glyph
ストリームのサイズ数composite
ストリームのバイト数bbox
データのバイト数、bboxBitmap
とbboxStream
の合計instruction
ストリームのサイズcounter
の数の配列counter
のアウトライン点の数の配列component
フラグの値と付属するcomposite glyphのデータの配列numGlyphs
分の長さの配列
4 * floor((numGlyphs + 31) / 32)
(4byteパッド)bboxStream
に対応するbboxが格納されていれば立てるcounter
がゼロ個の場合はbboxがすべて0であることを確認し、違ったらエンコーダは入力フォントを無効として却下する、okならフラグを下すinstruction
setの配列glyphStreamに格納されるデータは一つ前の点座標に対するdeltaで表記され、先頭は(0, 0)に対するdeltaである。
バイト列からのdelta値の再構成の対応表は5.2節 Triplet Encoding
にあり、
先頭バイトがIndexでflagStream
からの1バイトを含み2-5バイトで表記される値(glyphStream
からは1-4バイト)で格納され、計算後は(flag
, x
, y
)のセットとなる。
flagStream
からのflag
は
glyphStream
からの値を評価するためのインデックス
glyphStream
からのデータをX/Yに対して割り振るビット長 (割り振る場合は先頭ビットからXに利用)nCounterStream
からInt16 1データを読み、glyf
のnumberOfCounters
の値とする
loca
は一つ前のグリフと同じ値に設定するnPointsStream
からnumberOfCounters
分の255UInt16データを取得、それぞれがcounter内のデータ点数となり、endPtsOfCounters[]
へ格納 (数でなく終了位置とするので-1する)flagStream
から一つ前に計算した全ポイント数分のUInt8データを取得、これがデータ点のフラグの配列になるglyphStream
から読んでいき、各データから計算したdelta-x/yをglyf
に格納していくglyphStream
から一つの255UInt16の値を取得、instruction
の配列の長さ(instructionLength
)となるinstructionLength
分のデータをinstructionStream
から取得するcompositeStream
から一つのUInt16の値を取得、TrueTypeのcomponent flag word
のデータとするcomponent flag word
のデータに対応する長さの追加データをcompositeStream
から読みだし (4-14バイト)、glyf
に格納する
glyph index
, arg1
, arg2
, optional scale
, affine matrix
のデータcomponent flag word
のFLAG_MORE_COMPONENTS
(bit 5)が立っていれば再度このステップを繰り返すcomponent flag word
のどれかにFLAG_WE_HAVE_INSTRUCTIONS
(bit 8)が立っているものがあれば、instruction
が存在するのでsimple glyphの4-5ステップ目を行うbboxBitmap
でデータが格納されているグリフについて、bboxStream
から4つのInt16を取得しxMin/yMin/xMax/yMaxの値とする
loca
独立してtransformationの設定の値を持つが、glyf
のtransformationに依存するので現実にはglyf
の値と同じとなる
3
: null transform (unmodified)
0
: table transformation
glyf
のデコーダの処理の中でloca
テーブルが作成されるのでデータはないtransformLength
は必ず0origLength
はnumGlyphs
+1にグリフごとのサイズを掛けたもの、glyf
のindexFormat
が0の場合2バイト、それ以外は4バイトhmtx
0
: null transform (unmodified)1
: table transformationを行う、hmtx
テーブルの冗長部分を削る
hmtx
はMin側にプロポーショナル・モノスペースの2種のグリフに対応する2つの配列を持つが、通常はTrueTypeの推奨通り同じなので省けるhmtx
テーブルのデータ構造フォントがglyf
テーブルを持つなどのTrueType系列の場合にのみ適用可能である。
エンコーダは全グリフについてleftSideBearing
がbbox xMin
に一致するかを確認する必要があり、一致していればこのtransformを適用する必要がある。
なお、コレクション内でhmtx
テーブルが共有されている場合は全ての対応先についてこの確認をする必要がある。
TableDirectory
で変換が指定されている場合、bit 0/1は立て、bit 2-7は予約(0)となる。なので必ず0xC0、そしてadvanceWidth
のみ存在することになる。lsb[]
が存在しない、glyf
のxMinからleftSideBearing[]
が存在しない、glyf
のxMinからadvanceWidth
の配列、hhea
テーブルのnumOfHMetrics
の個数分left side bearing
の配列、hhea
テーブルのnumOfHMetrics
の個数分
Flags
のbit 0が設定されていない場合のみ存在するleft side bearing
の配列、numGlyphs
- numOfHMetrics
の数分
Flags
のbit 1が設定されていない場合のみ存在するEvaluation reportではCSSによるunicode-rangeでのstatic subsetが導入された後のwebfontの問題点として
などが挙げられている。これに対応するためにprogressive subsetが提案され、一つ目については必要なコードポイントの部分のみのダウンロード、 二つ目については整合性のある大きいセットから必要部分だけを持ってくることでshaping/kerningを整合性をもって適用することが可能になる。
フォント全体を落としてくるという操作に対して、unicode rangeでの複数woff2ファイルへの分割、以外に、2種類の方式が追加で評価されている
評価はいくつかの言語グループを想定して行われている。それぞれ転送されるであろうバイト数、転送速度によるコスト評価が行われた。
評価での結論は、patch subsetもrange requestも高い効果をもたらしたとするが、 patch subsetはサーバの更新が必要だがrange requestは既存のフレームワーク内で処理可能とも指摘。 今後の作業として以下の点を挙げている:
2021/3/22版ではpatch subsetの方式(Patch Based Incremental Transfer)のデータ型定義の途中までしかない。 転送方式などについてはなにもまだ掛れていない。データのEncodingにはCBOR (RFC #8949)を利用する。