Author: post
Date: 2012-02-18 12:22:50 +0100 (Sat, 18 Feb 2012)
New Revision: 4147

Modified:
   trunk/src/application.c
   trunk/src/rs-preview-widget.c
   trunk/src/rs-preview-widget.h
Log:
Add helper functions for locking the renderer, and lock while loading image.

Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c     2012-02-18 10:58:35 UTC (rev 4146)
+++ trunk/src/application.c     2012-02-18 11:22:50 UTC (rev 4147)
@@ -72,6 +72,7 @@
 {
        g_assert(rs != NULL);
 
+       rs_preview_widget_lock_renderer(RS_PREVIEW_WIDGET(rs->preview));
        /* Unref old photo if any */
        if (rs->photo)
                g_object_unref(rs->photo);
@@ -92,6 +93,7 @@
                g_signal_connect(G_OBJECT(rs->photo), "spatial-changed", 
G_CALLBACK(photo_spatial_changed), rs);
                g_signal_connect(G_OBJECT(rs->photo), "profile-changed", 
G_CALLBACK(photo_profile_changed), rs);
        }
+       rs_preview_widget_unlock_renderer(RS_PREVIEW_WIDGET(rs->preview));
 }
 
 static void

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2012-02-18 10:58:35 UTC (rev 4146)
+++ trunk/src/rs-preview-widget.c       2012-02-18 11:22:50 UTC (rev 4147)
@@ -266,18 +266,13 @@
 static gboolean make_cbdata(RSPreviewWidget *preview, const gint view, 
RS_PREVIEW_CALLBACK_DATA *cbdata, gint screen_x, gint screen_y, gint real_x, 
gint real_y);
 static gpointer render_thread_func(gpointer _thread_info);
 static void rs_preview_do_render(RSPreviewWidget *preview, GdkRectangle 
*dirty_area);
-
+static void rs_preview_wait_for_render(RSPreviewWidget *preview);
 /**
  * Class initializer
  */
 static void
 rs_preview_widget_class_init(RSPreviewWidgetClass *klass)
 {
-       GtkWidgetClass *widget_class;
-       GtkObjectClass *object_class;
-       widget_class = GTK_WIDGET_CLASS(klass);
-       object_class = GTK_OBJECT_CLASS(klass);
-
        signals[WB_PICKED] = g_signal_new ("wb-picked",
                G_TYPE_FROM_CLASS (klass),
                G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
@@ -496,6 +491,20 @@
        return widget;
 }
 
+extern void
+rs_preview_widget_lock_renderer(RSPreviewWidget *preview)
+{
+       g_assert(RS_IS_PREVIEW_WIDGET(preview));
+       g_mutex_lock(preview->render_thread->render_mutex);
+}
+
+extern void
+rs_preview_widget_unlock_renderer(RSPreviewWidget *preview)
+{
+       g_assert(RS_IS_PREVIEW_WIDGET(preview));
+       g_mutex_unlock(preview->render_thread->render_mutex);
+}
+
 void
 rs_preview_widget_update_display_colorspace(RSPreviewWidget *preview, gboolean 
force)
 {
@@ -2183,6 +2192,7 @@
 {
        gint view;
 
+       preview->last_required_direct_redraw  = TRUE;
        if (photo == preview->photo)
        {
                /* Set view profile */
@@ -2453,9 +2463,9 @@
        rs_filter_param_set_object(RS_FILTER_PARAM(request), "colorspace", 
preview->exposure_color_space);
 
        /* We set input to the cache placed before exposure mask */
-       gdk_threads_leave();
+       rs_preview_wait_for_render(preview);
        response = rs_filter_get_image8(preview->filter_cache3[view], request);
-       gdk_threads_enter();
+       g_mutex_unlock(preview->render_thread->render_mutex);   
        GdkPixbuf *buffer = rs_filter_response_get_image8(response);
        g_object_unref(response);
        g_object_unref(request);
@@ -2932,7 +2942,25 @@
        g_mutex_unlock(preview->render_thread->render_mutex);
 }
 
+/* Waits for the renderer to finish and keeps the render_mutex */
+/* gdk_threads must be held, and will be retained */
+static void 
+rs_preview_wait_for_render(RSPreviewWidget *preview)
+{
+       preview->render_thread->finish_rendering = TRUE;
+       gdk_threads_leave();
+       g_mutex_lock(preview->render_thread->render_mutex);
+       while (preview->render_thread->render_pending) 
+       {
+               g_cond_signal(preview->render_thread->render);
+               g_mutex_unlock(preview->render_thread->render_mutex);
+               g_usleep(1000);
+               g_mutex_lock(preview->render_thread->render_mutex);
+       }
+       gdk_threads_enter();
+}
 
+
 static gpointer
 render_thread_func(gpointer _thread_info)
 {

Modified: trunk/src/rs-preview-widget.h
===================================================================
--- trunk/src/rs-preview-widget.h       2012-02-18 10:58:35 UTC (rev 4146)
+++ trunk/src/rs-preview-widget.h       2012-02-18 11:22:50 UTC (rev 4147)
@@ -178,6 +178,12 @@
 extern void 
 rs_preview_widget_update_display_colorspace(RSPreviewWidget *preview, gboolean 
force);
 
+extern void
+rs_preview_widget_lock_renderer(RSPreviewWidget *preview);
+
+extern void
+rs_preview_widget_unlock_renderer(RSPreviewWidget *preview);
+
 #define RS_PREVIEW_TYPE_WIDGET             (rs_preview_widget_get_type ())
 #define RS_PREVIEW_WIDGET(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
RS_PREVIEW_TYPE_WIDGET, RSPreviewWidget))
 #define RS_PREVIEW_WIDGET_CLASS(obj)       (G_TYPE_CHECK_CLASS_CAST ((obj), 
RS_PREVIEW_WIDGET, RSPreviewWidgetClass))


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to