[RMagick]RMagick のフォント指定

RMagick の RVG(ベクターグラフィックス)を使って描画を試していたが、フォントファイルを絶対パスで指定するところでつまづいてしまった。

やりたいことは以下のようなことだ。

require 'rvg/rvg'
include Magick

RVG::dpi = 200
rvg = RVG.new(2.00.in, 3.00.in).viewbox(0, 0, 200, 300) do |canvas|
  canvas.text(10, 20, "Hello World").styles(:font=>"/myfont_dir/font1.ttf", :font_size => 12)
end

上のコードを実行すると、

Magick::ImageMagickError: Non-conforming drawing primitive definition `.'

という意味不明なエラーメッセージが表示される。

いろいろ調べたところ、結論から言うとこれは RMagick のバグである。 (私の RMagick は v 1.51 であった)
オープンクラスを使って RMagick のコードを修正してやれば OK。フォントを使うまえに、以下のコードを実行する。

module Magick
  class Draw
    # Specify text drawing font
    def font(name)
      primitive "font '#{name}'"
    end
  end
end

オリジナルでは、primitive "font #{name}" となっていた。やれやれ。引用記号がなかったために、引数がコマンドの展開の影響を受けてしまい、エラーとなっていた模様である。