わざわざ 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); }