#!/usr/bin/env perl
# Gimp.pm モジュールを組み込む
use Gimp qw(:auto);
use Gimp::Fu;
# 実際の処理を行うサブルーチン
sub fontsample {
# GUI (register 部) から入力されるパラメータを受け取る
my ($width, $height, $labelfont, $labelcolor, $samplepat, $sampletext, $samplesize, $fgcolor, $bgcolor, $merge, $save, $limit) = @_;
my $i = 0;
my $border = 2;
# xlsfonts コマンドの出力をバッファに入れる
open(FL, "xlsfonts |");
my @fontlist = <FL>;
close(FL);
foreach (@fontlist) {
# バッファの中でパターンにマッチするフォントを選ぶ
if (/$samplepat/ && $i <= $limit) {
chomp;
# フォントサイズの設定
s/--0/--$samplesize/;
# XLFD からフォントファミリー名を取得
my $samplefont = $_;
my $samplelabel = (split(/-/, $samplefont))[2];
# 新規画像を開く
my $img = gimp_image_new($width, $height, RGB);
# Background レイヤーを加える
my $layer = gimp_layer_new($img, $width, $height, RGB, "background", 100, NORMAL_MODE);
gimp_image_add_layer($img, $layer, -1);
gimp_palette_set_background($bgcolor);
gimp_edit_fill($layer);
# マッチしたフォントでイメージを描く
gimp_palette_set_foreground($fgcolor);
my $sample_layer = gimp_text_fontname($img, -1, 0, 0, " $sampletext ", $border, 1, xlfd_size($samplefont), $samplefont);
my $sample_x = $width - gimp_drawable_width($sample_layer) - 2;
my $sample_y = $height - gimp_drawable_height($sample_layer) - 2;
gimp_layer_set_offsets($sample_layer, $sample_x, $sample_y);
# フォントファミリー名をラベルとして描く
gimp_palette_set_foreground($labelcolor);
my $label_layer = gimp_text_fontname($img, -1, 0, 0, "$samplelabel", $border, 1, xlfd_size($labelfont), $labelfont);
gimp_layer_set_offsets($label_layer, 2, 2);
# ラベルに影となるレイヤーをつけ、見やすくする
my $label_layer_copy = gimp_layer_copy($label_layer, 1);
gimp_image_add_layer($img, $label_layer_copy, 1);
gimp_selection_layer_alpha($label_layer_copy);
gimp_selection_grow($img, 2);
gimp_palette_set_background($fgcolor);
gimp_edit_fill($label_layer_copy);
gimp_selection_clear($img);
# 全レイヤーを統合し、GIF イメージとしてカレントディレクトリに保存する
if ($merge || $save) {
my $merged_layer = gimp_image_merge_visible_layers($img, 1);
}
if ($save) {
gimp_convert_indexed($img, 1, MAKE_PALETTE, 256, 1, 1, "Web");
file_gif_save(RUN_NONINTERACTIVE, $img, -1, "$samplelabel.gif", "$samplelabel.gif", 1, 0, 0, 0);
}
$img[$i++] = $img;
}
}
# 作成した全画像を表示して終了
return @img;
}
# GIMP にこのプラグインについての情報を与え、パラメータ変更用の GUI を生成する
register
"fontsample_m", # プラグイン名(プラグインの識別子となるので unique なものに)
"font sample image", # 簡単な説明
"Create a sample image of the font", # 詳しい説明
"shackon", # 自分の名前
"shackon (c)", # copyright
"2000-04-12", # 作成した日付
# GIMP メニュー中の場所
# (このプラグインは新規画像を作るので Xtns の下に置き、他のプラグインと重ならない unique な名前を指定)
"<Toolbox>/Xtns/Perl-Fu/Font Sample Multi",
"*", # 適応する画像の種類
[ # パラメータのリスト(この情報を元に、プラグインを呼び出したときの GUI ダイアログが作られる)
[PF_INT, "width", "Image width", 150],
[PF_INT, "height", "Image height", 40],
# フォントファミリー名を描くのに使うフォント名と色
[PF_FONT, "labelfont", "Label font", "-adobe-helvetica-bold-r-normal--14-*-*-*-p-*-iso8859-1"],
[PF_COLOR, "labelcolor", "Label font color", [255,255,255]],
# xlsfonts の出力から grep するフォント名の文字列パターン(Perl の正規表現OK)
[PF_STRING, "samplepat", "Perl regexp pattern of sample font XLFD", "maniax.*fm_"],
# フォントを使用して描く文字列
# (なんちゃってカナフォントの場合、ここに「hj]d」と書けば「クマムシ」などとレンダリングされる)
[PF_STRING, "sampletext", "Sample text", "Hoge"],
[PF_INT, "samplesize", "Sample font size", "30"],
[PF_COLOR, "fgcolor", "FG color", [24,178,24]],
[PF_COLOR, "bgcolor", "BG color", [0,0,0]],
# できあがった画像のレイヤーを結合するかどうか(save の場合プラグインが自動的に on にする)
[PF_TOGGLE, "merge", "Merge visible layers", 1],
# できあがった画像を自動で保存するか、表示するだけにするか
[PF_TOGGLE, "save", "Save files", 0],
# xlsfonts の出力が limit を超えたらやめる
[PF_INT, "limit", "Lample number of fonts", "100"]
],
# サブルーチンを呼ぶ(名前を最初に上で作ったサブルーチン名に合わせる)
\&fontsample;
exit main();