Pangoを使う

(2005.5.15 新規作成)

(2017.5) gtk3に更新. コンパイルエラーになった箇所を修正。

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

[2017-05] Fedora 25, gtk3 3.22.12, pango 1.40.5 という環境で表示できるか試してみた。

ソースコード

まずは、ヘッダをincludeして、ウィンドウを閉じたときの処理を書く。Pango単体のときはともかく、通常はgtk+から使うので、gtk+のヘッダをincludeする。

C
[POPUP]
  1. #include <stdio.h>
  2. #include <gtk/gtk.h>
  3. static int on_destroy(GtkWidget* w, GdkEvent* e, void* d) {
  4. gtk_main_quit();
  5. return 0;
  6. }

Pangoでは、テキストの文字の大きさ、色などを指定するのに、HTMLに似たタグでテキストをマークアップして指定する。pango_parse_markup()に渡して、プレーンテキストの文字列と、属性に分解する。

gtk+では、ラベルなどとしてただの文字列も表示できるように、文字列を設定してから属性を別に指定するようになっている。属性の部分は、*_set_attributes()で指定する。

C
[POPUP]
  1. int main(int argc, char* argv[]) {
  2. GtkWidget* window;
  3. GtkWidget* label;
  4. // <u> 下線を引く
  5. // span[size] 大きさを指定。pt/1024単位。
  6. const char* str = "<span size='40000'><u>日本語</u> "
  7. "<span font_family='Microsoft Sans Serif'>&#x0E19;&#x0E49;&#x0E33;</span></span>";
  8. char* text = NULL;
  9. PangoAttrList* attrs = NULL;
  10. GError* error = NULL;
  11. gtk_init(&argc, &argv);
  12. if (!pango_parse_markup(str, -1, 0, &attrs, &text, NULL, &error)) {
  13. printf("error:%s\n", error->message);
  14. return 1;
  15. }
  16. label = gtk_label_new(text);
  17. gtk_label_set_attributes(GTK_LABEL(label), attrs);

あとは、ウィンドウを生成するだけ。

C
[POPUP]
  1. window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  2. gtk_window_set_title(GTK_WINDOW(window), "Pangoでの表示");
  3. gtk_container_add(GTK_CONTAINER(window), label);
  4. gtk_container_set_border_width(GTK_CONTAINER(window), 30);
  5. gtk_widget_show_all(window);
  6. g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_destroy), NULL);
  7. gtk_main();
  8. return 0;
  9. }

コンパイル、実行結果

次のようにしてコンパイルする。

$ gcc -Wall `pkg-config --cflags --libs pango gtk+-3.0` pango.cc

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

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

外部リンク

Thai Language LOOKTHAI