wxWidgetsにSDLをポーティング
2005年12月12日吉里吉里3がwxWidgetsを使用するとのことなので、何かの役に立つかもしれないためwxWidgetsのWidgetとしてSDLのラッピングを始めようと思います。下、参考URL。
http://code.technoplaza.net/wx-sdl/
また、SDLのライセンスが変更されるかもしれないのも大きな理由。
http://www.libsdl.org/pipermail/sdl/2005-October/070939.html
Samさんが言うには、開発キット・もしくはOS付近(この定義が曖昧なのでちょっと微妙なんですが)にSDLを利用する場合はLGPLの再リンクの項(多分6-a項のことを言っているのだと思う)を適用せず、代替となるライセンスを提供しようと考えているそうです。
代替となるライセンスは、SDLプロジェクトのクレジットと、ライブラリの変更点を記載すれば基本的に自由に使ってよいというものにしたいと考えているようで、じぶんとしてはかなり期待しています。BSDライセンス・zlibライセンス辺りがいいんじゃないかなと思います。
SDLプロジェクトに参加している人で、これに関して不満がある人は自分にメールくれだそうです。
一応、このスレッドは今読んでいるのですが、結構な数の返信があってまだ読みきれていない状態です。
その他にも移植する理由はいくつかあるのですが
・SDLは標準ではマルチディスプレイ(ウィンドウ)をサポートしていない
・文字列関連、GUI関連が壊滅的に弱い
などが上げられます。
これらの弱点を補う上で、wxWidgetsはかなり良い線行っていると思います。
バイナリサイズは大きくなってしまいますが、デバッグ機能の充実やGUIを用いたSDLだけでは不可能な機能の追加ができ、この欠点を十二分に補うだけの価値があると思います。
ただ、気になるのは上記URLサンプルでSDL_Surfaceを
// create a bitmap from our pixel data
wxBitmap bmp(wxImage(screen->w, screen->h,
static_cast(screen->pixels), true));
このようにしてwxBitmapに変換後
// paint the screen
wxBufferedPaintDC dc(this, bmp);
として画面に反映していますが、これがどの程度の時間がかっているのか気になるところ。
それと、当たり前だがSDLの生成するウィンドウを利用しないためウィンドウ関連のイベントは標準イベント関数では受け取れないため、イベント関連はwxWidgetsのEVT_*でウィジットから受け取る必要があります。
SDLのウィンドウそのものはwxPanelを継承したwxSDLPanelで置き換えられ、ウィンドウを利用したいならwxSDLPanelを内包したフレームであるwxSDLFrameを使ってもらおうと今の所は考えています。
イベント関連は組み込み言語で呼ぶことも考えて、wxのイベントテーブルは用いずに独自のイベントキューをwxSDLPanelに内包、このキューを用いてウィンドウへ送られてくるイベントを管理。
キューの中身はIdle時に処理され、独自定義のハンドラでキャッチ。
ハンドラはwxSDLEventHandlerクラスとしてwxObjectから派生させてこれを継承して使ってもらう。
他、SDL_SurfaceはwxSDLSurfaceとしてwxObjectから派生、管理等々、色々と思いつきますが、とりあえずまずはイベント関連を何とかせねば。
http://code.technoplaza.net/wx-sdl/
また、SDLのライセンスが変更されるかもしれないのも大きな理由。
http://www.libsdl.org/pipermail/sdl/2005-October/070939.html
Samさんが言うには、開発キット・もしくはOS付近(この定義が曖昧なのでちょっと微妙なんですが)にSDLを利用する場合はLGPLの再リンクの項(多分6-a項のことを言っているのだと思う)を適用せず、代替となるライセンスを提供しようと考えているそうです。
代替となるライセンスは、SDLプロジェクトのクレジットと、ライブラリの変更点を記載すれば基本的に自由に使ってよいというものにしたいと考えているようで、じぶんとしてはかなり期待しています。BSDライセンス・zlibライセンス辺りがいいんじゃないかなと思います。
SDLプロジェクトに参加している人で、これに関して不満がある人は自分にメールくれだそうです。
一応、このスレッドは今読んでいるのですが、結構な数の返信があってまだ読みきれていない状態です。
その他にも移植する理由はいくつかあるのですが
・SDLは標準ではマルチディスプレイ(ウィンドウ)をサポートしていない
・文字列関連、GUI関連が壊滅的に弱い
などが上げられます。
これらの弱点を補う上で、wxWidgetsはかなり良い線行っていると思います。
バイナリサイズは大きくなってしまいますが、デバッグ機能の充実やGUIを用いたSDLだけでは不可能な機能の追加ができ、この欠点を十二分に補うだけの価値があると思います。
ただ、気になるのは上記URLサンプルでSDL_Surfaceを
// create a bitmap from our pixel data
wxBitmap bmp(wxImage(screen->w, screen->h,
static_cast(screen->pixels), true));
このようにしてwxBitmapに変換後
// paint the screen
wxBufferedPaintDC dc(this, bmp);
として画面に反映していますが、これがどの程度の時間がかっているのか気になるところ。
それと、当たり前だがSDLの生成するウィンドウを利用しないためウィンドウ関連のイベントは標準イベント関数では受け取れないため、イベント関連はwxWidgetsのEVT_*でウィジットから受け取る必要があります。
SDLのウィンドウそのものはwxPanelを継承したwxSDLPanelで置き換えられ、ウィンドウを利用したいならwxSDLPanelを内包したフレームであるwxSDLFrameを使ってもらおうと今の所は考えています。
イベント関連は組み込み言語で呼ぶことも考えて、wxのイベントテーブルは用いずに独自のイベントキューをwxSDLPanelに内包、このキューを用いてウィンドウへ送られてくるイベントを管理。
キューの中身はIdle時に処理され、独自定義のハンドラでキャッチ。
ハンドラはwxSDLEventHandlerクラスとしてwxObjectから派生させてこれを継承して使ってもらう。
他、SDL_SurfaceはwxSDLSurfaceとしてwxObjectから派生、管理等々、色々と思いつきますが、とりあえずまずはイベント関連を何とかせねば。
コメント