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'>&#x0E19;&#x0E49;&#x0E33;</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++

実行結果は、次のようになる。

タイ語も表示できている。

外部リンク

Thai Language LOOKTHAI

タイ語入力