[gimp] app: don't run graphs that read and write the same buffer



commit 150a3e9c7ef157ac185c3dfbeb7fa8c2b75fbd27
Author: Michael Natterer <mitch gimp org>
Date:   Tue Jun 18 08:06:24 2013 +0200

    app: don't run graphs that read and write the same buffer
    
    Work around artifacts at processing chunk borders by dup()ing the
    source buffer. See bug #701875.

 app/core/gimpdrawable-filter.c       |   12 +++++++++---
 app/gegl/gimp-gegl-apply-operation.c |   10 ++++++++++
 2 files changed, 19 insertions(+), 3 deletions(-)
---
diff --git a/app/core/gimpdrawable-filter.c b/app/core/gimpdrawable-filter.c
index 8f19432..92b4cc0 100644
--- a/app/core/gimpdrawable-filter.c
+++ b/app/core/gimpdrawable-filter.c
@@ -104,14 +104,20 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
                                rect.x, rect.y,
                                rect.width, rect.height);
 
-      node   = gimp_filter_get_node (filter);
-      buffer = gimp_drawable_get_buffer (drawable);
+      node = gimp_filter_get_node (filter);
+
+      /* dup() because reading and writing the same buffer doesn't
+       * work with area ops when using a processor. See bug #701875.
+       */
+      buffer = gegl_buffer_dup (gimp_drawable_get_buffer (drawable));
 
       src_node = gegl_node_new_child (NULL,
                                       "operation", "gegl:buffer-source",
                                       "buffer",    buffer,
                                       NULL);
 
+      g_object_unref (buffer);
+
       gegl_node_connect_to (src_node, "output",
                             node,     "input");
 
@@ -137,7 +143,7 @@ gimp_drawable_merge_filter (GimpDrawable *drawable,
       gimp_gegl_apply_operation (NULL,
                                  progress, undo_desc,
                                  node,
-                                 buffer,
+                                 gimp_drawable_get_buffer (drawable),
                                  &rect);
 
       g_object_unref (src_node);
diff --git a/app/gegl/gimp-gegl-apply-operation.c b/app/gegl/gimp-gegl-apply-operation.c
index 7c05c0b..43385a6 100644
--- a/app/gegl/gimp-gegl-apply-operation.c
+++ b/app/gegl/gimp-gegl-apply-operation.c
@@ -72,11 +72,21 @@ gimp_gegl_apply_operation (GeglBuffer          *src_buffer,
     {
       GeglNode *src_node;
 
+      /* dup() because reading and writing the same buffer doesn't
+       * work with area ops when using a processor. See bug #701875.
+       */
+      if (progress && (src_buffer == dest_buffer))
+        src_buffer = gegl_buffer_dup (src_buffer);
+      else
+        g_object_ref (src_buffer);
+
       src_node = gegl_node_new_child (gegl,
                                       "operation", "gegl:buffer-source",
                                       "buffer",    src_buffer,
                                       NULL);
 
+      g_object_unref (src_buffer);
+
       gegl_node_connect_to (src_node,  "output",
                             operation, "input");
     }


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