Commit 99e78c70 authored by Michael Natterer's avatar Michael Natterer 😴 Committed by Michael Natterer

General cleanup of the selection tools and their PDB wrappers:

2001-10-22  Michael Natterer  <mitch@gimp.org>

	General cleanup of the selection tools and their PDB wrappers:

	* app/core/Makefile.am
	* app/core/gimpimage-contiguous-region.[ch]
	* app/core/gimpimage-mask-select.[ch]: new files providing a clean,
	uniform API for the selection functionalities. Changed order of
	parameters to be consistent, removed code duplication.

	The region returned by the "by_color" function is not really
	contiguous but the API is so similar to "by_seed" and it's used
	in the same context so it's fair enough to put them together.

	Also, I'm not sure if the two is_pixel_sufficiently_different()
	I've optimized away were meant to do *exactly* the same. Added
	a comment there to remember the former difference.

	* app/core/gimpchannel.[ch] (gimp_channel_feather): removed the
	"output" channel parameter and made it optionally push an undo
	(like the other channel operations do).

	* app/core/gimpimage-mask.c: call gimp_channel_feather() with
	"push_undo == TRUE", removed some useless comments.

	* app/tools/gimpbycolorselecttool.[ch]
	* app/tools/gimpellipseselecttool.[ch]
	* app/tools/gimpfreeselecttool.[ch]
	* app/tools/gimpfuzzyselecttool.[ch]
	* app/tools/gimprectselecttool.[ch]: removed all the actual
	selection functionality and call the new gimp_image_mask_select_*()
	and gimp_image_contiguous_region_*() functions instead.

	* app/tools/gimpbezierselecttool.c
	* app/tools/gimpiscissorstool.c: use new function
	gimp_image_mask_select_channel() instead of doing the same manually.

	* app/tools/gimpbucketfilltool.c: find_contiguous_region() ->
	gimp_image_contiguous_region_by_seed().

	* tools/pdbgen/Makefile.am
	* tools/pdbgen/groups.pl
	* tools/pdbgen/pdb/selection_tools.pdb: added new group "Selection
	Tools" which depends only on "core/" stuff (not on "tools/" any
	more, brrrr).

	* tools/pdbgen/pdb/text_tool.pdb: don't include "appenv.h"

	* tools/pdbgen/pdb/tools.pdb: removed the selection tools.

	* app/pdb/Makefile.am
	* app/pdb/selection_tools_cmds.c: new file.

	* app/pdb/internal_procs.c
	* app/pdb/text_tool_cmds.c
	* app/pdb/tools_cmds.c: regenerated.

	* libgimp/Makefile.am
	* libgimp/gimp_pdb.h
	* libgimp/gimpselectiontools_pdb.[ch]: new files.

	* libgimp/gimptools_pdb.[ch]: regenerated

	Misc cleanups:

	* app/app_procs.c: call splash_create() with "no_splash_image"
	as parameter.

	* app/display/gimpdisplay-render.c
	* app/display/gximage.c: don't include "appenv.h".

	* app/gui/gui.c: call session_restore() only if "restore_session"
	is TRUE.

	* app/gui/session.c: don't "if(restore_session)" here and don't
	include "appenv.h"

	* app/gui/splash.[ch]: added "gboolean show_image" parameter to
	splash_create(), don't include "appenv.h"

	* app/tools/gimppainttool.[ch]: added a "GimpGradient" parameter
	to gimp_paint_tool_get_color_from_gradient().

	* app/tools/gimppaintbrushtool.c: pass the gradient.

	* app/tools/gimpselectiontool.c
	* app/tools/gimptransformtool.c
	* app/tools/tool_manager.c: s/GDisplay/GimpDisplay/.

	* app/widgets/gimpcontainergridview.[ch]: removed the "white_style"
	class variable and don't fiddle around with colors and styles...

	* themes/Default/gtkrc: ...do the same here with a simple rc style.
parent 6b654544
2001-10-22 Michael Natterer <mitch@gimp.org>
General cleanup of the selection tools and their PDB wrappers:
* app/core/Makefile.am
* app/core/gimpimage-contiguous-region.[ch]
* app/core/gimpimage-mask-select.[ch]: new files providing a clean,
uniform API for the selection functionalities. Changed order of
parameters to be consistent, removed code duplication.
The region returned by the "by_color" function is not really
contiguous but the API is so similar to "by_seed" and it's used
in the same context so it's fair enough to put them together.
Also, I'm not sure if the two is_pixel_sufficiently_different()
I've optimized away were meant to do *exactly* the same. Added
a comment there to remember the former difference.
* app/core/gimpchannel.[ch] (gimp_channel_feather): removed the
"output" channel parameter and made it optionally push an undo
(like the other channel operations do).
* app/core/gimpimage-mask.c: call gimp_channel_feather() with
"push_undo == TRUE", removed some useless comments.
* app/tools/gimpbycolorselecttool.[ch]
* app/tools/gimpellipseselecttool.[ch]
* app/tools/gimpfreeselecttool.[ch]
* app/tools/gimpfuzzyselecttool.[ch]
* app/tools/gimprectselecttool.[ch]: removed all the actual
selection functionality and call the new gimp_image_mask_select_*()
and gimp_image_contiguous_region_*() functions instead.
* app/tools/gimpbezierselecttool.c
* app/tools/gimpiscissorstool.c: use new function
gimp_image_mask_select_channel() instead of doing the same manually.
* app/tools/gimpbucketfilltool.c: find_contiguous_region() ->
gimp_image_contiguous_region_by_seed().
* tools/pdbgen/Makefile.am
* tools/pdbgen/groups.pl
* tools/pdbgen/pdb/selection_tools.pdb: added new group "Selection
Tools" which depends only on "core/" stuff (not on "tools/" any
more, brrrr).
* tools/pdbgen/pdb/text_tool.pdb: don't include "appenv.h"
* tools/pdbgen/pdb/tools.pdb: removed the selection tools.
* app/pdb/Makefile.am
* app/pdb/selection_tools_cmds.c: new file.
* app/pdb/internal_procs.c
* app/pdb/text_tool_cmds.c
* app/pdb/tools_cmds.c: regenerated.
* libgimp/Makefile.am
* libgimp/gimp_pdb.h
* libgimp/gimpselectiontools_pdb.[ch]: new files.
* libgimp/gimptools_pdb.[ch]: regenerated
Misc cleanups:
* app/app_procs.c: call splash_create() with "no_splash_image"
as parameter.
* app/display/gimpdisplay-render.c
* app/display/gximage.c: don't include "appenv.h".
* app/gui/gui.c: call session_restore() only if "restore_session"
is TRUE.
* app/gui/session.c: don't "if(restore_session)" here and don't
include "appenv.h"
* app/gui/splash.[ch]: added "gboolean show_image" parameter to
splash_create(), don't include "appenv.h"
* app/tools/gimppainttool.[ch]: added a "GimpGradient" parameter
to gimp_paint_tool_get_color_from_gradient().
* app/tools/gimppaintbrushtool.c: pass the gradient.
* app/tools/gimpselectiontool.c
* app/tools/gimptransformtool.c
* app/tools/tool_manager.c: s/GDisplay/GimpDisplay/.
* app/widgets/gimpcontainergridview.[ch]: removed the "white_style"
class variable and don't fiddle around with colors and styles...
* themes/Default/gtkrc: ...do the same here with a simple rc style.
2001-10-19 Michael Natterer <mitch@gimp.org>
* app/Makefile.am: link the app in a different order as some init
......
......@@ -137,7 +137,7 @@ app_init (gint gimp_argc,
get_standard_colormaps ();
if (! no_splash)
splash_create ();
splash_create (! no_splash_image);
}
/* initialize lowlevel stuff */
......
......@@ -68,6 +68,8 @@ libappcore_a_sources = @STRIP_BEGIN@ \
gimpimage.h \
gimpimage-colorhash.c \
gimpimage-colorhash.h \
gimpimage-contiguous-region.c \
gimpimage-contiguous-region.h \
gimpimage-convert.c \
gimpimage-convert.h \
gimpimage-convert-fsdither.h \
......@@ -77,6 +79,8 @@ libappcore_a_sources = @STRIP_BEGIN@ \
gimpimage-duplicate.h \
gimpimage-mask.c \
gimpimage-mask.h \
gimpimage-mask-select.c \
gimpimage-mask-select.h \
gimpimage-new.c \
gimpimage-new.h \
gimpimage-undo.c \
......
......@@ -95,11 +95,11 @@ enum
/* forward function declarations */
static void gimp_transform_tool_bounds (GimpTransformTool *tool,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_recalc (GimpTransformTool *tool,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_doit (GimpTransformTool *tool,
GDisplay *gdisp);
GimpDisplay *gdisp);
static gdouble gimp_transform_tool_cubic (gdouble dx,
gint jm1,
gint j,
......@@ -114,23 +114,23 @@ static void gimp_transform_tool_finalize (GObject *object);
static void gimp_transform_tool_button_press (GimpTool *tool,
GdkEventButton *bevent,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_button_release (GimpTool *tool,
GdkEventButton *bevent,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_motion (GimpTool *tool,
GdkEventMotion *mevent,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_cursor_update (GimpTool *tool,
GdkEventMotion *mevent,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_control (GimpTool *tool,
ToolAction action,
GDisplay *gdisp);
GimpDisplay *gdisp);
static void gimp_transform_tool_draw (GimpDrawTool *draw_tool);
......@@ -234,7 +234,7 @@ gimp_transform_tool_init (GimpTransformTool *tr_tool)
TileManager *
gimp_transform_tool_transform (GimpTransformTool *tool,
GDisplay *gdisp,
GimpDisplay *gdisp,
TransformState state)
{
TileManager *retval;
......@@ -319,9 +319,9 @@ gimp_transform_tool_finalize (GObject *object)
}
static void
gimp_transform_tool_control (GimpTool *tool,
ToolAction action,
GDisplay *gdisp)
gimp_transform_tool_control (GimpTool *tool,
ToolAction action,
GimpDisplay *gdisp)
{
GimpDrawTool *dr_tool;
GimpTransformTool *tr_tool;
......@@ -351,9 +351,9 @@ gimp_transform_tool_control (GimpTool *tool,
}
static void
gimp_transform_tool_button_press (GimpTool *tool,
GdkEventButton *bevent,
GDisplay *gdisp)
gimp_transform_tool_button_press (GimpTool *tool,
GdkEventButton *bevent,
GimpDisplay *gdisp)
{
GimpTransformTool *gt_tool;
GimpDrawable *drawable;
......@@ -529,9 +529,9 @@ gimp_transform_tool_button_press (GimpTool *tool,
}
static void
gimp_transform_tool_button_release (GimpTool *tool,
GdkEventButton *bevent,
GDisplay *gdisp)
gimp_transform_tool_button_release (GimpTool *tool,
GdkEventButton *bevent,
GimpDisplay *gdisp)
{
GimpTransformTool *gt_tool;
gint i;
......@@ -590,7 +590,7 @@ gimp_transform_tool_button_release (GimpTool *tool,
static void
gimp_transform_tool_doit (GimpTransformTool *gt_tool,
GDisplay *gdisp)
GimpDisplay *gdisp)
{
GimpTool *tool;
TileManager *new_tiles;
......@@ -710,9 +710,9 @@ gimp_transform_tool_doit (GimpTransformTool *gt_tool,
}
static void
gimp_transform_tool_motion (GimpTool *tool,
GdkEventMotion *mevent,
GDisplay *gdisp)
gimp_transform_tool_motion (GimpTool *tool,
GdkEventMotion *mevent,
GimpDisplay *gdisp)
{
GimpTransformTool *tr_tool;
......@@ -747,9 +747,9 @@ gimp_transform_tool_motion (GimpTool *tool,
}
static void
gimp_transform_tool_cursor_update (GimpTool *tool,
GdkEventMotion *mevent,
GDisplay *gdisp)
gimp_transform_tool_cursor_update (GimpTool *tool,
GdkEventMotion *mevent,
GimpDisplay *gdisp)
{
GimpTransformTool *tr_tool;
GimpDrawable *drawable;
......@@ -790,7 +790,7 @@ gimp_transform_tool_cursor_update (GimpTool *tool,
static void
gimp_transform_tool_draw (GimpDrawTool *dr_tool)
{
GDisplay *gdisp;
GimpDisplay *gdisp;
GimpTransformTool *tr_tool;
GimpTool *tool;
gint x1, y1, x2, y2, x3, y3, x4, y4;
......@@ -942,7 +942,7 @@ gimp_transform_tool_transform_bounding_box (GimpTransformTool *tr_tool)
void
gimp_transform_tool_reset (GimpTransformTool *tr_tool,
GDisplay *gdisp)
GimpDisplay *gdisp)
{
GimpTool *tool;
......@@ -966,11 +966,11 @@ gimp_transform_tool_reset (GimpTransformTool *tr_tool,
static void
gimp_transform_tool_bounds (GimpTransformTool *tr_tool,
GDisplay *gdisp)
GimpDisplay *gdisp)
{
TileManager *tiles;
GimpDrawable *drawable;
gint offset_x, offset_y;
TileManager *tiles;
GimpDrawable *drawable;
gint offset_x, offset_y;
tiles = tr_tool->original;
drawable = gimp_image_active_drawable (gdisp->gimage);
......@@ -1115,7 +1115,7 @@ gimp_transform_tool_setup_grid (GimpTransformTool *tr_tool)
static void
gimp_transform_tool_recalc (GimpTransformTool *tr_tool,
GDisplay *gdisp)
GimpDisplay *gdisp)
{
gimp_transform_tool_bounds (tr_tool, gdisp);
......
......@@ -1174,35 +1174,27 @@ gimp_channel_combine_mask (GimpChannel *mask,
}
void
gimp_channel_feather (GimpChannel *input,
GimpChannel *output,
gimp_channel_feather (GimpChannel *mask,
gdouble radius_x,
gdouble radius_y,
ChannelOps op,
gint off_x,
gint off_y)
gboolean push_undo)
{
gint x1, y1, x2, y2;
PixelRegion srcPR;
g_return_if_fail (GIMP_IS_CHANNEL (input));
g_return_if_fail (GIMP_IS_CHANNEL (output));
g_return_if_fail (GIMP_IS_CHANNEL (mask));
g_return_if_fail (push_undo && gimp_drawable_gimage (GIMP_DRAWABLE (mask)));
x1 = CLAMP (off_x, 0, GIMP_DRAWABLE (output)->width);
y1 = CLAMP (off_y, 0, GIMP_DRAWABLE (output)->height);
x2 = CLAMP (off_x + GIMP_DRAWABLE (input)->width, 0,
GIMP_DRAWABLE (output)->width);
y2 = CLAMP (off_y + GIMP_DRAWABLE (input)->height, 0,
GIMP_DRAWABLE (output)->height);
if (push_undo)
gimp_channel_push_undo (mask);
pixel_region_init (&srcPR, GIMP_DRAWABLE (input)->tiles,
(x1 - off_x), (y1 - off_y), (x2 - x1), (y2 - y1), FALSE);
pixel_region_init (&srcPR, GIMP_DRAWABLE (mask)->tiles,
0, 0,
gimp_drawable_width (GIMP_DRAWABLE (mask)),
gimp_drawable_height (GIMP_DRAWABLE (mask)),
FALSE);
gaussian_blur_region (&srcPR, radius_x, radius_y);
if (input != output)
gimp_channel_combine_mask (output, input, op, 0, 0);
output->bounds_known = FALSE;
mask->bounds_known = FALSE;
}
void
......
......@@ -32,6 +32,7 @@
#define GIMP_CHANNEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CHANNEL, GimpChannelClass))
#define GIMP_IS_CHANNEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CHANNEL))
#define GIMP_IS_CHANNEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CHANNEL))
#define GIMP_CHANNEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CHANNEL, GimpChannelClass))
typedef struct _GimpChannelClass GimpChannelClass;
......@@ -162,13 +163,10 @@ void gimp_channel_combine_mask (GimpChannel *mask,
ChannelOps op,
gint off_x,
gint off_y);
void gimp_channel_feather (GimpChannel *input,
GimpChannel *output,
void gimp_channel_feather (GimpChannel *mask,
gdouble radius_x,
gdouble radius_y,
ChannelOps op,
gint off_x,
gint off_y);
gboolean push_undo);
void gimp_channel_push_undo (GimpChannel *mask);
void gimp_channel_clear (GimpChannel *mask);
......
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* 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 <glib-object.h>
#include "core-types.h"
#include "gimpchannel.h"
#include "gimpimage.h"
#include "gimpimage-contiguous-region.h"
#include "gimpimage-mask.h"
#include "gimpimage-mask-select.h"
#include "gimpscanconvert.h"
void
gimp_image_mask_select_rectangle (GimpImage *gimage,
gint x,
gint y,
gint w,
gint h,
ChannelOps op,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpChannel *new_mask;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
/* if applicable, replace the current selection */
if (op == CHANNEL_OP_REPLACE)
gimage_mask_clear (gimage);
else
gimage_mask_undo (gimage);
/* if feathering for rect, make a new mask with the
* rectangle and feather that with the old mask
*/
if (feather)
{
new_mask = gimp_channel_new_mask (gimage, gimage->width, gimage->height);
gimp_channel_combine_rect (new_mask, CHANNEL_OP_ADD, x, y, w, h);
gimp_channel_feather (new_mask,
feather_radius_x,
feather_radius_y,
FALSE /* no undo */);
gimp_channel_combine_mask (gimp_image_get_mask (gimage), new_mask,
op, 0, 0);
g_object_unref (G_OBJECT (new_mask));
}
else if (op == CHANNEL_OP_INTERSECT)
{
new_mask = gimp_channel_new_mask (gimage, gimage->width, gimage->height);
gimp_channel_combine_rect (new_mask, CHANNEL_OP_ADD, x, y, w, h);
gimp_channel_combine_mask (gimp_image_get_mask (gimage), new_mask,
op, 0, 0);
g_object_unref (G_OBJECT (new_mask));
}
else
{
gimp_channel_combine_rect (gimp_image_get_mask (gimage), op, x, y, w, h);
}
}
void
gimp_image_mask_select_ellipse (GimpImage *gimage,
gint x,
gint y,
gint w,
gint h,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpChannel *new_mask;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
/* if applicable, replace the current selection */
if (op == CHANNEL_OP_REPLACE)
gimage_mask_clear (gimage);
else
gimage_mask_undo (gimage);
/* if feathering for rect, make a new mask with the
* rectangle and feather that with the old mask
*/
if (feather)
{
new_mask = gimp_channel_new_mask (gimage, gimage->width, gimage->height);
gimp_channel_combine_ellipse (new_mask, CHANNEL_OP_ADD,
x, y, w, h, antialias);
gimp_channel_feather (new_mask,
feather_radius_x,
feather_radius_y,
FALSE /* no undo */);
gimp_channel_combine_mask (gimp_image_get_mask (gimage), new_mask,
op, 0, 0);
g_object_unref (G_OBJECT (new_mask));
}
else if (op == CHANNEL_OP_INTERSECT)
{
new_mask = gimp_channel_new_mask (gimage, gimage->width, gimage->height);
gimp_channel_combine_ellipse (new_mask, CHANNEL_OP_ADD,
x, y, w, h, antialias);
gimp_channel_combine_mask (gimp_image_get_mask (gimage), new_mask,
op, 0, 0);
g_object_unref (G_OBJECT (new_mask));
}
else
{
gimp_channel_combine_ellipse (gimp_image_get_mask (gimage), op,
x, y, w, h, antialias);
}
}
void
gimp_image_mask_select_polygon (GimpImage *gimage,
gint n_points,
GimpVector2 *points,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpChannel *mask;
GimpScanConvert *scan_convert;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
/* if applicable, replace the current selection */
/* or insure that a floating selection is anchored down... */
if (op == CHANNEL_OP_REPLACE)
gimage_mask_clear (gimage);
else
gimage_mask_undo (gimage);
#define SUPERSAMPLE 3
scan_convert = gimp_scan_convert_new (gimage->width,
gimage->height,
antialias ? SUPERSAMPLE : 1);
gimp_scan_convert_add_points (scan_convert, n_points, points);
mask = gimp_scan_convert_to_channel (scan_convert, gimage);
gimp_scan_convert_free (scan_convert);
#undef SUPERSAMPLE
if (mask)
{
if (feather)
gimp_channel_feather (mask,
feather_radius_x,
feather_radius_y,
FALSE /* no undo */);
gimp_channel_combine_mask (gimp_image_get_mask (gimage),
mask, op, 0, 0);
g_object_unref (G_OBJECT (mask));
}
}
void
gimp_image_mask_select_channel (GimpImage *gimage,
GimpDrawable *drawable,
gboolean sample_merged,
GimpChannel *channel,
ChannelOps op,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
gint off_x, off_y;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail ((! drawable && ! sample_merged) || GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (GIMP_IS_CHANNEL (channel));
/* if applicable, replace the current selection */
if (op == CHANNEL_OP_REPLACE)
gimage_mask_clear (gimage);
else
gimage_mask_undo (gimage);
if (sample_merged)
{
off_x = off_y = 0;
}
else
{
gimp_drawable_offsets (drawable, &off_x, &off_y);
}
if (feather)
gimp_channel_feather (channel,
feather_radius_x,
feather_radius_y,
FALSE /* no undo */);
gimp_channel_combine_mask (gimp_image_get_mask (gimage),
channel,
op,
off_x, off_y);
}
void
gimp_image_mask_select_fuzzy (GimpImage *gimage,
GimpDrawable *drawable,
gboolean sample_merged,
gint x,
gint y,
gint threshold,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpChannel *mask;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
mask = gimp_image_contiguous_region_by_seed (gimage, drawable,
sample_merged,
antialias,
threshold,
x, y);
gimp_image_mask_select_channel (gimage,
drawable,
sample_merged,
mask,
op,
feather,
feather_radius_x,
feather_radius_y);
g_object_unref (G_OBJECT (mask));
}
void
gimp_image_mask_select_by_color (GimpImage *gimage,
GimpDrawable *drawable,
gboolean sample_merged,
const GimpRGB *color,
gint threshold,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpChannel *mask;
g_return_if_fail (GIMP_IS_IMAGE (gimage));
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (color != NULL);
mask = gimp_image_contiguous_region_by_color (gimage, drawable,
sample_merged,
antialias,
threshold,
color);
gimp_image_mask_select_channel (gimage,
drawable,
sample_merged,
mask,
op,
feather,
feather_radius_x,
feather_radius_y);
g_object_unref (G_OBJECT (mask));
}
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* 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_IMAGE_MASK_SELECT_H__
#define __GIMP_IMAGE_MASK_SELECT_H__
void gimp_image_mask_select_rectangle (GimpImage *gimage,
gint x,
gint y,
gint w,
gint h,
ChannelOps op,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y);
void gimp_image_mask_select_ellipse (GimpImage *gimage,
gint x,
gint y,
gint w,
gint h,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y);
void gimp_image_mask_select_polygon (GimpImage *gimage,
gint n_points,
GimpVector2 *points,
ChannelOps op,
gboolean antialias,
gboolean feather,
gdouble feather_radius_x,
gdouble feather_radius_y);
void gimp_image_mask_select_channel (GimpImage