2009年02月24日

SDLでちょっくら強引にxlibで文字を表示させる。

SDLで文字を書く場合、普通はSDL_ttfを使うか
何らかの方法で画像ファイルにする方法が効率的だろうが
ximの対応やシンプルな文字描画の選択肢が欲しい。

SDLのヘッダーをgrepでxlib関連の単語で探索していたら
ちょっと使えそうなヘッダーを見つけた。
SDL_syswm.hだ。
これを使うことでSDLで初期化した画面のwindowとdisplayを取得することができる。
まさにSDL版のhello worldといえる。
X11版のSDL_SysWMinfoはこう定義されている。

typedef struct SDL_SysWMinfo {
SDL_version version;
SDL_SYSWM_TYPE subsystem;
union {
struct {
Display *display; /* The X11 display */
Window window; /* The X11 display window */
/* These locking functions should be called around
any X11 functions using the display variable,
but not the gfxdisplay variable.
They lock the event thread, so should not be
called around event functions or from event filters.
*/
void (*lock_func)(void);
void (*unlock_func)(void);

/* Introduced in SDL 1.0.2 */
Window fswindow; /* The X11 fullscreen window */
Window wmwindow; /* The X11 managed input window */

/* Introduced in SDL 1.2.12 */
Display *gfxdisplay; /* The X11 display to which rendering is done */
} x11;
} info;
} SDL_SysWMinfo;



SDL_SysWMinfoを取り出す関数として

int SDL CALL SDL_GetWMInfo(SDL_SysWMinfo *info);

が用意されている。

lockとunlockの使いどころが微妙だが子Windowを初期化して外部プロセスに渡すとき等は必要かもしれない。

window,fswindow,wmwindowの意味がよく分かっていないが
Windowの取得などはwindowを使い
確認した範囲では

XMoveWindow( dpy, sdl_info.info.x11.wmwindow, 100, 50 );


でWindowを動かすことが出来、ここを
sdl_info.info.x11.window 
にすると画面内での描画エリアの移動となった。

xlibでの描画はいわゆるフロントバッファになるわけで
全画面をSDL_Flip を使うとちらつくので
SDL_Rectを作って描画し
SDL_UpdateRectsを使って文字描画エリアを避けるのが良い様だ。
外部プログラムに渡す場合は子Windowを作る手もある。

日本語描画についてはjiskan24.pcf.gzがX11にもれなくついてくるので
これを基準にプログラムを作れば良いと感じた。

イベントについては子Windowを作った場合xlib側には処理させない方が良いと思うが
その場合再描画イベントではなくて定間隔の強制描画になり
その場合bitmapフォントをアプリ側が管理する方法とどちらが良いか微妙に感じる。

ちなみに今回 -lX11を省いてもビルドできた。
どうも-lSDLの方からlX11にリンクしている様だ。
ラベル:SDL xlib
posted by Xo_ox at 21:46| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。