同じことをGTK+2で書いてみる #2
Win32API版と同じようにオフスクリーンバッファを利用する形にした。
そして、draw_hello()をそのままの形で使用できるようにした。
また、Win32API版に合わせて背景を白色に変更した。
cairotest5.c
#include <gtk/gtk.h> #define UNUSED_ARGUMENT(x) (void)(x) #define WIDTH 860 #define HEIGHT 490 cairo_surface_t *make_offscreen(void); gboolean on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data); void draw_hello(cairo_surface_t *surf); int main(int argc, char *argv[]) { GtkWidget *win; GtkWidget *da; cairo_surface_t *surf = make_offscreen(); gtk_init(&argc, &argv); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); da = gtk_drawing_area_new(); gtk_container_add(GTK_CONTAINER(win), da); gtk_window_resize(GTK_WINDOW(win), WIDTH, HEIGHT); gtk_window_set_title(GTK_WINDOW(win), "Hello"); g_signal_connect(da, "expose-event", G_CALLBACK(on_expose), surf); g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(win); gtk_main(); cairo_surface_destroy(surf); return 0; } cairo_surface_t *make_offscreen(void) { cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); cairo_t *cr = cairo_create(surf); cairo_rectangle(cr, 0, 0, WIDTH, HEIGHT); cairo_set_source_rgb(cr, 1, 1, 1); cairo_fill_preserve(cr); cairo_destroy(cr); draw_hello(surf); return surf; } gboolean on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) { cairo_t *cr; cairo_surface_t *surf = data; UNUSED_ARGUMENT(event); cr = gdk_cairo_create(widget->window); cairo_set_source_surface(cr, surf, 0, 0); cairo_paint(cr); cairo_destroy(cr); return FALSE; } void draw_hello(cairo_surface_t *surf) { ...snip