[gimp] app: in GimpLineArt, add support for arbitrary buffer extents



commit bce96eb690eeb1cf83603e7abb13817e47b1f721
Author: Ell <ell_se yahoo com>
Date:   Mon Nov 4 12:46:42 2019 +0200

    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).

 app/core/gimplineart.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)
---
diff --git a/app/core/gimplineart.c b/app/core/gimplineart.c
index e277149ec8..758426c3f3 100644
--- a/app/core/gimplineart.c
+++ b/app/core/gimplineart.c
@@ -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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]