同じことを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