app: add gimp_paint_core_get_paint_buffer()

which is the same as gimp_paint_core_get_paint_area() but returns a
GeglBuffer to paint to, not a TempBuf.
This commit is contained in:
Michael Natterer 2012-03-31 18:28:18 +02:00
parent ab29daf758
commit 12ac0bea13
4 changed files with 106 additions and 61 deletions

View file

@ -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;
}

View file

@ -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 *

View file

@ -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);
}
/**

View file

@ -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);