Bonfire has altered it’s name to brasero.

その昔、紹介した CD/DVD 作成ツール Bonfire は名を改めて Brasero になった。正確な理由は忘れてしまったけれど、登録商標 Trademark 関連だったと思う。
で、この Brasero そろそろ新しい安定バージョン 0.5.0 がリリースされる予定のだけれども、最近 GNOME CVS に import されたので、早速 0.5.0RC (v0.4.92) 版の ja.po を更新しておいた:
メイン画面はあまり変化なし
brasero-20061015-01.png
初めて起動すると表示されるようになったダイアログ
brasero-20061015-02.png
ちょっとすっきりした書き込み設定の画面
brasero-20061015-03.png
設定画面は v0.3.x の頃に使用していた gdl ライブラリによる UI の脱着が drop out され、まぁ普通の良くも悪くもない構成になってしまった。ただ、機能の方は基本の各種 CD/DVD 作成の他に、Beagle を使ったファイルの検索や楽曲/動画/画像のプレビューなど付加的な機能は健在だけれども。
ディスクに収まらなかった時の表示
brasero-20061015-04.png
新しい機能としては Nautilus のCD 作成機能と連携できるようになり、Nautilus の方で作成しようとしているデータをそのまま Brasero のプロジェクトにすることができるようになっているけど、必要かねぇ、そんな機能。
というか、この Blog を書いている際に気が付いたのだけれど、空ディスクを認識してくれないので肝心の CD/DVD 書き込みができないよ。なんだこりゃ :(: 前のバージョンでは書き込めたのに。
あと、CD/DVD に書き込むデータを追加する度に inotify_add_watch() で監視オブジェクト watcher を追加してデータとか楽曲とかの変更を監視しているので、何か警告ばかりでまくる:

** (brasero:13913): WARNING **: ERROR creating watch for local file
file:///home/aihana/ogg/u2/the_best_of_19902000
: デバイスに空き領域がありません

Beagle やら gnome-vfs やらで watcher を追加しているんで上限 (8193) を超えてしまうのかな。

Try to upgrade Firefox 2.0rc2.

ビルド・インストールして使ってみたのだけれど、たまに描画フリーズしてしまうので v1.5.0.7 に戻した :$。でも、(Tab Mix Plus ほどではないにしろ) タブ機能が 1.5.x よりも改善されているので使いやすくなった感じがする。まぁ、ほどほどにウェブ・ブラウジングしてすぐに downgrade してしまったので、ホントのところ、あんまり良い点/悪い点は分からなかったのだけれども:
firefox-2.0rc2-20061014.png
ちなみに、epiphany-2.16.1 でも問題なく利用できた。

Cairo API document translation (almost) completed.

API リファレンスの翻訳は完了。
但し、付録の Cairo の言語バインディングの作成方法は途中まで。何か開発するのに必須の文章という訳でもないし、ちんぷんかんぷんな英文が多くて飽きてしまったのがホントのところ。もしかしたら、最後まで翻訳するかもしれないけれど、今のところは予定無し。興味のある方がいたら翻訳してみて下さい。その時は、この日本語マニュアルにマージさせてもらえると嬉しいです。
しかし、このドキュメント (というか、ソースの中にあるコメント) は誤植が多くて当惑した。特に関数名の誤記が多すぎ (関数名が間違っていると、gtkdoc-xref でクロス・リファレンスのリンクを生成できない)。この日本語版では修正してあるけれども:
See Also Cairo ベクトル・グラフィックス・ライブラリ: v1.2.4 版の API リファレンス
See Also CVS リポジトリ: Cairo ベクトル・グラフィックス・ライブラリの CVS リポジトリ (英文併記)
See Also 誤植/誤訳の報告はメールの他に、こちらにて。
さてさて、いよいよGTK+ Reference Manual の翻訳にとりかかることにしますかね。

Drawing objects with Cairo APIs.

Cairo ベクトル・グラフィックス・ライブラリのリファレンスマニュアル翻訳は中ほどまで。ここまできて、やっと英文 (表現) の癖が分かってきたので訳しやすくなってきたところ。
さて、ちょっと実践がてらソースアーカイブの $top_builddir/test にあるテスト・プログラムを参考に API の動きを確認してみた。
Cairo ライブラリは、いろいろなシェイプ (図画) を描画するための共通な API だけを提供しているライブラリなので、実際に描画するシェイプの種類に応じて、別途バックエンド・ライブラリが必要となる。すなわち、このライブラリはマルチ・シェイプ/マルチ・プラットフォーム対応のラッパー・ライブラリということになる。
例えば、SVG (Scalable Vector Graphics) を操作するには libsvg が必要だし、フォントを描画するなら使用するプラットフォーム毎に提供されている標準的なフォント・バックエンド (Linux なら libfontconfiglibfreetype) が必要になる。サポートしているバックエンドについてはここに一覧がある。
マルチ・シェイプ対応ということで、対象がどんなシェイプであっても一意の API で操作できるものと想像していたんだけれど、実際は使用するバックエンド毎に関数のシンボルは異なっていた (まぁ、引数もいろいろだし)。Cairo でいう共通なインタフェースとはシェイプを操作するための概念にあるように思う。つまり、Cairo コンテキストCairo サーフィスという二つの抽象的なオブジェクトを中心に描画操作を行おうとする考え方だ。前者はシェイプの種類に影響しない幾何学的な情報を格納する基本型であり、後者は実際に描画するデータや描画オプションなどシェイプの種類に依存するような情報を格納する基本型だ。
Cairo ライブラリを使って何か描画するには、コンテキスト型とサーフィス型のオブジェクトを生成し、そのオブジェクトに対して必要な操作をバックエンド毎のメソッドを用いて記述するのが基本になるということだ。
今回は SVG 画像のサーフィスを用意して Cairo API を使っているサンプルを。まずはヘッダの宣言から:

/* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
/*
 * test-svg-clip.c:
 * gcc -o test-svg-clip `pkg-config --cflags --libs cairo glib-2.0` test-svg-clip.c
 */
#include <glib.h> #include <cairo-svg.h>

なんだかんだと便利な GLib 汎用ライブラリを使用するのはいつものとおり。そして Cairo のヘッダをインクルードするのだけれども、今回は SVG 画像を処理するので cairo/cairo.h ではなく cairo/cairo-svg.h を直接インクルードした。使用している Cairo のバージョンは 1.2.4。ちなみに Cairo 1.0.x 系では SVG 描画は未だサポートされていない。
次は、先に main() 本体:

int
main (void)
{
cairo_surface_t *surface;
const gchar *filename = "/tmp/svg-clip.svg";
cairo_t *cr;

描画結果は /tmp/svg-clip.svg に格納するので、SVG 形式のサーフィスを格納する変数と、描画に必要な基本データの一つであるコンテキストを格納する変数を、それぞれ用意しておく。

surface = cairo_svg_surface_create (filename, 600, 600);
if (!surface)
{
g_error ("Failed to create SVG surface for file %s\n", filename);
return 1;
}
else
{
g_print ("A type of surface is %s\n",
(cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_SVG) ?  "SVG" : "Unknown");
}

SVG 形式のサーフィスを生成する。引数は出力結果を格納するファイルとサーフィスの大きさ (幅×高さ)。サーフィスの生成に失敗したらエラーを表示し、成功したらサーフィスの種類を取得して表示する。

cr = cairo_create (surface);

サーフィスに描画する際に使用するコンテキストを生成する。

do_drawing (cr);
cairo_show_page (cr);

SVG のシェイプを作成する do_drawing() を呼び出し、その結果を格納したコンテキストをバックエンド (libsvg) に引き渡して、実際にファイルに書き込んでもらう。cairo_show_page() を呼び出さないと何も出力されない。
で、Cairo の描画 API を使ってシェイプを作成する do_drawing() は:

static void
do_drawing (cairo_t *cr)
{
cairo_rectangle (cr, 100, 100, 400, 400);
cairo_set_source_rgb (cr, 0, 0, 1);
cairo_stroke (cr);
cairo_set_source_rgb (cr, 0, 1, 1);
cairo_save (cr);
cairo_scale (cr, 0.5, 0.5);
cairo_arc (cr, 300, 300, 210, 0, 2 * G_PI); cairo_set_source_rgb (cr, 1, 0, 0); cairo_fill (cr);
cairo_restore (cr);
cairo_rectangle (cr, 250, 100, 100, 400); cairo_rectangle (cr, 100, 250, 400, 100); cairo_stroke (cr);
}

閉じたパスを描画する API はここで、引数にコンテキストだけを指定する API はここ

cairo_rectangle (cr, 100, 100, 400, 400);
cairo_set_source_rgb (cr, 0, 0, 1);
cairo_stroke (cr);

まず最初に、左上隅の点 (100, 100) から幅、高さ共に 400.0 (デバイス空間の単位) の矩形を描画する。コンテキストには常にパスの終点が格納されている。この終点は、すなわち、次に何か作画する際の始点になる。そのため、閉じたパスを描画する API はコンテキストを引数にとる。そして、コンテキストに格納された。終点は、ここで描画した矩形の終点に更新される。
ここまで描画した画像
svg-clip-20061010-01.png
そして、線の色を緑にしてから、コンテキストに格納されている複数のパスを cairo_stroke() で結ぶ。

cairo_set_source_rgb (cr, 0, 1, 1);
cairo_save (cr);
cairo_scale (cr, 0.5, 0.5);

次に、線の色 (前景色) を水色に変更してから、ここまでのコンテキストを一時的に待避しておく。後で復帰する予定。そして、描画する倍率を変更してコンテキストにセットする。

cairo_arc (cr, 300, 300, 210, 0, 2 * G_PI);
cairo_set_source_rgb (cr, 1, 0, 0);
cairo_fill (cr);

そして、赤色で塗りつぶされた円を描画する。
ここまで描画した画像
svg-clip-20061010-02.png

cairo_restore (cr);

一時的に待避しておいたコンテキストを復帰する。そして

cairo_rectangle (cr, 250, 100, 100, 400);
cairo_rectangle (cr, 100, 250, 400, 100);
cairo_stroke (cr);

最後に、十字型になるよう矩形を二つ描画する。コンテキストを復帰させたので、線の色は待避する前に変更していた水色になる。
ここまで描画した画像
svg-clip-20061010-03.png
描画した結果の画像を見ると、描画していく順に上書きされているのが分かる。また、描画処理の流れはコンテキストとサーフィスを中心に作られているのも分かると思う。
で、main() に戻って finalizing を。

cairo_destroy (cr);
cairo_surface_destroy (surface);
return 0; }

使用したコンテキストとサーフィスをそれぞれ専用の API で解放する。
Cairo の API には、もちろん他にもコンテキストの属性 (アルファ・チャネルやフォント描画オプション) を変更したり、画像やパターンでの塗りつぶしや、クリッピング指定による特定の領域の塗りつぶし、行列を用いたシェイプの移動や回転なんかが用意されている。そのようなプログラムのサンプルがここにあり、出力結果を参照しながら API の使い方を習得できる。
次回は Cairo 単体、Pango と連携して文字列を描画するサンプルを眺めることにしよう。

The other Search Tools for Desktop.

今日、見つけた検索ツール (for Desktop?) の類:
See Also Google Code Search: ウェブ・ベースのプログラム・コード検索
検索には正規表現を使用したり、ファイル名やパッケージ名を名前空間として指定できたり、プログラミング言語でも指定できるようだ。圧縮済みの tarball や svn, cvs の中から該当するコードを表示してくれる。
(Zaheerのブログより)
See Also Tracker: タグとメタデータから構成されるデータベースから検索するデーモンとインタフェース
コンペは Beagle といったところかな。検索時間も早いようだし、NautilusDeskbar Applet 用のパッチやモジュールも提供されていて、デスクトップ UI からすぐに利用できるようだ。