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