Help us understand the problem. What is going on with this article?

OpenTypeの仕様入門 (後編)

More than 3 years have passed since last update.

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仕様(実践編)は要望があれば書きます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away