フォント TrueType 構造解析 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(fpgm)
(loca)
 
2,525行: 2,525行:
 
 
 
 
  
==== fpgm ====
+
==== fpgm ヒント系 ====
 Font '''p'''ro'''g'''ra'''m'''の略です。中身はヘッダ定義された位置から、その長さまでが1バイトで表されたフォントプログラム命令(TrueType命令とかOpenType命令、TrueType Instruction ... というワードで検索すると対象の文献にたどり着ける)。この後に記述するprepやcvtも同じような仕組みを使います。
+
 Font '''p'''ro'''g'''ra'''m'''の略です。中身はヘッダ定義された位置から、その長さまでが1バイトで表されたフォントプログラム命令(TrueType命令とかOpenType命令、TrueType Instruction ... というワードで検索すると対象の文献にたどり着ける)。多くの異なるプログラムから参照されるプログラムになっています。この後に記述するprepやグリフの中に埋め込まれるモノも同じような仕組みを使います。fpgmは関数化されたプログラムを配置するのが主な用途です。最初に関数番号がプッシュされ、関数定義されるたびにスタックからポップされていきます。関数の中でスタックにプッシュした値はポップで使い切らないと関数番号がおかしなことになります。
  
  
 工夫をすればわりといろいろなことが出来るプログラムですが、基本的にはフォントの形を微調整するのに使われることが多いです。極端な話これでフォントが使われている環境次第で動作を大きく変えるようなフォントを作ることで、その環境を調べることもできます。各アプリケーションがどういうふうにフォントを扱おうとしているかということも調べれるという感じです。意外とフォントプログラムでそういうことをやっている人がいて、感心させられました。
+
 プログラムの動作の流れは、文字を表示する前にprepに格納されたプログラムで初期化、各グリフに埋め込まれたFont Programが制御点の総数を管理しつつも、fpgmテーブルに格納された関数を番号を指定して呼び出す。各プログラムはcvtテーブルの内容に対して数値を書き出したり、読み込んだりという処理をするという流れです。
 +
 
 +
 
 +
 工夫をすればわりといろいろなことが出来るプログラムですが、基本的にはフォントの形を微調整するのに使われることが多いです。極端な話これでフォントが使われている環境次第で動作を大きく変えるようなフォントを作ることで、その環境を調べることもできます。各アプリケーションがどういうふうにフォントを扱おうとしているかということも調べれるという感じです。世界には意外とフォントプログラムでそういうことをやっている人がいて、感心させられました。
  
  
2,568行: 2,571行:
  
 
 上記サイトの管理人はtruetype命令で、回転、pixel/em、pointSize、ランダム輪郭といったことをするフォントを作ってしまっています。font programを使いこなしてる。フォントヒンティングのためにあるから、出来ないこともあるという感じのことが伺えます。すごいね。
 
 上記サイトの管理人はtruetype命令で、回転、pixel/em、pointSize、ランダム輪郭といったことをするフォントを作ってしまっています。font programを使いこなしてる。フォントヒンティングのためにあるから、出来ないこともあるという感じのことが伺えます。すごいね。
 +
 +
 
 +
 +
==== prep ヒント系 ====
 +
 '''preP'''rogramの略です。一度だけ実行されるプログラムです。fprgの命令の前に実行されるもののようです。
 +
 +
 +
 IMPACT.ttfの結果は以下とおりです。
 +
 +
 +
[[メディア:IMPACT TAG prep TebleInfo.txt|IMPACT_TAG_prep_TebleInfo.txt]]
 +
 +
 
 +
 +
==== cvt  ヒント系 ====
 +
 Control Value Table は 制御値テーブルで prep や fpgm や グリフの中のFont Programで使われる制御値をまとめたテーブルです。このテーブルは Font Programで追加・削除・編集される可能性があるため、初期値のようなものです。
 +
 +
 +
 公式では4バイトの数値となっていますが、実際は2バイトの数値のタグテーブル部で記述されたサイズの配列となっているように見えます。FontForgeも2バイトで扱っているようです。
 +
 +
 +
 2バイトで扱った場合のIMPACT.ttfの結果が以下のとおりです。
 +
 +
 +
[[メディア:IMPACT TAG cvt TebleInfo.txt|IMPACT_TAG_cvt_TebleInfo.txt]]
 +
 +
 
 +
 +
==== loca ====
 +
 glyfタグテーブルのそれぞれのGlyph ID毎のglyfタグテーブル開始位置からのOffset値を順に格納しています。次のOffset値との差分が、そのGlyph IDの長さになります。Glyph ID [0] ~ Glyph [最後のID番号-1]の数のOffsetがあります。Glyph [最後のID番号]にはこのテーブルの終端、長さとも言えるOffset番号になっていて、この番号とGlyph [最後のID番号-1]の差分で最後のIDの長さも取得できるようになっています。Offset値の記述形式となる型は16bit整数のunsigned short と 32bit整数のunsigned intの2種類があり、どちらが使われるかはheadタグテーブルのindexToLocFormat値が0なら16bit、1なら32bitとなります。
 +
 +
 +
 IMPACT.ttfの結果は以下のようになっています。
 +
 +
 +
[[メディア:IMPACT TAG loca TebleInfo.txt|IMPACT_TAG_loca_TebleInfo.txt]]
 +
 +
 
 +
 +
==== glyf ====
 +
 グリフの形状を記述した核となるテーブルがglyfタグテーブルです。glyfはGlyphのことです。以下のような構造の可変長のテーブルになっています。
  
 
 
 
 

2022年9月17日 (土) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス