moved processing in the GEGL code path back to the main loop.
2007-12-30 Sven Neumann <sven@gimp.org> * 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
This commit is contained in:
parent
5780913e2f
commit
cfe312bc5e
2 changed files with 40 additions and 72 deletions
|
|
@ -1,3 +1,8 @@
|
|||
2007-12-30 Sven Neumann <sven@gimp.org>
|
||||
|
||||
* 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 <mitch@gimp.org>
|
||||
|
||||
* app/tools/gimpcolorbalancetool.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"
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue