mieki256's diary



2013/07/05(金) [n年前の日記]

#1 [ruby] bdfフォントをbmpに変換

DXRubyでビットマップフォントを描画するために、フリーのbdfフォントをbmpに変換しようと試みたり。

_bdf2bmp というツールを使わせてもらって変換してみたのだけど。JISの区点コードとやらの並びにしたかったものの、件のツールでは空いてる部分を全部詰めてしまうわけで。

Ruby/SDLを使えばbdfフォントを読み込めるらしいと知り、Surfaceに描画してbmp保存するスクリプトを試しに書いてみたり。

ScreenShot

#!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 と打ってみたら、
>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 日分です。

過去ログ表示

Prev - 2013/07 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project