toge's diary

コンピュータ関連の趣味をつらつらと。

Cairoのお勉強

id:propella:20080215:p3 をみて刺激を受けてちろっとCairoを使ってみることにする。
やっぱり綺麗なグラフィックをかけるようにはなっておきたい。

残念ながら掲載されているコードではアルファ値が有効にならなくてアンチエイリアスが無効になっちゃっているので、ちょっとコードを変えてみた。ついでにC99にしちゃったり、イベントループを入れてしまったり・・・。

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

void draw(unsigned char *pixels, int width, int height, int stride)
{
  cairo_surface_t* surface = cairo_image_surface_create_for_data(pixels,
                                CAIRO_FORMAT_ARGB32, width, height, stride);
  cairo_t *cr = cairo_create(surface);
  
  cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL,
                         CAIRO_FONT_WEIGHT_BOLD);

  cairo_set_font_size(cr, 164.0);
  cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
  cairo_move_to(cr, 10.0, 250.0);
  cairo_show_text(cr, "Hello, world");

  cairo_destroy(cr);
  cairo_surface_destroy(surface);
}

int main(int argc, char *argv[])
{
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, 0);
  SDL_Surface *src = SDL_CreateRGBSurface(SDL_SWSURFACE, 640, 480, 32,
                                          0xFF0000, 0xFF00, 0xFF, 0xFF000000);

  while (true)
  {
    /* イベントの処理 */
    SDL_Event event;
    while (SDL_PollEvent(&event))
    {
      if (event.type == SDL_QUIT ||
          (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE))
          goto END;
    }

    SDL_FillRect(src, NULL, 0x0);
    draw((unsigned char*)src->pixels, screen->w, screen->h, screen->pitch);
    SDL_BlitSurface(src, NULL, screen, NULL);
    SDL_Flip(screen);

    SDL_Delay(30);
  }

END:
  SDL_Quit();
  return(0);
}

案の定main関数が長くなってしまい、失敗感が漂う。