Open6

Open Font Format(OFF)について読んでみたまとめ

いまのところなまえはないいまのところなまえはない

読んだ文書

https://www.iso.org/standard/74461.html
ISO[1]/IEC[2]規格のOpen Font Formatの文書。「Download」から2019年の規格と2020年の追加企画(たぶんカラーフォントについての文書)がダウンロードできる。
最近、次期規格がプロジェクトされたようなのでいずれは古いまとめになると思われる。

なお、OpenTypeはMicrosoftの商標であり、規格としてはOpen Font Formatなので以降はOFFと略する。

脚注
  1. 国際標準化機構(International Organization for Standardization)のこと。日本においてはJIS規格(日本産業規格)が互換になる。 ↩︎

  2. 国際電気標準会議(International Electrotechnical Commission)のこと。電気、電子工学に関連した規格を決めているところで、日本においてはJIS C規格(日本産業規格のうち電気・電子)が互換になる、多分。規格を決めている組織がISOとは当然異なるのだが共同で開発をしているため、併記されていることが多い。 ↩︎

いまのところなまえはないいまのところなまえはない

序文

OFFは、Appleが開発したTrueTypeフォントを拡張し、AdobeのPostScriptフォントのCompact Font Format形式のアウトラインデータをも使用できるようにした規格であり、OFFは先にあげた2つ(TrueTypeフォント、Compact Font Format)が使用できないOSやプラットフォームでも提供できるようにした形式である。

このへんはWikipediaにも記載されている。
https://ja.wikipedia.org/wiki/OpenType#規格

あとはOFFが目指していることや、OFFに基づくフォントを使用するユーザーが形式(TrueTypeフォントとか、Compact Font Formatとか)を意識せずに使用できるようにしたいこと、レイアウトを自由にし、Unicodeなどの大規模文字セットに柔軟に対応することなどが記載されている。

いまのところなまえはないいまのところなまえはない

1.規格の範囲

序文でも述べたOFFがTrueTypeやCompact Font Formatを含んでいることの言及。

2.参照している規格

ISO/IEC 10646

Universal Coded Character SetUnicode互換のISO/IEC規格
https://www.iso.org/standard/76835.html

ISO/IEC 14496-18

音声/動画(特にMPEG-4)におけるフォントの圧縮とストリーミングのISO/IEC規格
https://www.iso.org/standard/40151.html

ISO/IEC 15948

Portable Network Graphics(PNG画像)のISO/IEC規格
https://www.iso.org/standard/29581.html

IEC 61966-2-1/Amd 1:2003

標準色空間(sRGB)のIEC規格
https://www.iso.org/standard/35883.html

TrueType Instruction Set

MicrosoftによるTrueTypeの仕様書
https://learn.microsoft.com/en-us/typography/opentype/spec/tt_instructions

Unicode 11.0

Unicode は現在(2023.11 時点)すでにUnicode 15.1がリリースされていることに注意
https://www.unicode.org/versions/Unicode11.0.0/

Scalable Vector Graphics (SVG) 1.1 (Second Edition)

W3C[1]によるSVG画像の仕様書
https://www.w3.org/TR/SVG11/

IETF BCP 47 specification, “Tags for Identifying Languages"

IETF言語タグのRFC[2]規格
https://www.rfc-editor.org/info/bcp47

脚注
  1. World Wide Web Consortiumのこと。インターネット技術に関する文書を多く策定しておりHTMLなんかも有名。ただし、HTMLは現在WHATWG(Apple、Mozilla、Opera、Microsoftが運営している組織)がHTML Living Standardとして策定していることに注意。HTML 6なんてないよ。 ↩︎

  2. インターネット技術特別調査委員会(Internet Engineering Task Force: IETF)が管理している技術仕様のこと。意見収集も目的にあるため、だれでも閲覧できるようになっているらしい。 ↩︎

いまのところなまえはないいまのところなまえはない

3.用語と定義、略語について

3.1.用語と定義

この定義書では新たに定義はしていないので、気になったことはISOやIECのデータベースで調べてください、とある。
正直、知らないことだらけだから仕様書を見てるのにこれは非常に困る。

3.2.使用する略語について

いろいろ略語が書いてあったが一部しか使用していないものも多かったのでここで使用しそうなものだけ

  • ANSI
    ここでは3つの意味がありうるので文脈に注意が必要。
    • 米国国家規格協会(American National Standards Institute)の略。仕様書ではたいていの場合これを指している。
    • Windowsコード ページ のこと。
      旧来、ANSI規格で定義された文字集合をWindows上で定義したが規格にのっとっておらず、また各国の標準文字セットにANSIと表示していたらしい。Windows ANSIという文字列を見つけたのでこちらも文章上に存在している。
    • Microsoftコードページ932(CP932) のこと。
      Windowsコードページの誤解により、日本ではANSIがCP932を参照していたため、そう呼ばれているらしい。とてもややこしい。
      ちなみにCP932はShift_JISとある程度の互換があるため、Shift_JISをANSIと呼んでいる場合もある。
  • BMP
    ここでは2つの意味がありうるので文脈に注意が必要。
    • 基本多言語面のこと。Unicodeの用語でU+0000~U+FFFF(仕様としてはU+FFFDが最後)に配置されている文字のことをいう。仕様書ではたいていの場合これを指している。
    • ビットマップ画像のこと。OFFではアウトライングリフ(ベクター画像で字形を表現する方法)とビットマップグリフ(ビットマップ画像で字形を表現する方法)がある。
  • BTBD
    ベースライン間の距離
  • CFF
    PostScriptフォントのCompact Font Format形式のアウトラインデータのこと
  • CID
    ここでは2つの意味がありうるので文脈に注意が必要。
    • CID(キャラクタID)のこと。字形ひとつひとつに識別番号を割り振り、言語と文字コードと字形の組み合わせを作ることで同一文字コードの異体字を表現できるようにする方法。この組み合わせ表のことCMapと呼び、同じ文字でも言語セットごとに表示される文字が異なるのはこの仕組みを使用している。仕様書ではたいていの場合これを指している。
    • CIDの仕組みを利用したPostScriptフォントのことをCIDフォントと呼ぶ
  • CJK, CJKV
    漢字のこと。歴史上、漢字は中国(C)、日本(K)、韓国(K)、ベトナム(V)を中心とした地域で使用されていたためこのように表現する。
  • GID
    TruTypeやOFFで使用するCIDのこと。
  • ICF
    平均字面のこと。文字を上下に揃える場合、3つの手法が存在する
    • 欧文基準
      たとえば英語アルファベットの場合、大文字Xの上端を通る「アセンダライン」、小文字xの上端を通る「ミーンライン」、小文字xの下端を通る「ベースライン」、小文字gの下端を通る「ディセンダライン」の4つの基準が存在するが、一般的にはベースラインを基準に揃えて表示する。[1]
    • 字形の最大位置基準
      フォント内の字形で最大の文字の一番外側に揃える方法がある。この時に揃える線(一番外側)を「仮想ボディ」と呼び、この仮想ボディの外に文字ははみ出すことができない。[2]
    • 平均字面基準
      フォント内の全字形での平均に揃える方法がある。この時に揃える線を「平均字面」といい、平均であるため「仮想ボディ」よりは当然内側になる[3]
脚注
  1. 画像は「世界一わかりやすい InDesign 操作とデザインの教科書」より引用 ↩︎

  2. 同じく ↩︎

  3. 同じく ↩︎

いまのところなまえはないいまのところなまえはない
  • LTR
    左書き(Left to Right)のこと
  • NRC
    日本の文化審議会国語分科会(旧:国語審議会)のこと。
  • OMPL
    鏡文字対応表[1](OpenType Mirroring Pairs List)。
    例えば括弧(())は、右書き、左書きと同じ字形が使えない。たとえば(abc)が右書きになると)cba(のようになってしまう。
    これを対応するには、字形をそのまま反転させる方法もあるだろうけれども、OFFでは文字コードが参照すべきGIDを入れ替えて対応しているらしい。
    どういうことかというと、U+0028(( 例えばGID:1)とU+0029() 例えばGID:2)は対であることを示した表を用意する。左書きの場合はU+0028は(、U+0029は)と出力するが、右書きの場合は対応している文字コードの持つGIDを参照するのでU+0028は)、U+0029は(を表示する。
    この対応表がOMPLらしい。OMPLはMicrosoftが公開している。

https://learn.microsoft.com/en-us/typography/opentype/spec/ompl

仕様書上にも「Annex C」(596頁)に収録されている。

  • PCL
    Printer Control Languageの略。HP社が開発したページ記述言語(プリンタへ指示するためのプログラミング言語)のこと。
  • PPM, PPEM
    ピクセル(単位:px)を字幅(単位:em)で割った数字。
    フォントサイズの変換式[2]に基づいている。
em = \frac{px}{フォントサイズ}
  • RTL
    右書き(Right to Left)のこと。
  • UVS
    異体字シーケンス(Unicode variation sequence)のこと。
    前提として同じ字でも複数の字形が存在する場合に、文字の後ろに選択子を付与することで別の字形を指定する方法があり、この選択子のことを「異体字セレクタ」という。[3]

    異体字セレクタはUnicodeでは「U+FE00〜U+FE0F」及び「U+E0100〜U+E01EF」に割り振られており、それぞれ「VS1,VS2,……,VS256」と通番が割り振られている。この通番のことを「異体字シーケンス」と呼んでいる。
脚注
  1. 適切な漢字表記が思いつかなったのでここでは左右を反転させた文字を指す「鏡文字」を当てはめた。 ↩︎

  2. https://pixelsconverter.com/px-to-em ↩︎

  3. 画像はWikipedia異体字セレクタより引用 ↩︎

いまのところなまえはないいまのところなまえはない

4.OpenFontファイル(Open Font File Formatについて)

4.1.説明

OpenFontファイルは、TrueTypeフォントやAdobeのPostScriptフォントのCompact Font Format形式といった文字のアウトラインデータをレンダリングすることでラスター画像(≒ビットマップ画像)に変換している。このアウトラインデータは表形式で管理している。

……といったことを説明に書いてあると思う(微妙にニュアンスがわからなかった)
仕様としての概要なので読み飛ばしても問題はないかなぁと。

ちなみに、この規格ではUniversal Coded Character Set(≒Unicode)にのみ対応しており、UCCSに批准していないOFFは規格の対象にならないらしい。たぶん。

4.2.ファイル名

拡張子は.OTF、.TTF、.OTC、.TTCの4つ。
簡単に説明は書いてあったが、後に解説があるらしいのでここでは省略。(8.4.を参照)

4.3.データ型

扱うデータ型は下記の通り。

データ型 説明
uint8 符号なし整数型 8 bit
uint16 符号なし整数型 16 bit
uint24 符号なし整数型 24 bit
uint32 符号なし整数型 32 bit
int8 符号あり整数型 8 bit
int16 符号あり整数型 16 bit
int24 符号あり整数型 24 bit
int32 符号あり整数型 32 bit
Fixed 符号あり固定小数点型 32 bit (整数部16 bit、小数部16 bit)
UFWORD フォントデザイン用のuint16(符号なし整数型) 16 bit
FWORD フォントデザイン用のint16(符号あり整数型) 16 bit
F2DOT14 符号あり固定小数点型 16 bit (整数部2 bit、分数部14 bit)
LONGDATETIME タイムスタンプ型。1904年1月1日[1]0時を基準にミリ秒で扱う 64 bit
Tag タグ型。テーブル、デザインバリエーション軸、スクリプト、言語システム、機能、ベースラインなどを識別するために使用~とあるが多分後述 32 bit (uint8 x 4 の 配列)
Offset16 表のオフセット。nullは0x0000として扱う 16 bit(uinit16と等価)
Offset32 表のオフセット。nullは0x00000000として扱う 32 bit(uinit32と等価)

バイトオーダーはすべてビックエンディアンで扱うらしい。(規格としては「ネットワーク・バイト・オーダー」を基準にしているらしい)

F2DOT14

F2DOT14は下記で表現される。

F2DOT14の実際の数値 = 整数部の2の補数 + \frac{分数部}{(3FFF)_{16} + 1}

0x3FFFは14 bit全部1の値のこと。

Tags

Tagsは極端に言うとASCII[2](0x20~0x7E)から4字で構成されるuint8配列の変数。
大文字と小文字は区別され、スペース(0x20)が配列に入っている場合、後続の文字も必ずスペースになる。

脚注
  1. 私は知らなかったがMacintoshでは日付システムの基準日は1904年1月1日らしい。へぇ。
    https://learn.microsoft.com/ja-jp/office/troubleshoot/excel/1900-and-1904-date-system ↩︎

  2. 正しくはUnicodeの基本ラテン文字に該当する文字をUTF-8で扱う。 ↩︎