- /* Copy the contents of the old pixmap */
- if(oldmap != NULL)
- gdk_draw_drawable( GDK_DRAWABLE(newmap), widget->style->white_gc, GDK_DRAWABLE(oldmap), 0, 0, 0, 0, oldwidth, oldheight);
-
- /* Use the new pixmap */
- gtk_image_set_from_pixmap( GTK_IMAGE(widget), newmap, NULL );
- g_object_unref(newmap);
+ guint32 total_read = 0;
+ image_loaded = FALSE;
+ while(total_read < res.length) {
+ guint32 num_read = glk_get_buffer_stream(glk_data->resource_file, (char *) buffer, BUFFER_SIZE);
+
+ if( !gdk_pixbuf_loader_write(loader, buffer, MIN(BUFFER_SIZE, num_read), &pixbuf_error) ) {
+ WARNING_S("Cannot read image", pixbuf_error->message);
+ giblorb_unload_chunk(glk_data->resource_map, image);
+ gdk_pixbuf_loader_close(loader, &pixbuf_error);
+ g_free(buffer);
+ return FALSE;
+ }
+
+ total_read += num_read;
+ }
+
+ if( !gdk_pixbuf_loader_close(loader, &pixbuf_error) ) {
+ WARNING_S("Cannot read image", pixbuf_error->message);
+ giblorb_unload_chunk(glk_data->resource_map, image);
+ g_free(buffer);
+ return FALSE;
+ }
+
+ if(!image_loaded) {
+ /* Wait for the PixbufLoader to finish loading the image */
+ g_mutex_lock(glk_data->resource_lock);
+ while(!image_loaded) {
+ g_cond_wait(glk_data->resource_loaded, glk_data->resource_lock);
+ }
+ g_mutex_unlock(glk_data->resource_lock);
+ }
+
+ giblorb_unload_chunk(glk_data->resource_map, image);
+ g_free(buffer);
+
+ gdk_threads_enter();
+
+ gtk_image_get_pixmap( GTK_IMAGE(win->widget), &canvas, NULL );
+ if(canvas == NULL) {
+ WARNING("Could not get pixmap");
+ return FALSE;
+ }
+
+ GdkPixbuf *pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
+ if(pixbuf == NULL) {
+ WARNING("Could not read image");
+ return FALSE;