フォントを入れ替えてみる

テーマ:

フォントとたわむれちゅう、ゆぅです。

 

フォントデータをいじって遊んでます。

 

今回は、フォントの"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"が表示されている、ってことです。

 

 

以上、入れ替えて遊んでみたでした。