app: in GimpLineArt, add support for arbitrary buffer extents

In GimpLineArt, add support for arbitrary input-buffer extents,
by shifting/unshifting the input/output buffers before/after
passing them to the main algorithm, so that the algorithm keeps
working with buffers whose top-left corner is at (0, 0).
This commit is contained in:
Ell 2019-11-04 12:46:42 +02:00
parent 0e02795128
commit bce96eb690
1 changed files with 33 additions and 1 deletions

View File

@ -676,8 +676,11 @@ static void
gimp_line_art_prepare_async_func (GimpAsync *async,
LineArtData *data)
{
GeglBuffer *buffer;
GeglBuffer *closed = NULL;
gfloat *distmap = NULL;
gint buffer_x;
gint buffer_y;
gboolean has_alpha;
gboolean select_transparent = FALSE;
@ -728,13 +731,26 @@ gimp_line_art_prepare_async_func (GimpAsync *async,
}
}
buffer = data->buffer;
buffer_x = gegl_buffer_get_x (data->buffer);
buffer_y = gegl_buffer_get_y (data->buffer);
if (buffer_x != 0 || buffer_y != 0)
{
buffer = g_object_new (GEGL_TYPE_BUFFER,
"source", buffer,
"shift-x", buffer_x,
"shift-y", buffer_y,
NULL);
}
/* For smart selection, we generate a binarized image with close
* regions, then run a composite selection with no threshold on
* this intermediate buffer.
*/
GIMP_TIMER_START();
closed = gimp_line_art_close (data->buffer,
closed = gimp_line_art_close (buffer,
select_transparent,
data->threshold,
data->spline_max_len,
@ -764,8 +780,24 @@ gimp_line_art_prepare_async_func (GimpAsync *async,
GIMP_TIMER_END("close line-art");
if (buffer != data->buffer)
g_object_unref (buffer);
if (! gimp_async_is_stopped (async))
{
if (buffer_x != 0 || buffer_y != 0)
{
buffer = g_object_new (GEGL_TYPE_BUFFER,
"source", closed,
"shift-x", -buffer_x,
"shift-y", -buffer_y,
NULL);
g_object_unref (closed);
closed = buffer;
}
gimp_async_finish_full (async,
line_art_result_new (closed, distmap),
(GDestroyNotify) line_art_result_free);