diff --git a/app/paint/gimpbrushcore.c b/app/paint/gimpbrushcore.c index 9670d57db7..1bee5f2bd5 100644 --- a/app/paint/gimpbrushcore.c +++ b/app/paint/gimpbrushcore.c @@ -825,14 +825,22 @@ gimp_brush_core_get_paint_area (GimpPaintCore *paint_core, /* configure the canvas buffer */ if ((x2 - x1) && (y2 - y1)) { - gint bytes; - - bytes = gimp_drawable_bytes_with_alpha (drawable); + const Babl *format = gimp_drawable_get_format_with_alpha (drawable); + gint bytes = babl_format_get_bytes_per_pixel (format); paint_core->paint_area = temp_buf_resize (paint_core->paint_area, bytes, x1, y1, (x2 - x1), (y2 - y1)); + paint_core->paint_buffer_x = x1; + paint_core->paint_buffer_y = y1; + + if (paint_core->paint_buffer) + g_object_unref (paint_core->paint_buffer); + + paint_core->paint_buffer = + gimp_temp_buf_create_buffer (paint_core->paint_area, format); + return paint_core->paint_area; } diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c index 9ab776f36e..2705adef8a 100644 --- a/app/paint/gimpink.c +++ b/app/paint/gimpink.c @@ -204,9 +204,6 @@ gimp_ink_get_paint_area (GimpPaintCore *paint_core, gint width, height; gint dwidth, dheight; gint x1, y1, x2, y2; - gint bytes; - - bytes = gimp_drawable_bytes_with_alpha (drawable); gimp_blob_bounds (ink->cur_blob, &x, &y, &width, &height); @@ -220,13 +217,27 @@ gimp_ink_get_paint_area (GimpPaintCore *paint_core, /* configure the canvas buffer */ if ((x2 - x1) && (y2 - y1)) - paint_core->paint_area = temp_buf_resize (paint_core->paint_area, bytes, - x1, y1, - (x2 - x1), (y2 - y1)); - else - return NULL; + { + const Babl *format = gimp_drawable_get_format_with_alpha (drawable); + gint bytes = babl_format_get_bytes_per_pixel (format); - return paint_core->paint_area; + paint_core->paint_area = temp_buf_resize (paint_core->paint_area, bytes, + x1, y1, + (x2 - x1), (y2 - y1)); + + paint_core->paint_buffer_x = x1; + paint_core->paint_buffer_y = y1; + + if (paint_core->paint_buffer) + g_object_unref (paint_core->paint_buffer); + + paint_core->paint_buffer = + gimp_temp_buf_create_buffer (paint_core->paint_area, format); + + return paint_core->paint_area; + } + + return NULL; } static GimpUndo * diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c index bd5915d8b3..fa8c35f984 100644 --- a/app/paint/gimppaintcore.c +++ b/app/paint/gimppaintcore.c @@ -553,6 +553,12 @@ gimp_paint_core_cleanup (GimpPaintCore *core) temp_buf_free (core->paint_area); core->paint_area = NULL; } + + if (core->paint_buffer) + { + g_object_unref (core->paint_buffer); + core->paint_buffer = NULL; + } } void @@ -671,6 +677,30 @@ gimp_paint_core_get_paint_area (GimpPaintCore *core, coords); } +GeglBuffer * +gimp_paint_core_get_paint_buffer (GimpPaintCore *core, + GimpDrawable *drawable, + GimpPaintOptions *paint_options, + const GimpCoords *coords, + gint *paint_buffer_x, + gint *paint_buffer_y) +{ + g_return_val_if_fail (GIMP_IS_PAINT_CORE (core), NULL); + g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), NULL); + g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (drawable)), NULL); + g_return_val_if_fail (GIMP_IS_PAINT_OPTIONS (paint_options), NULL); + g_return_val_if_fail (coords != NULL, NULL); + g_return_val_if_fail (paint_buffer_x != NULL, NULL); + g_return_val_if_fail (paint_buffer_y != NULL, NULL); + + gimp_paint_core_get_paint_area (core, drawable, paint_options, coords); + + *paint_buffer_x = core->paint_buffer_x; + *paint_buffer_y = core->paint_buffer_y; + + return core->paint_buffer; +} + GeglBuffer * gimp_paint_core_get_orig_image (GimpPaintCore *core) { @@ -699,7 +729,7 @@ gimp_paint_core_paste (GimpPaintCore *core, GimpPaintApplicationMode mode) { GeglBuffer *base_buffer = NULL; - GeglBuffer *canvas_buffer; + gint width, height; /* If the mode is CONSTANT: * combine the canvas buf, the paint mask to the canvas buffer @@ -727,39 +757,33 @@ gimp_paint_core_paste (GimpPaintCore *core, paint_mask_to_paint_area (core, paint_maskPR, paint_opacity); } - /* intialize canvas buf source pixel regions */ - canvas_buffer = - gimp_temp_buf_create_buffer (core->paint_area, - gimp_drawable_get_format_with_alpha (drawable)); + width = gegl_buffer_get_width (core->paint_buffer); + height = gegl_buffer_get_height (core->paint_buffer); /* apply the paint area to the image */ - gimp_drawable_apply_buffer (drawable, canvas_buffer, - GIMP_GEGL_RECT (0, 0, - core->paint_area->width, - core->paint_area->height), + gimp_drawable_apply_buffer (drawable, + core->paint_buffer, + GIMP_GEGL_RECT (0, 0, width, height), FALSE, NULL, image_opacity, paint_mode, base_buffer, /* specify an alternative src1 */ - core->paint_area->x, - core->paint_area->y, + core->paint_buffer_x, + core->paint_buffer_y, NULL, - core->paint_area->x, - core->paint_area->y); - - g_object_unref (canvas_buffer); + core->paint_buffer_x, + core->paint_buffer_y); /* Update the undo extents */ - core->x1 = MIN (core->x1, core->paint_area->x); - core->y1 = MIN (core->y1, core->paint_area->y); - core->x2 = MAX (core->x2, core->paint_area->x + core->paint_area->width); - core->y2 = MAX (core->y2, core->paint_area->y + core->paint_area->height); + core->x1 = MIN (core->x1, core->paint_buffer_x); + core->y1 = MIN (core->y1, core->paint_buffer_y); + core->x2 = MAX (core->x2, core->paint_buffer_x + width); + core->y2 = MAX (core->y2, core->paint_buffer_y + height); /* Update the drawable */ gimp_drawable_update (drawable, - core->paint_area->x, - core->paint_area->y, - core->paint_area->width, - core->paint_area->height); + core->paint_buffer_x, + core->paint_buffer_y, + width, height); } /* This works similarly to gimp_paint_core_paste. However, instead of @@ -778,7 +802,7 @@ gimp_paint_core_replace (GimpPaintCore *core, gdouble image_opacity, GimpPaintApplicationMode mode) { - GeglBuffer *canvas_buffer; + gint width, height; if (! gimp_drawable_has_alpha (drawable)) { @@ -789,6 +813,9 @@ gimp_paint_core_replace (GimpPaintCore *core, return; } + width = gegl_buffer_get_width (core->paint_buffer); + height = gegl_buffer_get_height (core->paint_buffer); + if (mode == GIMP_PAINT_CONSTANT) { /* Some tools (ink) paint the mask to paint_core->canvas_buffer @@ -803,10 +830,9 @@ gimp_paint_core_replace (GimpPaintCore *core, /* initialize the maskPR from the canvas buffer */ pixel_region_init (paint_maskPR, gimp_gegl_buffer_get_tiles (core->canvas_buffer), - core->paint_area->x, - core->paint_area->y, - core->paint_area->width, - core->paint_area->height, + core->paint_buffer_x, + core->paint_buffer_y, + width, height, FALSE); } } @@ -815,36 +841,26 @@ gimp_paint_core_replace (GimpPaintCore *core, /* The mask is just the paint_maskPR */ } - /* intialize canvas buf source pixel regions */ - canvas_buffer = - gimp_temp_buf_create_buffer (core->paint_area, - gimp_drawable_get_format_with_alpha (drawable)); - /* apply the paint area to the image */ - gimp_drawable_replace_buffer (drawable, canvas_buffer, - GIMP_GEGL_RECT (0, 0, - core->paint_area->width, - core->paint_area->height), + gimp_drawable_replace_buffer (drawable, core->paint_buffer, + GIMP_GEGL_RECT (0, 0, width, height), FALSE, NULL, image_opacity, paint_maskPR, - core->paint_area->x, - core->paint_area->y); - - g_object_unref (canvas_buffer); + core->paint_buffer_x, + core->paint_buffer_y); /* Update the undo extents */ - core->x1 = MIN (core->x1, core->paint_area->x); - core->y1 = MIN (core->y1, core->paint_area->y); - core->x2 = MAX (core->x2, core->paint_area->x + core->paint_area->width) ; - core->y2 = MAX (core->y2, core->paint_area->y + core->paint_area->height) ; + core->x1 = MIN (core->x1, core->paint_buffer_x); + core->y1 = MIN (core->y1, core->paint_buffer_y); + core->x2 = MAX (core->x2, core->paint_buffer_x + width); + core->y2 = MAX (core->y2, core->paint_buffer_y + height); /* Update the drawable */ gimp_drawable_update (drawable, - core->paint_area->x, - core->paint_area->y, - core->paint_area->width, - core->paint_area->height); + core->paint_buffer_x, + core->paint_buffer_y, + width, height); } /** diff --git a/app/paint/gimppaintcore.h b/app/paint/gimppaintcore.h index 163910b855..9761bea6f6 100644 --- a/app/paint/gimppaintcore.h +++ b/app/paint/gimppaintcore.h @@ -60,6 +60,9 @@ struct _GimpPaintCore GeglBuffer *canvas_buffer; /* the buffer to paint the mask to */ TempBuf *paint_area; /* the buffer to paint pixels to */ + GeglBuffer *paint_buffer; /* for now proxies paint_area */ + gint paint_buffer_x; + gint paint_buffer_y; GArray *stroke_buffer; }; @@ -155,6 +158,13 @@ TempBuf * gimp_paint_core_get_paint_area (GimpPaintCore *core, GimpDrawable *drawable, GimpPaintOptions *options, const GimpCoords *coords); +GeglBuffer * gimp_paint_core_get_paint_buffer (GimpPaintCore *core, + GimpDrawable *drawable, + GimpPaintOptions *options, + const GimpCoords *coords, + gint *paint_buffer_x, + gint *paint_buffer_y); + GeglBuffer * gimp_paint_core_get_orig_image (GimpPaintCore *core); GeglBuffer * gimp_paint_core_get_orig_proj (GimpPaintCore *core);