Fixed threading bug in graphics
[projects/chimara/chimara.git] / libchimara / graphics.c
index c87a148390aa0dc05fdd17a7114ac1ca6aa883e4..190b44b99aa65975d9015f9f8cbd0d4d4274bff1 100644 (file)
@@ -22,6 +22,10 @@ load_image_in_cache(glui32 image, gint width, gint height)
        guchar *buffer;
 
        /* Lookup the proper resource */
+       if(!glk_data->resource_map) {
+               WARNING("No resource map has been loaded yet.");
+               return NULL;
+       }
        blorb_error = giblorb_load_resource(glk_data->resource_map, giblorb_method_FilePos, &resource, giblorb_ID_Pict, image);
        if(blorb_error != giblorb_err_None) {
                WARNING_S( "Error loading resource", giblorb_get_error_message(blorb_error) );
@@ -216,7 +220,7 @@ glk_image_get_info(glui32 image, glui32 *width, glui32 *height)
 
        if(width != NULL)
                *width = found->width;
-       if(width != NULL)
+       if(height != NULL)
                *height = found->height;
        return TRUE;
 }
@@ -339,12 +343,13 @@ glk_image_draw_scaled(winid_t win, glui32 image, glsi32 val1, glsi32 val2, glui3
 glui32
 draw_image_common(winid_t win, GdkPixbuf *pixbuf, glsi32 val1, glsi32 val2)
 {
-       GdkPixmap *canvas;
-       gdk_threads_enter();
-
        switch(win->type) {
        case wintype_Graphics:
        {
+               GdkPixmap *canvas;
+
+               gdk_threads_enter();
+
                gtk_image_get_pixmap( GTK_IMAGE(win->widget), &canvas, NULL );
                if(canvas == NULL) {
                        WARNING("Could not get pixmap");
@@ -355,18 +360,23 @@ draw_image_common(winid_t win, GdkPixbuf *pixbuf, glsi32 val1, glsi32 val2)
 
                /* Update the screen */
                gtk_widget_queue_draw(win->widget);
+
+               gdk_threads_leave();
        }
                break;
 
        case wintype_TextBuffer:
        {
+               flush_window_buffer(win);
+
+               gdk_threads_enter();
+
                GtkTextBuffer *buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(win->widget) );
                GtkTextIter end, start;
                gtk_text_buffer_get_end_iter(buffer, &end);
-               start = end;
 
-               flush_window_buffer(win);
                gtk_text_buffer_insert_pixbuf(buffer, &end, pixbuf);
+               start = end;
                gtk_text_iter_forward_char(&end);
 
                gint height = 0;
@@ -386,12 +396,11 @@ draw_image_common(winid_t win, GdkPixbuf *pixbuf, glsi32 val1, glsi32 val2)
                        GtkTextTag *tag = gtk_text_buffer_create_tag(buffer, NULL, "rise", PANGO_SCALE * (-height), NULL);
                        gtk_text_buffer_apply_tag(buffer, tag, &start, &end);
                }
+
+               gdk_threads_leave();
        }
                break;
-
        }
-
-       gdk_threads_leave();
        return TRUE;
 }