小型TFT液晶に画像を表示するためにcairoのmrubyバインドを作りました。
環境はFreeBSD上で動いているmrubyです。以前からRabbitがバックエンドにcairoを使っているようなので、同じことができるのではないかと考えていました。
TokyoRuby会議16の前に思い出して作ってみました。現地で同じテーブルに座った方には見てもらいました。
とりあえず内容を定義します。
presarr = [["ZRouter.org", "FreeBSDを利用", "MIPS SOC", "uaのrayが始めた"],
["mruby", "軽量ruby", "小さいです", "組み込みでも利用可能"],
["組み合わせ利用", "簡単にビルド", "いろいろ拡張", "動作安定してます"]]
cairoとLCDのクラスを初期化します。
tft = BsdTft.new(1, 0, BsdTft::S6D0151)
w = 128
h = 160
tft.setsize(w, h)
tft.setreset(RST)
tft.init
c = Cairo.new(w, h)
これに描きます。LCDとcairoの座標が違うので回転させます。
c.translate(0, h)
c.rotate(-3.14/2)
タイトルは以下のようにしてます。
c.set_font_size(14)
c.font_create("/root/fonts/14x14ja.pcf")
c.set_source_rgb(0, 0, 0)
# centerling
arr = c.text_extents(pres[0])
c.move_to((h - arr[0]) / 2, 15)
c.show_text(pres[0])
タイトルと項目の区切り線はこうします。
c.set_source_rgb(0.5, 0.5, 0)
c.move_to(10, 20)
c.line_to(150, 20)
c.stroke();
項目はこうします。省略してます。
c.set_source_rgb(0, 0, 0)
c.scale(0.5, 0.5)
c.print_png(8, 60, RABBIT_PNG + "red-item.png")
if pres.size > 2
c.print_png(8, 60 + spac * 2, RABBIT_PNG + "red-item.png")
end
c.scale(2, 2)
spac = 18
c.move_to(16, 40)
c.show_text(pres[1])
if pres.size > 2
c.move_to(16, 40 + spac)
c.show_text(pres[2])
end
ウサギと亀を描きます。
c.scale(0.2, 0.2)
c.print_png(15*5+kamepos*11*5, 100*5-25, RABBIT_PNG + "mini-kame-taro.png")
c.print_png(15*5+usapos*12*5, 100*5, RABBIT_PNG + "mini-usa-taro.png")
c.print_png(5*5, 100*5+25, RABBIT_PNG + "start-flag.png")
c.print_png(145*5, 100*5+25, RABBIT_PNG + "goal-flag.png")
c.scale(5, 5)
最後に回転を戻します。
c.rotate(3.14/2)
c.translate(0, -h)
描いたものを液晶にSPIで送ります。
tft.lcdcopy(c.get_data)