日記帳

日記です。

cairo graphics library

cairo をというライブラリを使ってみました.

cairo は様々なバックエンド上に2Dベクターグラフィックスを描画するAPIを提供してくれます.cairo がサポートしているバックエンドは以下の通りです.

  • Image Surfaces - Rendering to memory buffers
  • Glitz Surfaces - OpenGL accelerated rendering using the Glitz library
  • PDF Surfaces - Rendering PDF documents
  • PostScript Surfaces - Rendering PostScript documents
  • Win32 Surfaces - Microsoft Windows surface support
  • XLib Surfaces - X Window System rendering using XLib

応用例としてはいまのところ以下のものくらいでしょうか?

このライブラリを以前から試してみようと思いつつ今一つ気が乗らず放置していました.理由は cairo 自体が Window の初期化やイベント処理などのAPIを持たない,純粋なグラフィックス描画のための API であり,Win32 API や Xlib,GTK+といったOS依存のライブラリと組合せて使うものだからです.マルチプラットホーム大好きっことしてはOS依存のコードが入るかと思うとモチベーションが下ってしまうのですね…

最初の一歩

とりあえず Window を表示するのは X や Win32 の初期化が必要になって面倒なのでオンメモリに描画して PNG ファイルに保存するサンプルを動かします.
http://cairographics.org/FAQ の Getting Started の項目の例を参考にして以下のようなコードを書いてみました.

hw.c

#include <cairo.h>
int
main (int argc, char *argv[])
{
	cairo_surface_t *surface;
	cairo_t *cr;

	surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 300, 200);
	cr = cairo_create (surface);

	cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0);
	cairo_rectangle(cr, 0, 0, 300, 200);
	cairo_fill(cr);

	cairo_select_font_face (cr, "Serif", CAIRO_FONT_SLANT_NORMAL,
		CAIRO_FONT_WEIGHT_BOLD);
	cairo_set_font_size (cr, 32.0);
	cairo_set_source_rgba (cr, 0.0, 0.3, 1.0, 1.0);
	cairo_move_to (cr, 10.0, 50.0);
	cairo_show_text (cr, "Hello World");
	cairo_move_to (cr, 10.0, 100.0);
	cairo_show_text (cr, "こんにちは世界");

	cairo_destroy (cr);
	cairo_surface_write_to_png (surface, "hw.png");
	cairo_surface_destroy (surface);

	return 0;
}

ファイルのエンコーディングをUTF8にして保存.コンパイルは以下の通り.

% gcc -o hw hw.c `pkg-config --cflags --libs cairo`

実行すると hw.png というファイルが生成されてちゃんと日本語文字列も描画されています.