DXRuby外部拡張インターフェース

まあ、自分用なわけだが。
DXRubyFramework用にWindow.draw系のインターフェースを一通り作ってみた。
これについてはrb_float_new()を呼ばなくていいというぐらいの意味しかない。
ほんとは内部構造まで公開して、それを直接いじれれば一番速いのだが、それをすると内部構造の変更があった場合に痛いことになるから、ある程度隠蔽しておいたほうがよい。


ついでに、Imageクラスのテクスチャを操作するための、DXRuby_lockとDXRuby_unlockを定義してみた。
このように使う。

static VALUE PP_draw( VALUE klass, VALUE obj )
{
    int x, y, width, height, pitch;
    char *address;
    void *handle;

    handle = DXRuby_lock( obj, &address, &pitch, &width, &height );
    for( y = 0; y < height; y++ )
    {
        for( x = 0; x < width; x++ )
        {
            *((int*)(address + x * 4 + y * pitch)) = 0xffffffff;
        }
    }
    DXRuby_unlock( handle );

    return obj;
}

この関数は、渡したImageオブジェクトを白で塗りつぶす。
関数名のPPはperspectiveの略。
さっき思いついた話なのだが、StarRubyの透視座標変換メソッドrender_in_perspectiveをコピペして修正したらDXRubyでも透視座標変換ができるんじゃないかなーみたいな。
さすがにDXRuby本体に組み込むつもりはないが、こういうDXRuby拡張ライブラリの可能性確認みたいな形で作ってみるのはアリかもしれない、と思ったわけだ。
作ったところで公開するかどうかはまた別の問題だが。
なんせImageオブジェクトが自由にCの拡張ライブラリからいじれるのなら、可能性は大きく広がる。
もちろん、範囲外をアクセスしたら遠慮なくコケる(最悪PCが固まる)ので、使う場合は十分気をつけること。