blaライブラリのメモ

  • (by K, 2018.05.07)

(0)

  • blaライブラリは、Basic-Likeライブラリのadvanceバージョンのこと。現バージョンはWindows用とMacOS用のみ。
  • 初心者向けの使いやすさよりも、ウィンドウを複数持つ仕組みの方に力点を置いている。
  • とりあえずライブラリとしては最大16個のウィンドウを管理できる。
  • bla.cを修正すればもっと増やせる。
  • 作者は川合。ライセンスはKL-01。
  • Essenではグラフィックを簡単に扱えるようにしたいので、blaライブラリを使う。
  • あとEssenはマルチウィンドウ環境にしたい。メインウィンドウで実行して、サブウィンドウにはプロンプトがあり、そこで動作中のプログラムの変数のprintなどができるとか。

(1)

  • #include "bla.h"して使う。
  • もしくは#include "bla_easy.h"して使うこともできる。この場合、関数名の頭についている「bla_」を省略できるようになる。
    • Windows版の場合、リンク時は-lgdi32が必要。
    • MacOS版の場合、
      cc -x objective-c -m32 -framework Cocoa -o kp0012 kp0012.c bla.c
    • みたいな感じでコンパイルすることを想定。


  • ダイジェスト(bla_を略して書いています)
    関数名機能
    openWin(xsiz, ysiz, title)ウィンドウを開く
    flushAll(win)描画命令で描いた絵を画面に反映させる
    end()プログラムを終了する
    setPixEx(win, x, y, c)点を打つ
    fillRectEx(win, sx, sy, x0, y0, c)塗りつぶした長方形を描く
    drawRectEx(win, sx, sy, x0, y0, c)枠だけの長方形を描く
    fillOvalEx(win, sx, sy, x0, y0, c)塗りつぶした楕円を描く(正円も可能)
    drawOvalEx(win, sx, sy, x0, y0, c)枠だけの楕円を描く(正円も可能)
    drawStrEx(win, x0, y0, c, b, str)文字列を描画する
    drawLineEx(win, x0, y0, x1, y1, c)直線を描く
    fillEx(win, x, y, c)色を塗る
    waitEx(msec)ミリ秒待つ
  • 特に問題がなければこのExのついているほうを使うのがおすすめです。気を利かせていろいろやってくれます。動作も安全です。つかないほうが動作は速いのですが、ほとんどのケースでは体感できないでしょう。


  • bla_openWin(xsiz, ysiz, title)
    • xsiz, ysizはウィンドウの描画可能域のサイズ。titleは文字列。
    • titleについては、呼び出し時に内部ワークエリアへタイトルをコピーするので、呼び出し後に文字列が破壊されても問題ない。
    • [返値] bla_Window * 型のハンドルを返す。リソース不足によりウィンドウのオープンが失敗した時は、NULLを返す。
    • なおこの関数によって開かれたウィンドウは、アプリがCtrl-Cなどで強制終了した場合や単にexitなどで終了した場合のどちらでも、勝手に閉じられてリソースをOSに返す。つまりウィンドウを消したくなければアプリは終了してはいけない。
    • なお、ユーザがウィンドウを勝手に閉じてしまう場合はありうる。その場合、win->phase==2になるので、それを検出して対処することはできる。この場合リソースはまだ解放されていないので、closeWinする必要がある(もしくはアプリを終了してしまえばリソースは解放される)。
  • bla_closeWin(win)
    • ウィンドウを閉じる。リソースも解放される。
    • [返値] この関数はvoidなので何も返さない。
  • bla_exit(code)
    • codeはint。アプリを終了する。
    • この関数で終了すると、最も互換性の問題が少ないはず。
    • [返値] この関数はそもそも帰ってこない。
  • bla_flushAll(win)
    • winはハンドル。描画バッファの内容を確実に画面に反映させる。
    • [返値] この関数はvoidなので何も返さない。
  • bla_leapFlushAll(win, t)
    • tはミリ秒。描画バッファの内容を過負荷にならない頻度で画面に反映させる。
    • 過負荷になるかどうかは、前回の反映からどのくらいの時間が経っているかで判定する。
    • 具体的には、前回描画時刻からtミリ秒以上経っていればflushAllする。
    • t=0の場合は、無条件にflushAllする。
    • ループの中でflushする場合とかに使える。
    • [返値] この関数はvoidなので何も返さない。
  • bla_end()
    • アプリケーションを終了するが、もしまだ閉じていないウィンドウがあればそれをflushして、ユーザによって閉じられるのを待つ。ウィンドウが全部閉じられたらbla_exit(0);する。
  • bla_wait(msec)
    • ミリ秒単位のwait。WindowsならSleep関数を使えばいいのだけど、それだと他のOSに移植するときに困難になるので、blaがラッピング関数を提供している。
    • [返値] この関数はvoidなので何も返さない。
  • bla_rgb(r, g, b)
    • 256階調のRGB値から色番号を生成する。これは単に使いやすくするための便利ツールであり、OS依存を解消するためのものではない。RRGGBBになる。
    • [返値] intで色番号を返す。
  • bla_setPix(win, x, y, c)
    • ウィンドウの描画域内の1画素の色を設定する。xやyに画面外の値を設定しないことを想定しているので注意(blaは上級者向けなので、安全よりも速度を優先している)。
    • [返値] この関数はvoidなので何も返さない。
  • bla_setPixEx(win, x, y, c)
    • ウィンドウの描画域内の1画素の色を設定する。こちらではxやyが画面外になるかもしれないことを想定しているし、setMode()で指定した描画アルゴリズムを反映する。またcが-1であれば透明色指定だと判断して描画しない。
    • つまり速度は落ちるが多機能である。
    • [返値] この関数はvoidなので何も返さない。
  • bla_fillRect(win, sx, sy, x0, y0, c)
    • ウィンドウの中に塗りつぶした長方形を描画する。sxとsyは描画したい長方形のサイズ、x0とy0は長方形の位置(長方形の左上の座標)。
    • [返値] この関数はvoidなので何も返さない。
  • bla_fillRectEx(win, sx, sy, x0, y0, c)
    • 描画に際して、bla_setPixEx()を使う。したがって長方形の一部が画面外にあっても正しく描画される。
  • bla_drawRect(win, sx, sy, x0, y0, c)
  • bla_drawRectEx(win, sx, sy, x0, y0, c)
    • ウィンドウの中に枠だけの長方形を描画する。
  • bla_fillOval(win, sx, sy, x0, y0, c)
  • bla_fillOvalEx(win, sx, sy, x0, y0, c)
  • bla_drawOvalEx(win, sx, sy, x0, y0, c)
    • 円もしくは楕円をかく。引数はRectと同じで、それで仮想的な長方形を指定すると、それに内接する楕円を描画する。sxとsyを同じ値にすると楕円ではなく正円になる。
    • drawOvalはない(もはや内部の処理が複雑で、非Ex版を作っても速度は大差ないから)。
  • bla_getPix(win, x, y)
    • 指定した座標の色を返す。
    • [返値] 色番号をintで返す。
  • bla_drawStr(win, x0, y0, c, b, str)
  • bla_drawStrEx(win, x0, y0, c, b, str)
    • 文字列を描画する。cは文字色。bは背景色。bに-1を指定すれば背景色が透明になって上書きする絵を壊さずに描画できるが、そういうことをしたいときはEx版のほうを使わなければいけないので注意すること。
    • 描画の際に使われるフォントは8x16ピクセルの半角フォントで、これはblaが内部で持っているのでOS依存はないが、その代わり全角文字が一切使えないという欠点がある。
  • bla_drawLine(win, x0, y0, x1, y1, c)
  • bla_drawLineEx(win, x0, y0, x1, y1, c)
    • 直線を描画する。
  • bla_setMode(win, mode)
    • ウィンドウごとに描画モードを設定する。bla_setPixEx()が参照する。
    • modeに指定できる値は次の4種類。
      • bla_MODE_SET
      • bla_MODE_OR
      • bla_MODE_AND
      • bla_MODE_XOR
    • [返値] この関数はvoidなので何も返さない。
  • bla_fillEx(win, x, y, c)
    • 色を塗る。
    • [返値] この関数はvoidなので何も返さない。
  • bla_waitEx(msec)
    • 基本的にはミリ秒単位のwait。しかしそれ以上の機能も持っていて、待っている間にグラフィックウィンドウが閉じられた場合は、すべてのウィンドウが閉じられていないかをチェックして、もし全部閉じられてしまったらbla_end()を実行する。
    • msecを0にすることも可能で、この場合、単に「もしすべてのグラフィックウィンドウが閉じられたらbla_end()を実行する」という命令になる。
    • [返値] この関数はvoidなので何も返さない。

(2)

  • 現在blaライブラリはMacOS版もあり、つまりアプリは移植作業無しで共通化できるわけだけど、その際には注意しなければいけないことがあることが判明している。それはMacOSではどうもシステム側で多くのマクロや構造体を定義しているらしく、Windowsなら普通に使える名前が使えない。
    • 既に分かっているもの: Point, MAX
    • ちなみに私はそういう場合は、頭にaをつけてきりぬけようと思っている。anotherのaのつもり。

(3)

  • blaライブラリは、Windows/Linux/MacOS/自作OSで共通に使える2Dグラフィックのライブラリを目指しています。しかも高度な機能は提供しないで、このページに書いてある程度のものに限定しようと思っています。軽量なものが好きなんです。
  • それで、こういうクロスプラットフォームなグラフィックライブラリって、既存のものではどういうのがあるのかなーと思ったのですが、もしかしてOpenGLくらいしかないのかな?・・・いやあ、OpenGLはあまりにも大きすぎるよ・・・。ということで、私がやっているのはそれなりに意味があるんだなーと今更思いました。
  • はい、今だから言いますが、それまで既存のものを調べもせず、テキトーに作っていました(まあいつもそうなんですけどね)。どうもすみません・・・。


  • ・・・いやいや、もっといっぱいありました・・・。
    • GTK+1
    • GTK+2
    • Qt
    • Tk
    • wxWidgets
    • FLTK
  • この中でFLTKが「高速で軽量」を特徴にしていて、「hello, world」が約100KBらしい。・・・えー、100KBのどこが軽量なんだよー。じゃあblaでやってみるかー。
    #include "bla_easy.h"
    
    int main()
    {
        Window *win = openWin(160, 48, "hello");
        drawStr(win, 32, 16, 0xffffff, 0x000000, "hello, world");
        end();
    }
  • これをWindowsのMinGWでコンパイルすると.exeが11.0KB。さらにupxすれば6.5KB。100KBと比べたら15倍も違う。
  • ちなみにインベーダーゲームは7.5KB。bballは6.0KB。・・・全然小さくはないけど、OSに依存せずに書いてこれなら、まあ許してあげてもいいんじゃないかな?

こめんと欄

  • MacOS版の完成度が一定水準に達したので、近いうちにアップロードします。 -- K 2018-05-25 (金) 15:22:56

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-05-25 (金) 15:31:12 (239d)