app: return GeglBuffer from gimp_image_contiguous_region_foo()

now all intermediate masks should be in "Y float" and avoid all
conversions.
This commit is contained in:
Michael Natterer 2013-04-09 01:38:24 +02:00
parent ddc4a057e4
commit 46f74d9f46
8 changed files with 86 additions and 104 deletions

View File

@ -497,10 +497,10 @@ gimp_channel_select_fuzzy (GimpChannel *channel,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpItem *item;
GimpChannel *add_on;
gint add_on_x = 0;
gint add_on_y = 0;
GimpItem *item;
GeglBuffer *add_on;
gint add_on_x = 0;
gint add_on_y = 0;
g_return_if_fail (GIMP_IS_CHANNEL (channel));
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)));
@ -520,12 +520,12 @@ gimp_channel_select_fuzzy (GimpChannel *channel,
if (! sample_merged)
gimp_item_get_offset (GIMP_ITEM (drawable), &add_on_x, &add_on_y);
gimp_channel_select_channel (channel, C_("undo-type", "Fuzzy Select"),
add_on, add_on_x, add_on_y,
op,
feather,
feather_radius_x,
feather_radius_y);
gimp_channel_select_buffer (channel, C_("undo-type", "Fuzzy Select"),
add_on, add_on_x, add_on_y,
op,
feather,
feather_radius_x,
feather_radius_y);
g_object_unref (add_on);
}
@ -543,10 +543,10 @@ gimp_channel_select_by_color (GimpChannel *channel,
gdouble feather_radius_x,
gdouble feather_radius_y)
{
GimpItem *item;
GimpChannel *add_on;
gint add_on_x = 0;
gint add_on_y = 0;
GimpItem *item;
GeglBuffer *add_on;
gint add_on_x = 0;
gint add_on_y = 0;
g_return_if_fail (GIMP_IS_CHANNEL (channel));
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)));
@ -567,11 +567,11 @@ gimp_channel_select_by_color (GimpChannel *channel,
if (! sample_merged)
gimp_item_get_offset (GIMP_ITEM (drawable), &add_on_x, &add_on_y);
gimp_channel_select_channel (channel, C_("undo-type", "Select by Color"),
add_on, add_on_x, add_on_y,
op,
feather,
feather_radius_x,
feather_radius_y);
gimp_channel_select_buffer (channel, C_("undo-type", "Select by Color"),
add_on, add_on_x, add_on_y,
op,
feather,
feather_radius_x,
feather_radius_y);
g_object_unref (add_on);
}

View File

@ -28,10 +28,11 @@
#include "core-types.h"
#include "gegl/gimp-gegl-apply-operation.h"
#include "gegl/gimp-gegl-mask.h"
#include "gegl/gimp-gegl-mask-combine.h"
#include "gegl/gimp-gegl-utils.h"
#include "gimp.h"
#include "gimpchannel.h"
#include "gimpchannel-combine.h"
#include "gimpcontext.h"
#include "gimpdrawable.h"
@ -136,7 +137,6 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
GimpPattern *pattern)
{
GimpImage *image;
GimpChannel *mask;
GeglBuffer *buffer;
GeglBuffer *mask_buffer;
gint x1, y1, x2, y2;
@ -164,31 +164,33 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
* contiguous region. If there is a selection, calculate the
* intersection of this region with the existing selection.
*/
mask = gimp_image_contiguous_region_by_seed (image, drawable,
sample_merged,
TRUE,
threshold,
fill_transparent,
fill_criterion,
(gint) x,
(gint) y);
mask_buffer = gimp_image_contiguous_region_by_seed (image, drawable,
sample_merged,
TRUE,
threshold,
fill_transparent,
fill_criterion,
(gint) x,
(gint) y);
if (selection)
{
gint off_x = 0;
gint off_y = 0;
GimpDrawable *sel;
gint off_x = 0;
gint off_y = 0;
if (! sample_merged)
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
gimp_channel_combine_mask (mask, gimp_image_get_mask (image),
GIMP_CHANNEL_OP_INTERSECT,
-off_x, -off_y);
sel = GIMP_DRAWABLE (gimp_image_get_mask (image));
gimp_gegl_mask_combine_buffer (mask_buffer,
gimp_drawable_get_buffer (sel),
GIMP_CHANNEL_OP_INTERSECT,
-off_x, -off_y);
}
mask_buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (mask));
gimp_channel_bounds (mask, &x1, &y1, &x2, &y2);
gimp_gegl_mask_bounds (mask_buffer, &x1, &y1, &x2, &y2);
/* make sure we handle the mask correctly if it was sample-merged */
if (sample_merged)
@ -249,7 +251,7 @@ gimp_drawable_bucket_fill_internal (GimpDrawable *drawable,
-mask_offset_x,
-mask_offset_y,
1.0);
g_object_unref (mask);
g_object_unref (mask_buffer);
/* Apply it to the image */
gimp_drawable_apply_buffer (drawable, buffer,

View File

@ -30,7 +30,7 @@
#include "gegl/gimp-babl.h"
#include "gimpchannel.h"
#include "gimpdrawable.h"
#include "gimpimage.h"
#include "gimpimage-contiguous-region.h"
#include "gimppickable.h"
@ -81,7 +81,7 @@ static void find_contiguous_region_helper (GeglBuffer *src_buffer,
/* public functions */
GimpChannel *
GeglBuffer *
gimp_image_contiguous_region_by_seed (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
@ -94,7 +94,6 @@ gimp_image_contiguous_region_by_seed (GimpImage *image,
{
GimpPickable *pickable;
GeglBuffer *src_buffer;
GimpChannel *mask;
GeglBuffer *mask_buffer;
const Babl *format;
gint n_components;
@ -138,28 +137,16 @@ gimp_image_contiguous_region_by_seed (GimpImage *image,
mask_buffer = gegl_buffer_new (gegl_buffer_get_extent (src_buffer),
babl_format ("Y float"));
gegl_buffer_clear (mask_buffer, NULL);
find_contiguous_region_helper (src_buffer, mask_buffer,
format, n_components, has_alpha,
select_transparent, select_criterion,
antialias, threshold,
x, y, start_col);
/* wrap mask_buffer in a drawable and return it */
mask = gimp_channel_new_mask (image,
gegl_buffer_get_width (mask_buffer),
gegl_buffer_get_height (mask_buffer));
gegl_buffer_copy (mask_buffer, NULL,
gimp_drawable_get_buffer (GIMP_DRAWABLE (mask)), NULL);
g_object_unref (mask_buffer);
return mask;
return mask_buffer;
}
GimpChannel *
GeglBuffer *
gimp_image_contiguous_region_by_color (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
@ -177,7 +164,6 @@ gimp_image_contiguous_region_by_color (GimpImage *image,
*/
GeglBufferIterator *iter;
GimpPickable *pickable;
GimpChannel *mask;
GeglBuffer *src_buffer;
GeglBuffer *mask_buffer;
const Babl *format;
@ -218,11 +204,8 @@ gimp_image_contiguous_region_by_color (GimpImage *image,
select_transparent = FALSE;
}
mask = gimp_channel_new_mask (image,
gegl_buffer_get_width (src_buffer),
gegl_buffer_get_height (src_buffer));
mask_buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (mask));
mask_buffer = gegl_buffer_new (gegl_buffer_get_extent (src_buffer),
babl_format ("Y float"));
iter = gegl_buffer_iterator_new (src_buffer,
NULL, 0, format,
@ -253,7 +236,7 @@ gimp_image_contiguous_region_by_color (GimpImage *image,
}
}
return mask;
return mask_buffer;
}

View File

@ -19,24 +19,24 @@
#define __GIMP_IMAGE_CONTIGUOUS_REGION_H__
GimpChannel * gimp_image_contiguous_region_by_seed (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
gboolean antialias,
gfloat threshold,
gboolean select_transparent,
GimpSelectCriterion select_criterion,
gint x,
gint y);
GeglBuffer * gimp_image_contiguous_region_by_seed (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
gboolean antialias,
gfloat threshold,
gboolean select_transparent,
GimpSelectCriterion select_criterion,
gint x,
gint y);
GimpChannel * gimp_image_contiguous_region_by_color (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
gboolean antialias,
gfloat threshold,
gboolean select_transparent,
GimpSelectCriterion select_criterion,
const GimpRGB *color);
GeglBuffer * gimp_image_contiguous_region_by_color (GimpImage *image,
GimpDrawable *drawable,
gboolean sample_merged,
gboolean antialias,
gfloat threshold,
gboolean select_transparent,
GimpSelectCriterion select_criterion,
const GimpRGB *color);
#endif /* __GIMP_IMAGE_CONTIGUOUS_REGION_H__ */

View File

@ -45,8 +45,8 @@
#include "gimp-intl.h"
static GimpChannel * gimp_by_color_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display);
static GeglBuffer * gimp_by_color_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display);
G_DEFINE_TYPE (GimpByColorSelectTool, gimp_by_color_select_tool,
@ -91,7 +91,7 @@ gimp_by_color_select_tool_init (GimpByColorSelectTool *by_color_select)
gimp_tool_control_set_tool_cursor (tool->control, GIMP_TOOL_CURSOR_HAND);
}
static GimpChannel *
static GeglBuffer *
gimp_by_color_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display)
{

View File

@ -43,8 +43,8 @@
#include "gimp-intl.h"
static GimpChannel * gimp_fuzzy_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display);
static GeglBuffer * gimp_fuzzy_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display);
G_DEFINE_TYPE (GimpFuzzySelectTool, gimp_fuzzy_select_tool,
@ -90,7 +90,7 @@ gimp_fuzzy_select_tool_init (GimpFuzzySelectTool *fuzzy_select)
GIMP_TOOL_CURSOR_FUZZY_SELECT);
}
static GimpChannel *
static GeglBuffer *
gimp_fuzzy_select_tool_get_mask (GimpRegionSelectTool *region_select,
GimpDisplay *display)
{

View File

@ -217,15 +217,15 @@ gimp_region_select_tool_button_release (GimpTool *tool,
gimp_item_get_offset (GIMP_ITEM (drawable), &off_x, &off_y);
}
gimp_channel_select_channel (gimp_image_get_mask (image),
GIMP_REGION_SELECT_TOOL_GET_CLASS (tool)->undo_desc,
region_sel->region_mask,
off_x,
off_y,
sel_options->operation,
sel_options->feather,
sel_options->feather_radius,
sel_options->feather_radius);
gimp_channel_select_buffer (gimp_image_get_mask (image),
GIMP_REGION_SELECT_TOOL_GET_CLASS (tool)->undo_desc,
region_sel->region_mask,
off_x,
off_y,
sel_options->operation,
sel_options->feather,
sel_options->feather_radius,
sel_options->feather_radius);
gimp_image_flush (image);
@ -343,7 +343,6 @@ gimp_region_select_tool_calculate (GimpRegionSelectTool *region_sel,
gint *n_segs)
{
GimpDisplayShell *shell = gimp_display_get_shell (display);
GeglBuffer *buffer;
GimpBoundSeg *segs;
gimp_display_shell_set_override_cursor (shell, GDK_WATCH);
@ -366,14 +365,12 @@ gimp_region_select_tool_calculate (GimpRegionSelectTool *region_sel,
/* calculate and allocate a new segment array which represents the
* boundary of the contiguous region
*/
buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (region_sel->region_mask));
segs = gimp_boundary_find (buffer, NULL,
segs = gimp_boundary_find (region_sel->region_mask, NULL,
babl_format ("Y float"),
GIMP_BOUNDARY_WITHIN_BOUNDS,
0, 0,
gimp_item_get_width (GIMP_ITEM (region_sel->region_mask)),
gimp_item_get_height (GIMP_ITEM (region_sel->region_mask)),
gegl_buffer_get_width (region_sel->region_mask),
gegl_buffer_get_height (region_sel->region_mask),
GIMP_BOUNDARY_HALF_WAY,
n_segs);

View File

@ -44,7 +44,7 @@ struct _GimpRegionSelectTool
gint x, y;
gdouble saved_threshold;
GimpChannel *region_mask;
GeglBuffer *region_mask;
GimpBoundSeg *segs;
gint n_segs;
};
@ -55,8 +55,8 @@ struct _GimpRegionSelectToolClass
const gchar * undo_desc;
GimpChannel * (* get_mask) (GimpRegionSelectTool *region_tool,
GimpDisplay *display);
GeglBuffer * (* get_mask) (GimpRegionSelectTool *region_tool,
GimpDisplay *display);
};