From 88b021c02476e2306a9adb715ef7ecd957e9f26a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Wed, 2 Jan 2008 20:16:11 +0000 Subject: [PATCH] app/core/Makefile.am new files containing gimp_drawable_apply_operation() 2008-01-02 Michael Natterer * app/core/Makefile.am * app/core/gimpdrawable-operation.[ch]: new files containing gimp_drawable_apply_operation() which applies a gegl operation to a drawable's selected pixels using shadow tiles. Will soon be used in more places than just invert. * app/core/gimpdrawable-invert.c: use it here, makes gimp_drawable_invert() a 3-liner. svn path=/trunk/; revision=24506 --- ChangeLog | 11 ++++ app/core/Makefile.am | 2 + app/core/gimpdrawable-invert.c | 54 ++++-------------- app/core/gimpdrawable-operation.c | 94 +++++++++++++++++++++++++++++++ app/core/gimpdrawable-operation.h | 35 ++++++++++++ 5 files changed, 152 insertions(+), 44 deletions(-) create mode 100644 app/core/gimpdrawable-operation.c create mode 100644 app/core/gimpdrawable-operation.h diff --git a/ChangeLog b/ChangeLog index 1ad6be0657..e6f6e523ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-01-02 Michael Natterer + + * app/core/Makefile.am + * app/core/gimpdrawable-operation.[ch]: new files containing + gimp_drawable_apply_operation() which applies a gegl operation + to a drawable's selected pixels using shadow tiles. Will soon + be used in more places than just invert. + + * app/core/gimpdrawable-invert.c: use it here, makes + gimp_drawable_invert() a 3-liner. + 2008-01-01 Martin Nordholts * app/tools/gimprectangletool.c (gimp_rectangle_tool_start): Use × diff --git a/app/core/Makefile.am b/app/core/Makefile.am index 6c15482f73..f42f8f31cb 100644 --- a/app/core/Makefile.am +++ b/app/core/Makefile.am @@ -129,6 +129,8 @@ libappcore_a_sources = \ gimpdrawable-levels.h \ gimpdrawable-offset.c \ gimpdrawable-offset.h \ + gimpdrawable-operation.c \ + gimpdrawable-operation.h \ gimpdrawable-preview.c \ gimpdrawable-preview.h \ gimpdrawable-stroke.c \ diff --git a/app/core/gimpdrawable-invert.c b/app/core/gimpdrawable-invert.c index d4c2ec0dd0..8babf196b0 100644 --- a/app/core/gimpdrawable-invert.c +++ b/app/core/gimpdrawable-invert.c @@ -21,15 +21,15 @@ #include "config.h" -#include #include #include "core-types.h" #include "gimpdrawable.h" #include "gimpdrawable-invert.h" -#include "gimpimage.h" +#include "gimpdrawable-operation.h" #include "gimpprogress.h" + #include "gimp-intl.h" @@ -37,54 +37,20 @@ void gimp_drawable_invert (GimpDrawable *drawable, GimpProgress *progress) { - GeglNode *gegl; - GeglNode *input; - GeglNode *invert; - GeglNode *output; - GeglProcessor *processor; - GeglRectangle rect; - gdouble value; + GeglNode *invert; g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable))); + g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress)); - if (! gimp_drawable_mask_intersect (drawable, - &rect.x, &rect.y, - &rect.width, &rect.height)) - return; + invert = g_object_new (GEGL_TYPE_NODE, + "operation", "invert", + NULL); - gegl = gegl_node_new (); - input = gegl_node_new_child (gegl, - "operation", "gimp-tilemanager-source", - "tile-manager", gimp_drawable_get_tiles (drawable), - "linear", TRUE, - NULL); - output = gegl_node_new_child (gegl, - "operation", "gimp-tilemanager-sink", - "tile-manager", gimp_drawable_get_shadow_tiles (drawable), - "linear", TRUE, - NULL); - invert = gegl_node_new_child (gegl, - "operation", "invert", - NULL); + gimp_drawable_apply_operation (drawable, invert, TRUE, + progress, _("Invert")); - gegl_node_link_many (input, invert, output, NULL); - - processor = gegl_node_new_processor (output, &rect); - - gimp_progress_start (progress, _("Invert"), FALSE); - - 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); + g_object_unref (invert); } diff --git a/app/core/gimpdrawable-operation.c b/app/core/gimpdrawable-operation.c new file mode 100644 index 0000000000..ab2a763078 --- /dev/null +++ b/app/core/gimpdrawable-operation.c @@ -0,0 +1,94 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpdrawable-operation.c + * Copyright (C) 2007 Øyvind Kolås + * Sven Neumann + * Michael Natterer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "core-types.h" + +#include "gimpdrawable.h" +#include "gimpdrawable-operation.h" +#include "gimpprogress.h" + + +void +gimp_drawable_apply_operation (GimpDrawable *drawable, + GeglNode *operation, + gboolean linear, + GimpProgress *progress, + const gchar *undo_desc) +{ + GeglNode *gegl; + GeglNode *input; + 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))); + g_return_if_fail (GEGL_IS_NODE (operation)); + g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress)); + g_return_if_fail (undo_desc != NULL); + + if (! gimp_drawable_mask_intersect (drawable, + &rect.x, &rect.y, + &rect.width, &rect.height)) + return; + + gegl = gegl_node_new (); + input = gegl_node_new_child (gegl, + "operation", "gimp-tilemanager-source", + "tile-manager", gimp_drawable_get_tiles (drawable), + "linear", linear, + NULL); + output = gegl_node_new_child (gegl, + "operation", "gimp-tilemanager-sink", + "tile-manager", gimp_drawable_get_shadow_tiles (drawable), + "linear", linear, + NULL); + + gegl_node_add_child (gegl, operation); + + gegl_node_link_many (input, operation, output, NULL); + + processor = gegl_node_new_processor (output, &rect); + + if (progress) + gimp_progress_start (progress, undo_desc, FALSE); + + while (gegl_processor_work (processor, &value)) + if (progress) + gimp_progress_set_value (progress, value); + + g_object_unref (processor); + + gimp_drawable_merge_shadow (drawable, TRUE, undo_desc); + gimp_drawable_update (drawable, rect.x, rect.y, rect.width, rect.height); + + if (progress) + gimp_progress_end (progress); + + g_object_unref (gegl); +} diff --git a/app/core/gimpdrawable-operation.h b/app/core/gimpdrawable-operation.h new file mode 100644 index 0000000000..1143f40c43 --- /dev/null +++ b/app/core/gimpdrawable-operation.h @@ -0,0 +1,35 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * gimpdrawable-operation.h + * Copyright (C) 2007 Øyvind Kolås + * Sven Neumann + * Michael Natterer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __GIMP_DRAWABLE_OPERATION_H__ +#define __GIMP_DRAWABLE_OPERATION_H__ + + +void gimp_drawable_apply_operation (GimpDrawable *drawable, + GeglNode *operation, + gboolean linear, + GimpProgress *progress, + const gchar *undo_desc); + + +#endif /* __GIMP_DRAWABLE_OPERATION_H__ */