Pangoを使う
(2005.5.15 新規作成)
Pangoは、GNOMEで使われている、テキストのレイアウト・レンダリングモジュール。内部ではテキストをUnicodeで表現する。
日本語が表示できるのはアプリケーションを見ていれば分かるので、合字のある言語でも表示できるか試してみた。
タイ語で、
と表示できるか。Windows版のMozilla 1.7.7, Internet Explorer 6.0では表示できる。Linux版のMozilla, Firefoxでは表示できなかった。
この文字列はUnicodeでは次のコードからなる。2番目と3番目のコードの両方が1文字目のグリフに影響する。また、2番目のコードが表す字形の表示位置が上のほうへ回っているのが分かる。
- U+0E19 THAI CHARACTER NO NU
- U+0E49 THAI CHARACTER MAI THO
- U+0E33 THAI CHARACTER SARA AM
Fedora Core 3, gtk+ 2.4.14, pango 1.6.0 という環境で表示できるか試してみた。
ソース
まずは、ヘッダをincludeして、ウィンドウを閉じたときの処理を書く。Pango単体のときはともかく、通常はgtk+から使うので、gtk+-2.0のヘッダをincludeする。
8| #include <stdio.h> 9| #include <gtk/gtk.h> 10| 11| int on_destroy(GtkWidget* w, GdkEvent* e, void* d) { 12| gtk_main_quit(); 13| return 0; 14| }
Pangoでは、テキストの文字の大きさ、色などを指定するのに、HTMLに似たタグでテキストをマークアップして指定する。pango_parse_markup()に渡して、プレーンテキストの文字列と、属性に分解する。
gtk+では、ラベルなどとしてただの文字列も表示できるように、文字列を設定してから属性を別に指定するようになっている。属性の部分は、*_set_attributes()で指定する。
16| int main(int argc, char* argv[]) { 17| GtkWidget* window; 18| GtkWidget* label; 19| 20| // <u> 下線を引く 21| // span[size] 大きさを指定。pt/1024単位。 22| const char* str = "<span size='40000'><u>日本語</u> " 23| "<span font_family='Microsoft Sans Serif'>น้ำ</span></span>"; 24| char* text= NULL; 25| PangoAttrList* attrs = NULL; 26| GError* error = NULL; 27| 28| gtk_init(&argc, &argv); 29| 30| if (!pango_parse_markup(str, -1, 0, &attrs, &text, NULL, &error)) { 31| printf("error:%s\n", error->message); 32| return 1; 33| } 34| 35| label = gtk_label_new(text); 36| gtk_label_set_attributes(GTK_LABEL(label), attrs);
あとは、ウィンドウを生成するだけ。
38| window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 39| gtk_window_set_title(GTK_WINDOW(window), "Pangoでの表示"); 40| 41| gtk_container_add(GTK_CONTAINER(window), label); 42| gtk_container_set_border_width(GTK_CONTAINER(window), 30); 43| gtk_widget_show_all(window); 44| 45| g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(on_destroy), NULL); 46| 47| gtk_main(); 48| return 0; 49| }
コンパイル、実行結果
次のようにしてコンパイルする。
$ gcc pango.cc -Wall `pkg-config --cflags --libs pango gtk+-2.0` -lstdc++
実行結果は、次のようになる。
タイ語も表示できている。