言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

MinGW と一緒に SDL

わざわざ cairo の事を書いたのは SDL を試したいがためでした。だって SDL って単体じゃ文字さえ表示出来なくて面白みが無いから。

環境作成

素直にソースからコンパイルします。

wget http://www.libsdl.org/release/SDL-1.2.13.tar.gz
cd SDL-1.2.13
./configure
make
make install

# ここまでで /usr/local/include 以下にインストールされる。

cd test
./configure
make

# で、サンプルがコンパイルされる。

サンプルはそれなりにどれも難しいので、もっと簡単な Hello World を作ってみる。イベント処理もせずタイマーでしばらくすると勝手に消える。draw() の部分はさっきの cairo のプログラムと殆ど同じで、SDL_SetVideoMode で作ったメモリをそのまま cairo_image_surface_create_for_data に渡している。http://cairographics.org/SDL/SDLClock.c にあるサンプルを見ると、ARGB の順番を明示的に渡したり凝った事してるのだが、何も考えずに同じメモリに描くだけで動くのかな?まあ良いか。

#include <cairo.h>
#include <SDL.h>

void draw(unsigned char *pixels, int width, int height, int stride)
{
  cairo_surface_t *surface;
  cairo_t *cr;

  surface = cairo_image_surface_create_for_data(pixels, CAIRO_FORMAT_ARGB32, width, height, stride);
  cr = cairo_create(surface);
  
  cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
  cairo_set_font_size(cr, 64.0);
  cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  cairo_move_to(cr, 10.0, 50.0);
  cairo_show_text(cr, "Hello, world");
  cairo_destroy(cr);
  cairo_surface_destroy(surface);

}

int main(int argc, char *argv[])
{
  SDL_Surface *screen;
  SDL_Init(SDL_INIT_VIDEO);
  screen = SDL_SetVideoMode(640, 480, 32, 0);

  draw(screen->pixels, screen->w, screen->h, screen->pitch);
  SDL_Flip(screen);
  
  SDL_Delay(1000);
  SDL_Quit();
  return(0);
}

コンパイル

gcc -o hello hello.c $(sdl-config --cflags --libs) $(pkg-config --cflags --libs cairo)

です。sdl-config は pkg-config と同じようなコマンドで、ライブラリの位置を教えてくれます。例によってソースが先です。