フォントの品質

久しぶりの更新。

なんと表現すればいいのか、とりあえずノベルゲームにも使えるエンジン(?)を開発しているかたからDXRubyのフォント描画品質向上のリクエストを頂いた。
こちらの土屋つかささん。
http://d.hatena.ne.jp/t_tutiya/

使っているのがDXRubyスターターキット1.0.8のRuby1.8.7版ということで、Image#drawFontはWin32APIで直書きになっているため、品質は確かに悪い。
DXRuby1.2.0ならフォントのビットマップを取得して合成するから綺麗になるはずだが、DXRuby1.2.0はRuby1.8用にコンパイルしてないので使えない。
リクエストは単純に品質だけではなく、袋文字や影、アンチエイリアスのON/OFFなどで、高品質な描画を実現するにはRubyだけでは速度的に厳しく、やはりDXRuby側で対応する必要がありそうだ。

つーことでとりあえず袋文字の機能を追加してみた。
互換性を取る必要があるから、追加機能を扱うためのハッシュ引数を取るImage#drawFontExを新規追加して、エッジの太さ、強さ、色を指定できるようにした。
文字の色は省略してあるが省略すると白になる(前から)。エッジの色は省略すると黒になるが、例として入れてある。

#!ruby -Ks
require 'dxruby'

Window.width = 400
Window.height = 320
Window.magFilter = TEXF_POINT

font = Font.new(32,"MS 明朝",:weight=>800)
image = Image.new(100,100,[0,255,0])
image.drawFontEx(0,0,"掃除",font,{:edge_width => 2, :edge_level => 4, :edge_color => [0,0,0]})

Window.loop do
  Window.drawScale(0,0,image,5,5,0,0)
  Window.draw(0,200,image)
end

袋文字は見た目に大きく影響するから、エッジの太さや強さは固定じゃなく可変にして、使う人に試行錯誤してもらうのがいいだろう。フォントの太さもちょっといじるとよい。気に入るまで。どこまでも。

これを1.2.1devとして公開するのはアリだけど、リクエストくれた人がスターターキットなのでそれだけでは使ってもらえない。
うちの環境だとなぜかスターターキット動かすとPCがブルースクリーンでコケる(たぶんAvast!のせい)ので作って公開というのも難しい。確認なしで公開していいならできるけど。
とりあえず残りの機能を実装しながら考えることにする。