それ Font::TTF でできたよ

TTF フォントから EBDT / EBLC を削除するプログラムを昨日作成しましたが,CPAN をみたら,Font::TTF なるモジュールがありました。うんうん,FreeType じゃなくてこういうコンセプトのものがほしかったんです。

とりあえず,そのまま読んで書いてみると,

use Font::TTF::Font;

my $font = Font::TTF::Font->open($ARGV[0]);
$font->out($ARGV[1]);

なぜかファイルサイズが半分以下に。もしや?と思って開いてみたら,見事に EBDT 等が削除されてました。

これはこれで目的達成できたんだけど,EBDT 等を温存したい場合は?

my $font = Font::TTF::Font->open($ARGV[0]);
$font->{$_}->read
    for (qw( EBDT EBLC ));
$font->out($ARGV[1]);

こんな感じですかね?と,出力してみたら延々時間がかかった上に,ファイルサイズが増えてしまいました。たぶん EBDT の再利用に対応してないんだろうな。

で出力結果をみてみたら,超汚いビットマップになってしまいました。たとえて言うと Java コンパネのフォントのような昔の XTF のような… Font::TTF が gasp に対応してないのが理由なのかしらん。でもビットマップでヒンティングとか関係ないですよねたぶん…

ちなみに,サンプル通りに

$font->tables_do(sub { $_[0]->read; });

で全テーブル強制読み込みしても同じ結果でした。よろしくない。

日本語フォントだと読み込みにすごく時間がかかりますし,まだ有用じゃないかなと思います。