[gimp] app: add a new gimp_gegl_combine_mask() which does what it says



commit dd9b132d8f0182dc28acd747daeb7c3ddafedf6f
Author: Michael Natterer <mitch gimp org>
Date:   Sun May 6 20:01:20 2012 +0200

    app: add a new gimp_gegl_combine_mask() which does what it says
    
    which is combining two masks. Use it in gimp_drawable_real_replace_buffer()
    instead of gimp_gegl_apply_mask() which does the wrong thing.

 app/core/gimpdrawable-combine.c |    6 +++---
 app/gegl/gimp-gegl-loops.c      |   32 ++++++++++++++++++++++++++++++++
 app/gegl/gimp-gegl-loops.h      |    6 ++++++
 3 files changed, 41 insertions(+), 3 deletions(-)
---
diff --git a/app/core/gimpdrawable-combine.c b/app/core/gimpdrawable-combine.c
index f8a2011..1be8df3 100644
--- a/app/core/gimpdrawable-combine.c
+++ b/app/core/gimpdrawable-combine.c
@@ -331,9 +331,9 @@ gimp_drawable_real_replace_buffer (GimpDrawable        *drawable,
                         dest_buffer,
                         GEGL_RECTANGLE (0, 0, 0, 0));
 
-      gimp_gegl_apply_mask (mask_buffer, mask_buffer_region,
-                            dest_buffer, GEGL_RECTANGLE (0, 0, width, height),
-                            1.0);
+      gimp_gegl_combine_mask (mask_buffer, mask_buffer_region,
+                              dest_buffer, GEGL_RECTANGLE (0, 0, width, height),
+                              1.0);
 
       gimp_gegl_replace (buffer,
                          buffer_region,
diff --git a/app/gegl/gimp-gegl-loops.c b/app/gegl/gimp-gegl-loops.c
index f656df3..2397a53 100644
--- a/app/gegl/gimp-gegl-loops.c
+++ b/app/gegl/gimp-gegl-loops.c
@@ -425,6 +425,38 @@ gimp_gegl_apply_mask (GeglBuffer          *mask_buffer,
 }
 
 void
+gimp_gegl_combine_mask (GeglBuffer          *mask_buffer,
+                        const GeglRectangle *mask_rect,
+                        GeglBuffer          *dest_buffer,
+                        const GeglRectangle *dest_rect,
+                        gdouble              opacity)
+{
+  GeglBufferIterator *iter;
+
+  iter = gegl_buffer_iterator_new (mask_buffer, mask_rect, 0,
+                                   babl_format ("Y float"),
+                                   GEGL_BUFFER_READ, GEGL_ABYSS_NONE);
+
+  gegl_buffer_iterator_add (iter, dest_buffer, dest_rect, 0,
+                            babl_format ("Y float"),
+                            GEGL_BUFFER_READWRITE, GEGL_ABYSS_NONE);
+
+  while (gegl_buffer_iterator_next (iter))
+    {
+      const gfloat *mask = iter->data[0];
+      gfloat       *dest = iter->data[1];
+
+      while (iter->length--)
+        {
+          *dest *= *mask * opacity;
+
+          mask += 1;
+          dest += 1;
+        }
+    }
+}
+
+void
 gimp_gegl_combine_mask_weird (GeglBuffer          *mask_buffer,
                               const GeglRectangle *mask_rect,
                               GeglBuffer          *dest_buffer,
diff --git a/app/gegl/gimp-gegl-loops.h b/app/gegl/gimp-gegl-loops.h
index 1178be1..9fdde4a 100644
--- a/app/gegl/gimp-gegl-loops.h
+++ b/app/gegl/gimp-gegl-loops.h
@@ -57,6 +57,12 @@ void   gimp_gegl_apply_mask         (GeglBuffer          *mask_buffer,
                                      const GeglRectangle *dest_rect,
                                      gdouble              opacity);
 
+void   gimp_gegl_combine_mask       (GeglBuffer          *mask_buffer,
+                                     const GeglRectangle *mask_rect,
+                                     GeglBuffer          *dest_buffer,
+                                     const GeglRectangle *dest_rect,
+                                     gdouble              opacity);
+
 void   gimp_gegl_combine_mask_weird (GeglBuffer          *mask_buffer,
                                      const GeglRectangle *mask_rect,
                                      GeglBuffer          *dest_buffer,



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