LoginSignup
28
23

More than 5 years have passed since last update.

OpenTypeの仕様入門 (後編)

Posted at

OpenTypeレイアウトテーブル

これは文字を適切なものに置き換えたり、正しい位置に配置したりといったTypographyの情報を含むテーブル群を指します。
これには5つのテーブルがあります。
これらのテーブルはOpenTypeフォントではOptionalなデータですが、日本語フォントの場合には縦書きグリフを用意する都合上、GSUBテーブルが備わっていることがほとんどです。

  • GSUB
    • 下記で詳しく説明します。
  • GPOS
    • 下記で詳しく説明します。
  • BASE: ベースラインに関する情報です
    • ベースライン……ムズカシイ。
  • JSTF: 文字間隔を広げたり狭めたりするときの情報です
    • 見たことありませんね。
  • GDEF: グリフが通常の文字かマークかリガチャか部品かといった情報です
    • マークを配置する基準位置の情報
    • リガチャの中でキャレットをどこに表示するべきかという情報

GSUBGPOSに共通のデータ構造

OpenTypeレイアウトで中心的な役割を果たすGSUBテーブルとGPOSテーブルは共通したデータ構造を持っている。
それが以下のような、Script/Feature/Lookupのリストである。

  • Script List(文字体系)
    • Language Systems(言語体系)
      • ここで適用される下記FeatureのIDs
      • どのScriptのどのLanguageを使うかによって適用される機能が変わってくる
  • Feature List(機能リスト)
    • vertligaといったタグがつく
    • ここで適用される下記LookupのIDs
  • Lookup List(実際の情報)
    • 適用するべきグリフ置換やグリフ移動の情報
    • それぞれのテーブルごとに中身は違う

実際のグリフの置換や移動を行うための情報は各Lookupにあります。
このほかに、最近OpenType 1.8で導入されたバリアブルフォント(Variable Fonts)用の情報もあるが、今回はスキップする。

文字列描画系では、まず適切なScriptとLanguageを選択します(存在しない場合はデフォルトのものを選択)。
次にそのScriptとLanguageに対するFeature Listから、現在描画するテキストに適用するべきFeatureを選び出します。
そこで得られたLookup Listを適用して文字列を描画します。

GSUBテーブル

GSUBテーブルをGID列に適用すると、描画されるべきGID列を得ることができます。
横書きの日本語ではGIDの置換が必要になることは少ないのですが、縦書きではこの処理が必須になります。
つまり、「っ」「ー」「㌍」といったグリフは縦書き用のものに変えないといけません。

例えば、「。→︒」「、→︑」というように異なるグリフを使う必要があります。
(ここではUnicodeのVertical Formsというコードブロックの文字を表示させています)

こうした縦書きグリフへの変換を行うのが、

  • vert
  • vrt2
  • vtrt

といったタグを持つFeatureです。
縦書き字形への変換は基本的にひとつのGIDからひとつのGIDへの単純なマップになっています。

もちろんGSUBにはこうした単純な変換だけではなく、

  • 複数のGIDをひとつのGIDに集約したり
    • 例えばfiがfiのように1文字になる
      • fi: fとiを並べたもの
      • fi: fとiが一緒になった文字
    • このようなことがコードポイントの世界ではなく、グリフ描画の世界で行われる
  • 前後の文字(GID)に応じてGIDを変換したり
  • 特定の文字列(GID列)を別のGID列に変換したり

といったことができます。

GPOSテーブル

こちらは与えられたGID列がどのように配置されていくべきかといったことを教えてくれます。

これは例えば、

  • 「か」と濁点「゙」の配置
  • アルファベットの文字間隔の調整

といったことに使われます。
こちらも前後の文字に応じて適用したり、特定の文字列でのみ適用したりといったことが可能です。

morxテーブル

Apple由来のフォントで使用されています。
これはGSUBテーブルとGPOSテーブルの機能を持つAppleの闇の技術です。
私は2度ほど仕様を読んだのですが、まだ正確に理解できていません。
(ドキュメントというより実装が少なくて正しさを把握できない)

おわりに

3日に渡ってお届けしたOpenType仕様入門ですが、実際のデータがどういうものになっているのかというよりは、どういうデータがどういう目的でフォントに含まれているかということを書いてみた感じになりました。
フォントを理解するというよりはむしろ、フォントってこんなこともやってるのか、と面白く読んでもらえると良いのですが、推敲する時間もなかったのでなかなか難しい気がします。

OpenType仕様(実践編)は要望があれば書きます。

28
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
23