Одна функция сэкономит вам много усилий здесь. Посмотрите на gdk_pixbuf_get_from_surface. Он получает Pixbuf от cairo_surface_t. Грубый, понимая, как он это пишет, это доступно только если вы используете Gdk-3.0, что также означает использование Gtk + -3.0.
Грубо, если вы хотите использовать Gtk + -2.0, тогда вы можете создать растровое изображение, получить из него cairo_t, а затем скопировать в него другой файл cairo_surface_t с помощью
cairo_set_source_surface (cr, surface, x0, y0);
cairo_rectangle (cr, x0 + x, y0 + y, width, height);
cairo_fill (cr);
Ниже приведен пример того, как создать растровое изображение, остальное я позволю вам заполнить.
#include <gtk/gtk.h>
#include <cairo/cairo.h>
int main(gint argc, gchar *argv[])
{
GdkPixmap *pixmap;
GtkWidget *image;
GtkWidget *window;
cairo_t *cr;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
pixmap = gdk_pixmap_new(window->window, 100, 100, -1);
cr = gdk_cairo_create(pixmap);
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
cairo_rectangle(cr, 10, 10, 80, 80);
cairo_fill(cr);
cairo_destroy(cr);
cr = NULL;
image = gtk_image_new_from_pixmap(pixmap, NULL);
gtk_container_add(GTK_CONTAINER(window), image);
gtk_widget_show(image);
gtk_main();
return 0;
}