2013/07/05(金) [n年前の日記]
#1 [ruby] bdfフォントをbmpに変換
DXRubyでビットマップフォントを描画するために、フリーのbdfフォントをbmpに変換しようと試みたり。
_bdf2bmp というツールを使わせてもらって変換してみたのだけど。JISの区点コードとやらの並びにしたかったものの、件のツールでは空いてる部分を全部詰めてしまうわけで。
Ruby/SDLを使えばbdfフォントを読み込めるらしいと知り、Surfaceに描画してbmp保存するスクリプトを試しに書いてみたり。
_bdf2bmp というツールを使わせてもらって変換してみたのだけど。JISの区点コードとやらの並びにしたかったものの、件のツールでは空いてる部分を全部詰めてしまうわけで。
Ruby/SDLを使えばbdfフォントを読み込めるらしいと知り、Surfaceに描画してbmp保存するスクリプトを試しに書いてみたり。
#!ruby -Ks # -*- mode: ruby; encoding: sjis -*- # Last updated: <2013/07/08 15:09:50 +0900> # # BDFフォントを読み込んで描画してみるテスト # # * Ruby/SDLを使用 # * Sキーで画像として保存 # * ESCで終了 # # * ASCII部分は bdf2bmp で出力したほうがいいかもしれない。 # bdf2bmp -s0 -c16 hoge.bdf hoge.bmp とか。 require 'sdl' # 描画するフォント種類 fontkind = 0 FG_KANJI = true FG_ASCII = false # BDFフォントファイル名, bmp保存ファイル名, フォント横幅, 縦幅, 漢字か否か fname_list = [ ['res/mplus_j10r.bdf', 'mplus_j10r.bmp', 10, 11, FG_KANJI], ['res/shnmk12.bdf', 'shnmk12.bmp', 12, 12, FG_KANJI], ['res/shnm6x12r.bdf', 'shnm6x12r.bmp', 6, 12, FG_ASCII], ] # 半角カナを出力するか否か hankana_on = true bdf_fname, save_fname, fw, fh, kanji = fname_list[fontkind] if kanji x_num, y_num = 94, 94 else x_num, y_num = 16, 16 end fimgw = fw * x_num fimgh = fh * y_num scrw, scrh = 640, 480 SDL.init( SDL::INIT_VIDEO ) screen = SDL.setVideoMode( scrw, scrh, 16, SDL::SWSURFACE ) # フォントを描画するSurfaceを生成 fontimg = SDL::Surface.new(SDL::SWSURFACE, fimgw, fimgh, 16, 0, 0, 0, 0) jis_enable = false # BDFフォント読み込み font = SDL::Kanji.open(bdf_fname, fh) # エンコーディングを指定 unless jis_enable # SJIS font.set_coding_system(SDL::Kanji::SJIS) else # JIS font.set_coding_system(SDL::Kanji::JIS) end # 描画する文字をリストアップ codelist = [] if kanji # 漢字 unless jis_enable # SJIS for u in 0x81..0x9f do for l in 0x40..0xfc do next if l == 0x7f code = (u << 8) + l s = sprintf("%c", code) codelist.push(s) end end for u in 0xe0..0xef do for l in 0x40..0xfc do next if l == 0x7f code = (u << 8) + l s = sprintf("%c", code) codelist.push(s) end end else #JIS (上手くいかない…) for u in 0x21..0x7e do for l in 0x21..0x7e do code = [u, l] s = code.pack("C*") codelist.push(s) end end end else # ASCII for u in 0x00..0x7f codelist.push(u.chr) end if hankana_on # 半角カナも出力 for u in 0x80..0xff if 0xa1 <= u and u <= 0xdf codelist.push(u.chr) else codelist.push(' ') end end end end # Surfaceにフォントを描画 codelist.each_with_index do |s, i| x = (i % x_num) * fw y = (i / y_num) * fh font.put(fontimg, s, x, y, 255, 255, 255) end interval = 1.0 / 60 save_fg = false dispx, dispy = 0, 0 # メインループ loop do loop_start = SDL.getTicks / 1000.0 while event = SDL::Event2.poll case event when SDL::Event2::Quit exit when SDL::Event2::KeyDown if event.sym == SDL::Key::S # Surfaceを画像として保存 unless save_fg fontimg.saveBMP(save_fname) save_fg = true end elsif event.sym == SDL::Key::ESCAPE exit end end end # マウスカーソル座標の位置に応じてスクロール mx, my, lb, mb, rb = SDL::Mouse.state spd = 0.3 if mx < scrw * 0.3 dispx += ((scrw * 0.3) - mx) * spd if dispx > 0 dispx = 0 end end if mx > scrw * 0.7 dispx -= (mx - (scrw * 0.7)) * spd fiw = fimgw - scrw if dispx < -fiw dispx = -fiw end end if my < scrh * 0.3 dispy += ((scrh * 0.3) - my) * spd if dispy > 0 dispy = 0 end end if my > scrh * 0.7 dispy -= (my - (scrh * 0.7)) * spd fih = fimgh - scrh if dispy < -fih dispy = -fih end end # 描画 screen.fillRect( 0, 0, scrw, scrh, [ 0, 0, 0 ] ) screen.put(fontimg, dispx, dispy) screen.updateRect( 0, 0, 0, 0 ) loop_end = SDL.getTicks / 1000.0 if loop_end - loop_start < interval sleep interval - (loop_end - loop_start) end end
[ ツッコむ ]
#2 [ruby] Ruby/SDLのインストールはどれが正解なんだろう
環境は、Windows7 x64 + ruby 1.9.3p429 (2013-05-15) [i386-mingw32]。
rubysdl-2.1.1.1-mswin32-1.9.1-p243.zip をDL・解凍して、ruby install_rubysdl.rb を実行する方法が公式のソレっぽいのだけど。gem search -r rubysdl と打ってみたら、
rubysdl-2.1.1.1-mswin32-1.9.1-p243.zip をDL・解凍して、ruby install_rubysdl.rb を実行する方法が公式のソレっぽいのだけど。gem search -r rubysdl と打ってみたら、
>gem search -r rubysdl *** REMOTE GEMS *** rubysdl (2.1.2) rubysdl-mswin32-1.8 (2.1.1.1) rubysdl-mswin32-1.9 (2.1.1.1)と出てきたので、
gem install rubysdl-mswin32-1.9でインストールしてしまったけど。これで正解なんだろうか…?
[ ツッコむ ]
以上、1 日分です。