[gthumb] sharpen: use the original image in the preview
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] sharpen: use the original image in the preview
- Date: Sat, 9 Nov 2013 19:59:42 +0000 (UTC)
commit 1e8f2388329c52e548d5437410ddbd2eed8a30f0
Author: Paolo Bacchilega <paobac src gnome org>
Date: Wed Sep 25 19:01:56 2013 +0200
sharpen: use the original image in the preview
extensions/file_tools/gth-file-tool-sharpen.c | 124 ++++++++++++++++---------
1 files changed, 80 insertions(+), 44 deletions(-)
---
diff --git a/extensions/file_tools/gth-file-tool-sharpen.c b/extensions/file_tools/gth-file-tool-sharpen.c
index 56ce6c6..48d19d9 100644
--- a/extensions/file_tools/gth-file-tool-sharpen.c
+++ b/extensions/file_tools/gth-file-tool-sharpen.c
@@ -38,16 +38,16 @@ G_DEFINE_TYPE (GthFileToolSharpen, gth_file_tool_sharpen, GTH_TYPE_FILE_TOOL)
struct _GthFileToolSharpenPrivate {
cairo_surface_t *source;
- cairo_surface_t *destination;
GtkBuilder *builder;
GtkAdjustment *radius_adj;
GtkAdjustment *amount_adj;
GtkAdjustment *threshold_adj;
GtkWidget *preview;
- GthTask *pixbuf_task;
+ GthTask *image_task;
guint apply_event;
gboolean show_preview;
gboolean first_allocation;
+ gboolean closing;
};
@@ -181,6 +181,7 @@ apply_cb (gpointer user_data)
if (self->priv->show_preview) {
SharpenData *sharpen_data;
int x, y, w ,h;
+ cairo_surface_t *destination;
cairo_surface_t *preview_surface;
cairo_t *cr;
@@ -192,31 +193,30 @@ apply_cb (gpointer user_data)
if ((w < 0) || (h < 0))
return FALSE;
- cairo_surface_destroy (self->priv->destination);
- self->priv->destination = _cairo_image_surface_copy (self->priv->source);
- _cairo_image_surface_copy_metadata (self->priv->source, self->priv->destination);
+ destination = _cairo_image_surface_copy (self->priv->source);
+ _cairo_image_surface_copy_metadata (self->priv->source, destination);
/* FIXME: use a cairo sub-surface when cairo 1.10 will be requiered */
- preview_surface = _cairo_image_surface_copy_subsurface (self->priv->destination, x, y, w, h);
- if (preview_surface == NULL)
- return FALSE;
-
- _cairo_image_surface_sharpen (preview_surface,
- sharpen_data->radius,
- sharpen_data->amount,
- sharpen_data->threshold,
- NULL);
+ preview_surface = _cairo_image_surface_copy_subsurface (destination, x, y, w, h);
+ if (preview_surface != NULL) {
+ _cairo_image_surface_sharpen (preview_surface,
+ sharpen_data->radius,
+ sharpen_data->amount,
+ sharpen_data->threshold,
+ NULL);
- cr = cairo_create (self->priv->destination);
- cairo_set_source_surface (cr, preview_surface, x, y);
- cairo_rectangle (cr, x, y, w, h);
- cairo_fill (cr);
- cairo_destroy (cr);
+ cr = cairo_create (destination);
+ cairo_set_source_surface (cr, preview_surface, x, y);
+ cairo_rectangle (cr, x, y, w, h);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+ }
- gth_image_viewer_set_surface (preview, self->priv->destination, -1, -1);
+ gth_image_viewer_set_surface (preview, destination, -1, -1);
cairo_surface_destroy (preview_surface);
+ cairo_surface_destroy (destination);
sharpen_data_free (sharpen_data);
}
else
@@ -270,30 +270,15 @@ static GtkWidget *
gth_file_tool_sharpen_get_options (GthFileTool *base)
{
GthFileToolSharpen *self;
- GtkWidget *window;
- GtkWidget *viewer_page;
- GtkWidget *viewer;
GtkWidget *options;
GtkWidget *image_navigator;
self = (GthFileToolSharpen *) base;
- window = gth_file_tool_get_window (base);
- viewer_page = gth_browser_get_viewer_page (GTH_BROWSER (window));
- if (! GTH_IS_IMAGE_VIEWER_PAGE (viewer_page))
- return NULL;
-
- cairo_surface_destroy (self->priv->source);
- cairo_surface_destroy (self->priv->destination);
-
- viewer = gth_image_viewer_page_get_image_viewer (GTH_IMAGE_VIEWER_PAGE (viewer_page));
- self->priv->source = cairo_surface_reference (gth_image_viewer_get_current_image (GTH_IMAGE_VIEWER
(viewer)));
if (self->priv->source == NULL)
return NULL;
- self->priv->destination = NULL;
self->priv->first_allocation = TRUE;
-
self->priv->builder = _gtk_builder_new_from_file ("sharpen-options.ui", "file_tools");
options = _gtk_builder_get_widget (self->priv->builder, "options");
gtk_widget_show (options);
@@ -379,19 +364,64 @@ gth_file_tool_sharpen_destroy_options (GthFileTool *base)
self->priv->apply_event = 0;
}
- cairo_surface_destroy (self->priv->source);
- cairo_surface_destroy (self->priv->destination);
- _g_object_unref (self->priv->builder);
- self->priv->source = NULL;
- self->priv->destination = NULL;
- self->priv->builder = NULL;
+ _cairo_clear_surface (&self->priv->source);
+ _g_clear_object (&self->priv->builder);
+}
+
+
+static void gth_file_tool_sharpen_cancel (GthFileTool *base);
+
+
+static void
+original_image_task_completed_cb (GthTask *task,
+ GError *error,
+ gpointer user_data)
+{
+ GthFileToolSharpen *self = user_data;
+
+ self->priv->image_task = NULL;
+
+ if (self->priv->closing) {
+ g_object_unref (task);
+ gth_file_tool_sharpen_cancel (GTH_FILE_TOOL (self));
+ return;
+ }
+
+ if (error != NULL) {
+ g_object_unref (task);
+ return;
+ }
+
+ self->priv->source = gth_original_image_task_get_image (task);
+ if (self->priv->source != NULL)
+ gth_file_tool_show_options (GTH_FILE_TOOL (self));
+
+ g_object_unref (task);
}
static void
gth_file_tool_sharpen_activate (GthFileTool *base)
{
- gth_file_tool_show_options (base);
+ GthFileToolSharpen *self = (GthFileToolSharpen *) base;
+ GtkWidget *window;
+ GtkWidget *viewer_page;
+
+ /* load the original image */
+
+ window = gth_file_tool_get_window (GTH_FILE_TOOL (self));
+ viewer_page = gth_browser_get_viewer_page (GTH_BROWSER (window));
+ if (! GTH_IS_IMAGE_VIEWER_PAGE (viewer_page))
+ return;
+
+ self->priv->image_task = gth_original_image_task_new (GTH_IMAGE_VIEWER_PAGE (viewer_page));
+ g_signal_connect (self->priv->image_task,
+ "completed",
+ G_CALLBACK (original_image_task_completed_cb),
+ self);
+ gth_browser_exec_task (GTH_BROWSER (gth_file_tool_get_window (GTH_FILE_TOOL (self))),
+ self->priv->image_task,
+ FALSE);
}
@@ -402,6 +432,12 @@ gth_file_tool_sharpen_cancel (GthFileTool *base)
GtkWidget *window;
GtkWidget *viewer_page;
+ if (self->priv->image_task != NULL) {
+ self->priv->closing = TRUE;
+ gth_task_cancel (self->priv->image_task);
+ return;
+ }
+
if (self->priv->apply_event != 0) {
g_source_remove (self->priv->apply_event);
self->priv->apply_event = 0;
@@ -424,7 +460,6 @@ gth_file_tool_sharpen_finalize (GObject *object)
self = (GthFileToolSharpen *) object;
cairo_surface_destroy (self->priv->source);
- cairo_surface_destroy (self->priv->destination);
_g_object_unref (self->priv->builder);
/* Chain up */
@@ -457,9 +492,10 @@ gth_file_tool_sharpen_init (GthFileToolSharpen *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_FILE_TOOL_SHARPEN,
GthFileToolSharpenPrivate);
self->priv->source = NULL;
- self->priv->destination = NULL;
self->priv->builder = NULL;
self->priv->show_preview = TRUE;
+ self->priv->closing = FALSE;
+ self->priv->image_task = NULL;
gth_file_tool_construct (GTH_FILE_TOOL (self), "tool-sharpen", _("Enhance Focus..."), _("Enhance
Focus"), FALSE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]