試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

C言語でGTK+ 2を扱う上での幾つかのメモ(第7回)

C言語でGTK+ 2を扱う上での幾つかのメモ(第6回)」の続き。

GObjectオブジェクトの参照カウンタ操作の簡単な例

C言語でGTK+ 2を扱う上での幾つかのメモ(第3回)」でGObjectオブジェクトの参照カウンタに関して少し触れているが、ここでは参照カウンタを操作する簡単な例として、画像のデータを中に持つGdkPixbufオブジェクトを用いたサンプルを扱う。
(2010/9/22)より実用的な例として「C言語のGTK+でListStoreからデータを取り出す処理に関する追加メモ(前半)」「C言語のGTK+でListStoreからデータを取り出す処理に関する追加メモ(後半)」も参照。以下、以前の内容となる。
内容としては、あまり意味はないかもしれないが

このような星の画像と

このようなキノコの画像を用意して、星の画像の上1/3とキノコの画像の下2/3をくっつけてみることにする。
今回、下のような流れで画像を合成して表示することにした。能率は良くないかもしれないが、処理の例としてこのようにした。

  1. ソースに埋め込んだXPM画像データをもとにGdkPixbufオブジェクトを作成(gdk_pixbuf_new_from_xpm_data())
  2. 合成後の画像のベースとして星の画像を複製(gdk_pixbuf_copy())
  3. キノコの画像の下2/3の領域をその画像の同じ領域にコピー(gdk_pixbuf_copy_area())
  4. ここで元の星とキノコの画像は不要になるのでそれぞれ参照カウンタを減らす(g_object_unref())
  5. 元の画像はサイズが小さいので、画面への表示用に新しく拡大してコピーしたものを作る(gdk_pixbuf_scale_simple())
  6. 拡大前の画像は不要になるので参照カウンタを減らす(g_object_unref())
  7. 画像を表示するGUI部品のGtkImageにそのデータ(GdkPixbufオブジェクト)を入れてウィンドウに入れ、表示する


[任意]ファイル名: smushroom.c

#include <gtk/gtk.h>
#include <stdlib.h>

/*
 * gcc -O2 -Wall -Wextra $(pkg-config --cflags gtk+-2.0) smushroom.c -o smushroom $(pkg-config --libs gtk+-2.0)
 */

static const char *star_xpm[] = {
"96 96 2 1",
" 	c None",
".	c #FFEE00",
"                                                                                                ",
"                                                                                                ",
"                                                                                                ",
"                                               ..                                               ",
"                                               ..                                               ",
"                                              ....                                              ",
"                                              ....                                              ",
"                                             ......                                             ",
"                                             ......                                             ",
"                                            ........                                            ",
"                                            ........                                            ",
"                                           ..........                                           ",
"                                           ..........                                           ",
"                                          ............                                          ",
"                                          ............                                          ",
"                                         ..............                                         ",
"                                         ..............                                         ",
"                                        ................                                        ",
"                                        ................                                        ",
"                                       ..................                                       ",
"                                       ..................                                       ",
"                                      ....................                                      ",
"                                      ....................                                      ",
"                                     ......................                                     ",
"                                     ......................                                     ",
"                                    ........................                                    ",
"                                    ........................                                    ",
"                                   ..........................                                   ",
"                                   ..........................                                   ",
"                                  ............................                                  ",
"                                  ............................                                  ",
"                                 ..............................                                 ",
"                             ......................................                             ",
"                       ..................................................                       ",
"                ................................................................                ",
"         ..............................................................................         ",
"  ............................................................................................  ",
" .............................................................................................. ",
"  ............................................................................................  ",
"   ..........................................................................................   ",
"    ........................................................................................    ",
"     ......................................................................................     ",
"      ....................................................................................      ",
"       ..................................................................................       ",
"        ................................................................................        ",
"         ..............................................................................         ",
"          ............................................................................          ",
"           ..........................................................................           ",
"            ........................................................................            ",
"             ......................................................................             ",
"              ....................................................................              ",
"               ..................................................................               ",
"                ................................................................                ",
"                 ..............................................................                 ",
"                  ............................................................                  ",
"                   ..........................................................                   ",
"                    ........................................................                    ",
"                     ......................................................                     ",
"                      ....................................................                      ",
"                       ..................................................                       ",
"                        ................................................                        ",
"                        ................................................                        ",
"                        ................................................                        ",
"                       ..................................................                       ",
"                       ..................................................                       ",
"                       ..................................................                       ",
"                       ..................................................                       ",
"                       ..................................................                       ",
"                       ..................................................                       ",
"                      ....................................................                      ",
"                      ....................................................                      ",
"                      ....................................................                      ",
"                      ....................................................                      ",
"                      ....................................................                      ",
"                      ....................................................                      ",
"                     ......................................................                     ",
"                     ......................................................                     ",
"                     ......................................................                     ",
"                     .........................    .........................                     ",
"                     .......................        .......................                     ",
"                    ......................            ......................                    ",
"                    ....................                ....................                    ",
"                    ..................                    ..................                    ",
"                    ................                        ................                    ",
"                    ...............                          ...............                    ",
"                    .............                              .............                    ",
"                   ............                                  ............                   ",
"                   ..........                                      ..........                   ",
"                   ........                                          ........                   ",
"                   ......                                              ......                   ",
"                   ....                                                  ....                   ",
"                   ..                                                      ..                   ",
"                                                                                                ",
"                                                                                                ",
"                                                                                                ",
"                                                                                                "};

static const char *mushroom_xpm[] = {
"96 96 26 1",
" 	c None",
".	c #FF5D00",
"+	c #FF6000",
"@	c #FFB400",
"#	c #FF8B00",
"$	c #FF6400",
"%	c #FF5F00",
"&	c #FFCC00",
"*	c #FFC900",
"=	c #FFA600",
"-	c #FF7C00",
";	c #FF5E00",
">	c #FFC600",
",	c #FFC100",
"'	c #FFA700",
")	c #FF8F00",
"!	c #FF7700",
"~	c #FF6100",
"{	c #FFCA00",
"]	c #FFB700",
"^	c #FF9F00",
"/	c #FF8700",
"(	c #FF7100",
"_	c #FF6700",
":	c #FFBF00",
"<	c #FFAF00",
"                                         ..............                                         ",
"                                   ..........................                                   ",
"                               ..................................                               ",
"                            ........................................                            ",
"                          ............................................                          ",
"                        ................................................                        ",
"                      ....................................................                      ",
"                    ........................................................                    ",
"                  ............................................................                  ",
"                 ..............................................................                 ",
"                ................................................................                ",
"               ..................................................................               ",
"              ....................................................................              ",
"             ......................................................................             ",
"            ........................................................................            ",
"           ..........................................................................           ",
"          ............................................................................          ",
"          ............................................................................          ",
"         ..............................................................................         ",
"         ..............................................................................         ",
"        ................................................................................        ",
"        ................................................................................        ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"      ....................................................................................      ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"       ..................................................................................       ",
"        ................................................................................        ",
"        ................................................................................        ",
"         ..............................................................................         ",
"         ..............................................................................         ",
"          ............................................................................          ",
"           ..........................................................................           ",
"            ........................................................................            ",
"            ........................................................................            ",
"             ......................................................................             ",
"              ....................................................................              ",
"               ..................................................................               ",
"                 ..............................................................                 ",
"                  ............................................................                  ",
"                   ..........................................................                   ",
"                     ......................................................                     ",
"                       ..................................................                       ",
"                         +.............................................                         ",
"                          @#$......................................%.                           ",
"                         &&&*=-;................................;-=>                            ",
"                         &&&&&&,')!~........................~!)',&&&                            ",
"                         &&&&&&&&&&{]^/(_%............%_(/^]{&&&&&&&                            ",
"                         &&&&&&&&&&&&&&&&&>:]<'^^'<]:>&&&&&&&&&&&&&&                            ",
"                         &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                      &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                      &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                       &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                         ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                        &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                         &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                          ",
"                         &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                          &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                           ",
"                           &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                            ",
"                            &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                             ",
"                             &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                              ",
"                               &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                              ",
"                                &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&                                ",
"                                  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&                                 ",
"                                    &&&&&&&&&&&&&&&&&&&&&&&&&                                   ",
"                                       &&&&&&&&&&&&&&&&&&&                                      ",
"                                            &&&&&&&&&&                                          "};

int
main (int argc, char **argv)
{
  GtkWidget *mainwindow, *image;
  GdkPixbuf *star, *mushroom, *mixed, *scaled;
  gtk_init (&argc, &argv);
  mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  /* 元のstarとmushroomの画像 */
  star = gdk_pixbuf_new_from_xpm_data (star_xpm);
  mushroom = gdk_pixbuf_new_from_xpm_data (mushroom_xpm);
  /* starの画像を複製し、mushroomの上36ピクセル横96ピクセルをこれにコピー */
  mixed = gdk_pixbuf_copy (star);
  gdk_pixbuf_copy_area (mushroom, 0, 36, 96, 60, mixed, 0, 36);
  /* star,mushroomはここで不要となるので参照カウンタを減らす */
  g_object_unref (G_OBJECT (star));      /* 1 -> 0 (破棄) */
  g_object_unref (G_OBJECT (mushroom));  /* 1 -> 0 (破棄) */
  /* mixedを複製/拡大した画像を生成する */
  scaled = gdk_pixbuf_scale_simple (mixed, 192, 192, GDK_INTERP_HYPER);
  /* mixedは不要となる */
  g_object_unref (G_OBJECT (mixed));     /* 1 -> 0 (破棄) */
  /* 画像を表示するGUI部品(GtkImage)から参照されるので */
  /* scaledの参照カウンタは増える */
  image = gtk_image_new_from_pixbuf (scaled);
  /* この関数ではこの先用いないためカウンタを減らすが */
  /* この時点では0にはならない */
  g_object_unref (G_OBJECT (scaled));
  gtk_container_add (GTK_CONTAINER (mainwindow), image);
  gtk_widget_show_all (mainwindow);
  gtk_window_resize (GTK_WINDOW (mainwindow), 200, 200);
  g_signal_connect (G_OBJECT (mainwindow), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
  gtk_main ();
  return EXIT_SUCCESS;
}

(2014/10/29)オブジェクトscaledの参照カウンタ操作が足りていないのを修正

関連URL: