カドの丸いbox

最近Nexus7を買ったのでAndroidの勉強をしているわけだが、その中でカドの丸い四角の描画というのを見て、DXRubyで実現してみようと思った。
C側で書くならImage#circleのロジックとimage#boxのロジックをごちゃっと混ぜればできそうだが、よく考えたら今のDXRubyでもRubyで書いてできそうなのでやってみた。

ようするにImageを生成して円を描画して、それを4分割してカドに描画しているだけだ。

require 'dxruby'

class Image
  def roundbox(x1, y1, x2, y2, r, c)
    image = Image.new(r * 2, r * 2).circle(r, r, r, c)
    self.draw(0, 0, image, 0, 0, r, r)
    self.draw(self.width - r, 0, image, r, 0, r, r)
    self.draw(0, self.height - r, image, 0, r, r, r)
    self.draw(self.width - r, self.height - r, image, r, r, r, r)
    self.line(r, 0, self.width - r, 0, c)
    self.line(self.width - 1, r, self.width - 1, self.height - r, c)
    self.line(self.width - r, self.height - 1, r, self.height - 1, c)
    self.line(0, r, 0, self.height - r, c)
  end

  def roundbox_fill(x1, y1, x2, y2, r, c)
    image = Image.new(r * 2, r * 2).circle_fill(r, r, r, c)
    self.draw(0, 0, image, 0, 0, r, r)
    self.draw(self.width - r, 0, image, r, 0, r, r)
    self.draw(0, self.height - r, image, 0, r, r, r)
    self.draw(self.width - r, self.height - r, image, r, r, r, r)
    self.box_fill(r, 0, self.width - r, self.height - 1, c)
    self.box_fill(0, r, self.width - 1, self.height - r, c)
  end
end

image = Image.new(100,100).roundbox_fill(0, 0, 99, 99, 10, C_WHITE).
                           roundbox(0, 0, 99, 99, 10, C_GREEN)

Window.loop do
  Window.draw(10,10,image)
end