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をくっつけてみることにする。
今回、下のような流れで画像を合成して表示することにした。能率は良くないかもしれないが、処理の例としてこのようにした。
- ソースに埋め込んだXPM画像データをもとにGdkPixbufオブジェクトを作成(gdk_pixbuf_new_from_xpm_data())
- 合成後の画像のベースとして星の画像を複製(gdk_pixbuf_copy())
- キノコの画像の下2/3の領域をその画像の同じ領域にコピー(gdk_pixbuf_copy_area())
- ここで元の星とキノコの画像は不要になるのでそれぞれ参照カウンタを減らす(g_object_unref())
- 元の画像はサイズが小さいので、画面への表示用に新しく拡大してコピーしたものを作る(gdk_pixbuf_scale_simple())
- 拡大前の画像は不要になるので参照カウンタを減らす(g_object_unref())
- 画像を表示するGUI部品のGtkImageにそのデータ(GdkPixbufオブジェクト)を入れてウィンドウに入れ、表示する
#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: