フォントとたわむれちゅう、ゆぅです。
フォントデータをいじって遊んでます。
今回は、フォントの"a"と"b"を入れ替えてみました。
文字には、それぞれ、グリフIDが振られて、
文字コードからグリフIDを判別して文字を確定します。
で、グリフIDからその形状を定義するデータを
読み込んでフォントを表示しています。
今回、この対応するグリフIDに対応するデータを入れ替えてみたら、
どうなるかなーっていう実験です。
まず、文字コードから、グリフIDを調べようと思います。
見るテーブルはcmapテーブル。
cmapテーブルは、
バージョン(2Byte)、定義テーブル数(2Byte)、定義テーブル(8byte x テーブル)
で、その定義テーブル(8byte)は、
プラットフォームID(2byte)、エンコーディングID(2byte)、データオフセット(4byte)
です。
その定義テーブルのデータ本体は、cmapテーブル内のデータオフセット位置から
読み始めます。
で、その最初の2byteが読みかたを表すフォーマット値、次の2byteがデータの長さ、
あとは、それぞれのフォーマットに応じたデータ定義になっています。
こっからさきは、ちょっとわからないとこが多かったのですが、
とりあえず、フォーマット0のテーブルに、グリフIDが文字コードの順に並んでる配列があるので、
そこから、グリフIDを判別できるようです。
ちなみに、"a"(0x61)はグリフID=68、"b"(0x62)はグリフID=69
になっていました。
で、今度は、グリフIDから、実際のデータの場所を調べます。
見るテーブルは、"loca"テーブル。
このテーブルは、"glyf"テーブルと連動していて、"loca"テーブルには、
"glyf"テーブル内のデータ位置を、グリフID順に並んでいます。
なので、locaテーブルの68番目と69番目の値が、
glyfテーブル内の、"a"と"b"の形状データになります。
ここまでわかれば、いよいよ、入れ替えです!
このlocaテーブルの68番目と69番目を入れ替えて、
フォントファイルを作り直してみました。
で、フォントを組み込み!ってやってみたら、、、
アラートがでました。
強引に入れ替えただけなんで、不都合があるみたい。
でも、クラッシュしてもしらないですよ!って感じのアラートが出て、
ちゃんとインストールできました。
で。プレビューがこんな感じ!
!!
"a"と"b"が入れ替わってますねー!
実際に使ってみようと思います。
こんな感じのHTMLを書いてみました。
このフォントは、普通のフォント(入れ替わってない)です。
さて、結果はどうなるでしょうか?
これが結果です!
??わかりにくいですかね?
HTML上は"aaaaabbbbb"ですが、表示上は"bbbbbaaaaa"となっていて、
ブラウザは"a"だと思って"b"が表示されている、ってことです。
以上、入れ替えて遊んでみたでした。



