app: change GimpDrawable::replace_region() by ::replace_buffer()

This commit is contained in:
Michael Natterer 2012-03-23 12:31:21 +01:00
parent a4c83d13ed
commit 061e044e0a
6 changed files with 80 additions and 49 deletions

View File

@ -149,8 +149,9 @@ static void gimp_channel_apply_buffer (GimpDrawable *drawable,
PixelRegion *destPR,
gint x,
gint y);
static void gimp_channel_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
static void gimp_channel_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
@ -289,7 +290,7 @@ gimp_channel_class_init (GimpChannelClass *klass)
drawable_class->invalidate_boundary = gimp_channel_invalidate_boundary;
drawable_class->get_active_components = gimp_channel_get_active_components;
drawable_class->apply_buffer = gimp_channel_apply_buffer;
drawable_class->replace_region = gimp_channel_replace_region;
drawable_class->replace_buffer = gimp_channel_replace_buffer;
drawable_class->project_region = gimp_channel_project_region;
drawable_class->set_buffer = gimp_channel_set_buffer;
drawable_class->swap_pixels = gimp_channel_swap_pixels;
@ -831,18 +832,20 @@ gimp_channel_apply_buffer (GimpDrawable *drawable,
}
static void
gimp_channel_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint x,
gint y)
gimp_channel_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint x,
gint y)
{
gimp_drawable_invalidate_boundary (drawable);
GIMP_DRAWABLE_CLASS (parent_class)->replace_region (drawable, src2PR,
GIMP_DRAWABLE_CLASS (parent_class)->replace_buffer (drawable, buffer,
buffer_region,
push_undo, undo_desc,
opacity,
maskPR,

View File

@ -206,24 +206,43 @@ gimp_drawable_real_apply_buffer (GimpDrawable *drawable,
* Takes an additional mask pixel region as well.
*/
void
gimp_drawable_real_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint dest_x,
gint dest_y)
gimp_drawable_real_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint dest_x,
gint dest_y)
{
GimpItem *item = GIMP_ITEM (drawable);
GimpImage *image = gimp_item_get_image (item);
GimpChannel *mask = gimp_image_get_mask (image);
TempBuf *temp_buf;
PixelRegion src2PR;
gint x, y, width, height;
gint offset_x, offset_y;
PixelRegion src1PR, destPR;
CombinationMode operation;
gboolean active_components[MAX_CHANNELS];
temp_buf = gimp_gegl_buffer_get_temp_buf (buffer);
if (temp_buf)
{
pixel_region_init_temp_buf (&src2PR, temp_buf,
buffer_region->x, buffer_region->y,
buffer_region->width, buffer_region->height);
}
else
{
pixel_region_init (&src2PR, gimp_gegl_buffer_get_tiles (buffer),
buffer_region->x, buffer_region->y,
buffer_region->width, buffer_region->height,
FALSE);
}
/* don't apply the mask to itself and don't apply an empty mask */
if (GIMP_DRAWABLE (mask) == drawable || gimp_channel_is_empty (mask))
mask = NULL;
@ -235,7 +254,7 @@ gimp_drawable_real_replace_region (GimpDrawable *drawable,
* if it's actually legal...
*/
operation = gimp_image_get_combination_mode (gimp_drawable_type (drawable),
src2PR->bytes);
src2PR.bytes);
if (operation == -1)
{
g_warning ("%s: illegal parameters.", G_STRFUNC);
@ -246,7 +265,7 @@ gimp_drawable_real_replace_region (GimpDrawable *drawable,
gimp_item_get_offset (item, &offset_x, &offset_y);
/* make sure the image application coordinates are within drawable bounds */
gimp_rectangle_intersect (dest_x, dest_y, src2PR->w, src2PR->h,
gimp_rectangle_intersect (dest_x, dest_y, src2PR.w, src2PR.h,
0, 0,
gimp_item_get_width (item),
gimp_item_get_height (item),
@ -279,8 +298,8 @@ gimp_drawable_real_replace_region (GimpDrawable *drawable,
pixel_region_init (&destPR, gimp_drawable_get_tiles (drawable),
x, y, width, height,
TRUE);
pixel_region_resize (src2PR,
src2PR->x + (x - dest_x), src2PR->y + (y - dest_y),
pixel_region_resize (&src2PR,
src2PR.x + (x - dest_x), src2PR.y + (y - dest_y),
width, height);
if (mask)
@ -308,7 +327,7 @@ gimp_drawable_real_replace_region (GimpDrawable *drawable,
pixel_region_init_data (&tempPR, temp_data, 1, width,
0, 0, width, height);
combine_regions_replace (&src1PR, src2PR, &destPR, &tempPR, NULL,
combine_regions_replace (&src1PR, &src2PR, &destPR, &tempPR, NULL,
opacity * 255.999,
active_components,
operation);
@ -317,7 +336,7 @@ gimp_drawable_real_replace_region (GimpDrawable *drawable,
}
else
{
combine_regions_replace (&src1PR, src2PR, &destPR, maskPR, NULL,
combine_regions_replace (&src1PR, &src2PR, &destPR, maskPR, NULL,
opacity * 255.999,
active_components,
operation);

View File

@ -32,8 +32,9 @@ void gimp_drawable_real_apply_buffer (GimpDrawable *drawable,
PixelRegion *destPR,
gint x,
gint y);
void gimp_drawable_real_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
void gimp_drawable_real_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,

View File

@ -240,7 +240,7 @@ gimp_drawable_class_init (GimpDrawableClass *klass)
klass->get_active_components = NULL;
klass->convert_type = gimp_drawable_real_convert_type;
klass->apply_buffer = gimp_drawable_real_apply_buffer;
klass->replace_region = gimp_drawable_real_replace_region;
klass->replace_buffer = gimp_drawable_real_replace_buffer;
klass->get_buffer = gimp_drawable_real_get_buffer;
klass->set_buffer = gimp_drawable_real_set_buffer;
klass->push_undo = gimp_drawable_real_push_undo;
@ -1263,21 +1263,23 @@ gimp_drawable_apply_buffer (GimpDrawable *drawable,
}
void
gimp_drawable_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint x,
gint y)
gimp_drawable_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
PixelRegion *maskPR,
gint x,
gint y)
{
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
g_return_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)));
g_return_if_fail (src2PR != NULL);
g_return_if_fail (GEGL_IS_BUFFER (buffer));
g_return_if_fail (maskPR != NULL);
GIMP_DRAWABLE_GET_CLASS (drawable)->replace_region (drawable, src2PR,
GIMP_DRAWABLE_GET_CLASS (drawable)->replace_buffer (drawable, buffer,
buffer_region,
push_undo, undo_desc,
opacity, maskPR,
x, y);

View File

@ -74,8 +74,9 @@ struct _GimpDrawableClass
PixelRegion *destPR,
gint x,
gint y);
void (* replace_region) (GimpDrawable *drawable,
PixelRegion *src2PR,
void (* replace_buffer) (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,
@ -152,8 +153,9 @@ void gimp_drawable_apply_buffer (GimpDrawable *drawable,
PixelRegion *destPR,
gint x,
gint y);
void gimp_drawable_replace_region (GimpDrawable *drawable,
PixelRegion *src2PR,
void gimp_drawable_replace_buffer (GimpDrawable *drawable,
GeglBuffer *buffer,
const GeglRectangle *buffer_region,
gboolean push_undo,
const gchar *undo_desc,
gdouble opacity,

View File

@ -969,7 +969,7 @@ gimp_paint_core_replace (GimpPaintCore *core,
gdouble image_opacity,
GimpPaintApplicationMode mode)
{
PixelRegion srcPR;
GeglBuffer *canvas_buffer;
if (! gimp_drawable_has_alpha (drawable))
{
@ -1012,19 +1012,23 @@ gimp_paint_core_replace (GimpPaintCore *core,
}
/* intialize canvas buf source pixel regions */
pixel_region_init_temp_buf (&srcPR, core->canvas_buf,
0, 0,
core->canvas_buf->width,
core->canvas_buf->height);
canvas_buffer =
gimp_temp_buf_create_buffer (core->canvas_buf,
gimp_drawable_get_format_with_alpha (drawable));
/* apply the paint area to the image */
gimp_drawable_replace_region (drawable, &srcPR,
gimp_drawable_replace_buffer (drawable, canvas_buffer,
GIMP_GEGL_RECT (0, 0,
core->canvas_buf->width,
core->canvas_buf->height),
FALSE, NULL,
image_opacity,
paint_maskPR,
core->canvas_buf->x,
core->canvas_buf->y);
g_object_unref (canvas_buffer);
/* Update the undo extents */
core->x1 = MIN (core->x1, core->canvas_buf->x);
core->y1 = MIN (core->y1, core->canvas_buf->y);