From cfe312bc5e36dea4c3a27e1c85ea1ce1f6ed5d2b Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Sun, 30 Dec 2007 17:58:15 +0000 Subject: [PATCH] moved processing in the GEGL code path back to the main loop. 2007-12-30 Sven Neumann * app/core/gimpdrawable-invert.c (gimp_drawable_invert): moved processing in the GEGL code path back to the main loop. svn path=/trunk/; revision=24490 --- ChangeLog | 5 ++ app/core/gimpdrawable-invert.c | 107 +++++++++++---------------------- 2 files changed, 40 insertions(+), 72 deletions(-) diff --git a/ChangeLog b/ChangeLog index 78060f2c95..864a846f65 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-12-30 Sven Neumann + + * app/core/gimpdrawable-invert.c (gimp_drawable_invert): moved + processing in the GEGL code path back to the main loop. + 2007-12-30 Michael Natterer * app/tools/gimpcolorbalancetool.c diff --git a/app/core/gimpdrawable-invert.c b/app/core/gimpdrawable-invert.c index 9cd69ff358..beb3504cc3 100644 --- a/app/core/gimpdrawable-invert.c +++ b/app/core/gimpdrawable-invert.c @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*#define ENABLE_GEGL*/ +/* #define ENABLE_GEGL */ #ifdef ENABLE_GEGL #include "config.h" @@ -32,98 +32,61 @@ #include "gimpprogress.h" #include "gimp-intl.h" -typedef struct Data { - GeglNode *gegl; - GeglNode *output; - GeglProcessor *processor; - GeglRectangle rect; - GimpDrawable *drawable; - GimpProgress *progress; -} Data; - -static gboolean -idle_fun (gpointer fdata) -{ - Data *data = fdata; - gboolean more_work; - gdouble progress; - - more_work = gegl_processor_work (data->processor, &progress); - if (more_work) - { - gimp_progress_set_text (data->progress, _("Invert")); - gimp_progress_set_value (data->progress, progress); - return TRUE; - } - - g_object_unref (data->processor); - gimp_drawable_update (data->drawable, data->rect.x, data->rect.y, - data->rect.width, data->rect.height); - gimp_drawable_merge_shadow (data->drawable, TRUE, _("Invert")); - { - GimpImage *image = gimp_item_get_image (GIMP_ITEM (data->drawable)); - if (image) - { - /* FIXME: gimp image flush has already been called by the action, - * it needs to still do so as long as only the ifdef is used to - * toggle between the versions - */ - gimp_image_flush (image); - } - } - - gimp_progress_end (data->progress); - g_object_unref (data->gegl); - g_free (data); - return FALSE; -} void gimp_drawable_invert (GimpDrawable *drawable, GimpProgress *progress) { + GeglNode *gegl; GeglNode *input; GeglNode *invert; - - Data *data; + GeglNode *output; + GeglProcessor *processor; + GeglRectangle rect; + gdouble value; g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable))); - data = g_malloc0 (sizeof (Data)); - data->drawable = drawable; - if (! gimp_drawable_mask_intersect (drawable, - &data->rect.x, &data->rect.y, - &data->rect.width, &data->rect.height)) + &rect.x, &rect.y, + &rect.width, &rect.height)) return; - data->gegl = gegl_node_new (); - data->progress = progress; - input = gegl_node_new_child (data->gegl, - "operation", "gimp-tilemanager-source", - "tile-manager", gimp_drawable_get_tiles (drawable), - NULL); - data->output = gegl_node_new_child (data->gegl, - "operation", "gimp-tilemanager-sink", - "tile-manager", gimp_drawable_get_shadow_tiles (drawable), - NULL); - invert = gegl_node_new_child (data->gegl, - "operation", "invert", - NULL); + gegl = gegl_node_new (); + input = gegl_node_new_child (gegl, + "operation", "gimp-tilemanager-source", + "tile-manager", gimp_drawable_get_tiles (drawable), + NULL); + output = gegl_node_new_child (gegl, + "operation", "gimp-tilemanager-sink", + "tile-manager", gimp_drawable_get_shadow_tiles (drawable), + NULL); + invert = gegl_node_new_child (gegl, + "operation", "invert", + NULL); - gegl_node_link_many (input, invert, data->output, NULL); + gegl_node_link_many (input, invert, output, NULL); - data->processor = gegl_node_new_processor (data->output, &data->rect); + processor = gegl_node_new_processor (output, &rect); - gimp_progress_start (data->progress, _("Invert"), FALSE); + gimp_progress_start (progress, _("Invert"), FALSE); - /* do the actual processing in an idle callback */ - g_idle_add (idle_fun, data); + while (gegl_processor_work (processor, &value)) + gimp_progress_set_value (progress, value); + + g_object_unref (processor); + + gimp_drawable_update (drawable, rect.x, rect.y, rect.width, rect.height); + gimp_drawable_merge_shadow (drawable, TRUE, _("Invert")); + + gimp_progress_end (progress); + + g_object_unref (gegl); } -#else /* ENABLE_GEGL is not defined */ +#else /* ENABLE_GEGL is not defined */ #include "config.h"