[gimp] plug-ins: port gimpressionist to GEGL, stupid 8-bit port only



commit 3914e047226b79615468e5faabad7a51aa4ec27d
Author: Michael Natterer <mitch gimp org>
Date:   Fri Jul 19 18:58:24 2019 +0200

    plug-ins: port gimpressionist to GEGL, stupid 8-bit port only

 plug-ins/gimpressionist/Makefile.am |   1 +
 plug-ins/gimpressionist/brush.c     |  73 +++++++++-----
 plug-ins/gimpressionist/gimp.c      | 196 +++++++++++++++++++++---------------
 3 files changed, 165 insertions(+), 105 deletions(-)
---
diff --git a/plug-ins/gimpressionist/Makefile.am b/plug-ins/gimpressionist/Makefile.am
index 9abe7e79c3..9262dcb7f9 100644
--- a/plug-ins/gimpressionist/Makefile.am
+++ b/plug-ins/gimpressionist/Makefile.am
@@ -79,6 +79,7 @@ LDADD = \
        $(libgimpmath)          \
        $(libgimpbase)          \
        $(GTK_LIBS)             \
+       $(GEGL_LIBS)            \
        $(RT_LIBS)              \
        $(INTLLIBS)             \
        $(gimpressionist_RC)
diff --git a/plug-ins/gimpressionist/brush.c b/plug-ins/gimpressionist/brush.c
index 4176f440e9..2b9f2b8efa 100644
--- a/plug-ins/gimpressionist/brush.c
+++ b/plug-ins/gimpressionist/brush.c
@@ -92,25 +92,44 @@ set_colorbrushes (const gchar *fn)
   pcvals.color_brushes = file_is_color (fn);
 }
 
+static const Babl *
+get_u8_format (gint32 drawable_id)
+{
+  if (gimp_drawable_is_rgb (drawable_id))
+    {
+      if (gimp_drawable_has_alpha (drawable_id))
+        return babl_format ("R'G'B'A u8");
+      else
+        return babl_format ("R'G'B' u8");
+    }
+  else
+    {
+      if (gimp_drawable_has_alpha (drawable_id))
+        return babl_format ("Y'A u8");
+      else
+        return babl_format ("Y' u8");
+    }
+}
+
 static void
 brushdmenuselect (GtkWidget *widget,
                   gpointer   data)
 {
-  GimpPixelRgn  src_rgn;
-  guchar       *src_row;
-  guchar       *src;
-  gint          id;
-  gint          bpp;
-  gint          x, y;
-  ppm_t        *p;
-  gint          x1, y1, w, h;
-  gint          row;
-  GimpDrawable *drawable;
-  gint          rowstride;
-
-  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &id);
-
-  if (id == -1)
+  GeglBuffer *src_buffer;
+  const Babl *format;
+  guchar     *src_row;
+  guchar     *src;
+  gint        bpp;
+  gint        x, y;
+  ppm_t      *p;
+  gint        x1, y1, w, h;
+  gint        row;
+  gint32      drawable_id;
+  gint        rowstride;
+
+  gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), &drawable_id);
+
+  if (drawable_id == -1)
     return;
 
   if (brush_from_file == 2)
@@ -127,12 +146,11 @@ brushdmenuselect (GtkWidget *widget,
   gtk_adjustment_set_value (brush_gamma_adjust, 1.0);
   gtk_adjustment_set_value (brush_aspect_adjust, 0.0);
 
-  drawable = gimp_drawable_get (id);
-
-  if (! gimp_drawable_mask_intersect (drawable->drawable_id, &x1, &y1, &w, &h))
+  if (! gimp_drawable_mask_intersect (drawable_id, &x1, &y1, &w, &h))
     return;
 
-  bpp = gimp_drawable_bpp (drawable->drawable_id);
+  format = get_u8_format (drawable_id);
+  bpp    = babl_format_get_bytes_per_pixel (format);
 
   ppm_kill (&brushppm);
   ppm_new (&brushppm, w, h);
@@ -142,8 +160,7 @@ brushdmenuselect (GtkWidget *widget,
 
   src_row = g_new (guchar, w * bpp);
 
-  gimp_pixel_rgn_init (&src_rgn, drawable,
-                       0, 0, w, h, FALSE, FALSE);
+  src_buffer = gimp_drawable_get_buffer (drawable_id);
 
   if (bpp == 3)
     { /* RGB */
@@ -152,7 +169,10 @@ brushdmenuselect (GtkWidget *widget,
 
       for (row = 0, y = y1; y < y2; row++, y++)
         {
-          gimp_pixel_rgn_get_row (&src_rgn, src_row, x1, y, w);
+          gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0,
+                           format, src_row,
+                           GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
           memcpy (p->col + row*rowstride, src_row, bpr);
         }
     }
@@ -167,8 +187,10 @@ brushdmenuselect (GtkWidget *widget,
           guchar *tmprow_ptr;
          gint x2 = x1 + w;
 
+          gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x1, y, w, 1), 1.0,
+                           format, src_row,
+                           GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
 
-          gimp_pixel_rgn_get_row (&src_rgn, src_row, x1, y, w);
           src = src_row;
           tmprow_ptr = tmprow;
           /* Possible micro-optimization here:
@@ -180,10 +202,13 @@ brushdmenuselect (GtkWidget *widget,
               *(tmprow_ptr++) = src[0];
               *(tmprow_ptr++) = src[is_gray ? 1 : 0];
               *(tmprow_ptr++) = src[is_gray ? 2 : 0];
-              src += src_rgn.bpp;
+              src += bpp;
             }
         }
     }
+
+  g_object_unref (src_buffer);
+
   g_free (src_row);
 
   if (bpp >= 3)
diff --git a/plug-ins/gimpressionist/gimp.c b/plug-ins/gimpressionist/gimp.c
index d86b9c9e7d..fea302d383 100644
--- a/plug-ins/gimpressionist/gimp.c
+++ b/plug-ins/gimpressionist/gimp.c
@@ -52,9 +52,9 @@ const GimpPlugInInfo PLUG_IN_INFO = {
         run     /* run_proc */
 }; /* PLUG_IN_INFO */
 
-static GimpDrawable *drawable;
-static ppm_t         infile =  {0, 0, NULL};
-static ppm_t         inalpha = {0, 0, NULL};
+static gint32 drawable_id;
+static ppm_t  infile =  {0, 0, NULL};
+static ppm_t  inalpha = {0, 0, NULL};
 
 
 void
@@ -140,11 +140,12 @@ run (const gchar      *name,
   *return_vals  = values;
 
   INIT_I18N ();
+  gegl_init (NULL, NULL);
 
   /* Get the active drawable info */
 
-  drawable = gimp_drawable_get (param[2].data.d_drawable);
-  img_has_alpha = gimp_drawable_has_alpha (drawable->drawable_id);
+  drawable_id = param[2].data.d_drawable;
+  img_has_alpha = gimp_drawable_has_alpha (drawable_id);
 
   random_generator = g_rand_new ();
 
@@ -155,7 +156,7 @@ run (const gchar      *name,
   {
     gint x1, y1, width, height; /* Not used. */
 
-    if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+    if (! gimp_drawable_mask_intersect (drawable_id,
                                         &x1, &y1, &width, &height))
       {
         values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
@@ -164,8 +165,6 @@ run (const gchar      *name,
         values[1].data.d_string = _("The selection does not intersect "
                                     "the active layer or mask.");
 
-        gimp_drawable_detach (drawable);
-
         return;
       }
   }
@@ -193,8 +192,8 @@ run (const gchar      *name,
       break;
     }
   if ((status == GIMP_PDB_SUCCESS) &&
-      (gimp_drawable_is_rgb (drawable->drawable_id) ||
-       gimp_drawable_is_gray (drawable->drawable_id)))
+      (gimp_drawable_is_rgb (drawable_id) ||
+       gimp_drawable_is_gray (drawable_id)))
     {
 
       if (with_specified_preset)
@@ -247,52 +246,77 @@ run (const gchar      *name,
   size_map_free_resources ();
 
   values[0].data.d_status = status;
+}
 
-  gimp_drawable_detach (drawable);
+static const Babl *
+get_u8_format (gint32 drawable_id)
+{
+  if (gimp_drawable_is_rgb (drawable_id))
+    {
+      if (gimp_drawable_has_alpha (drawable_id))
+        return babl_format ("R'G'B'A u8");
+      else
+        return babl_format ("R'G'B' u8");
+    }
+  else
+    {
+      if (gimp_drawable_has_alpha (drawable_id))
+        return babl_format ("Y'A u8");
+      else
+        return babl_format ("Y' u8");
+    }
 }
 
 void
 grabarea (void)
 {
-  GimpPixelRgn  src_rgn;
-  ppm_t        *p;
-  gint          x1, y1;
-  gint          x, y;
-  gint          width, height;
-  gint          row, col;
-  gint          rowstride;
-  gpointer      pr;
-
-  if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+  GeglBuffer         *src_buffer;
+  GeglBufferIterator *iter;
+  const Babl         *format;
+  gint                bpp;
+  ppm_t              *p;
+  gint                x1, y1;
+  gint                x, y;
+  gint                width, height;
+  gint                row, col;
+  gint                rowstride;
+
+  if (! gimp_drawable_mask_intersect (drawable_id,
                                       &x1, &y1, &width, &height))
     return;
 
   ppm_new (&infile, width, height);
   p = &infile;
 
-  if (gimp_drawable_has_alpha (drawable->drawable_id))
+  format = get_u8_format (drawable_id);
+  bpp    = babl_format_get_bytes_per_pixel (format);
+
+  if (gimp_drawable_has_alpha (drawable_id))
     ppm_new (&inalpha, width, height);
 
   rowstride = p->width * 3;
 
-  gimp_pixel_rgn_init (&src_rgn,
-                       drawable, x1, y1, width, height, FALSE, FALSE);
+  src_buffer = gimp_drawable_get_buffer (drawable_id);
+
+  iter = gegl_buffer_iterator_new (src_buffer,
+                                   GEGL_RECTANGLE (x1, y1, width, height), 0,
+                                   format,
+                                   GEGL_ACCESS_READ, GEGL_ABYSS_NONE, 1);
 
-  for (pr = gimp_pixel_rgns_register (1, &src_rgn);
-       pr != NULL;
-       pr = gimp_pixel_rgns_process (pr))
+  while (gegl_buffer_iterator_next (iter))
     {
-      const guchar *src = src_rgn.data;
+      GeglRectangle  roi = iter->items[0].roi;
+      const guchar  *src = iter->items[0].data;
 
-      switch (src_rgn.bpp)
+      switch (bpp)
         {
         case 1:
-          for (y = 0, row = src_rgn.y - y1; y < src_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               const guchar *s      = src;
               guchar       *tmprow = p->col + row * rowstride;
 
-              for (x = 0, col = src_rgn.x - x1; x < src_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k = col * 3;
 
@@ -303,18 +327,18 @@ grabarea (void)
                   s++;
                 }
 
-              src += src_rgn.rowstride;
+              src += bpp * roi.width;
             }
           break;
 
         case 2:
-          for (y = 0, row = src_rgn.y - y1; y < src_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               const guchar *s       = src;
               guchar       *tmprow  = p->col + row * rowstride;
               guchar       *tmparow = inalpha.col + row * rowstride;
 
-              for (x = 0, col = src_rgn.x - x1; x < src_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k = col * 3;
 
@@ -326,29 +350,29 @@ grabarea (void)
                   s += 2;
                 }
 
-              src += src_rgn.rowstride;
+              src += bpp * roi.width;
             }
           break;
 
         case 3:
-          col = src_rgn.x - x1;
+          col = roi.x - x1;
 
-          for (y = 0, row = src_rgn.y - y1; y < src_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
-              memcpy (p->col + row * rowstride + col * 3, src, src_rgn.w * 3);
+              memcpy (p->col + row * rowstride + col * 3, src, roi.width * 3);
 
-              src += src_rgn.rowstride;
+              src += bpp * roi.width;
             }
           break;
 
         case 4:
-          for (y = 0, row = src_rgn.y - y1; y < src_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               const guchar *s       = src;
               guchar       *tmprow  = p->col + row * rowstride;
               guchar       *tmparow = inalpha.col + row * rowstride;
 
-              for (x = 0, col = src_rgn.x - x1; x < src_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k = col * 3;
 
@@ -360,34 +384,40 @@ grabarea (void)
                   s += 4;
                 }
 
-              src += src_rgn.rowstride;
+              src += bpp * roi.width;
             }
           break;
         }
     }
+
+  g_object_unref (src_buffer);
 }
 
 static void
 gimpressionist_main (void)
 {
-  GimpPixelRgn  dest_rgn;
-  ppm_t        *p;
-  gint          x1, y1;
-  gint          x, y;
-  gint          width, height;
-  gint          row, col;
-  gint          rowstride;
-  gint          count;
-  glong         done;
-  glong         total;
-  gpointer      pr;
-
-  if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+  GeglBuffer         *dest_buffer;
+  GeglBufferIterator *iter;
+  const Babl         *format;
+  gint                bpp;
+  ppm_t              *p;
+  gint                x1, y1;
+  gint                x, y;
+  gint                width, height;
+  gint                row, col;
+  gint                rowstride;
+  glong               done = 0;
+  glong               total;
+
+  if (! gimp_drawable_mask_intersect (drawable_id,
                                       &x1, &y1, &width, &height))
     return;
 
   total = width * height;
 
+  format = get_u8_format (drawable_id);
+  bpp    = babl_format_get_bytes_per_pixel (format);
+
   gimp_progress_init (_("Painting"));
 
   if (! PPM_IS_INITED (&infile))
@@ -399,24 +429,27 @@ gimpressionist_main (void)
 
   rowstride = p->width * 3;
 
-  gimp_pixel_rgn_init (&dest_rgn,
-                       drawable, x1, y1, width, height, TRUE, TRUE);
+  dest_buffer = gimp_drawable_get_shadow_buffer (drawable_id);
 
-  for (pr = gimp_pixel_rgns_register (1, &dest_rgn), count = 0, done = 0;
-       pr != NULL;
-       pr = gimp_pixel_rgns_process (pr), count++)
+  iter = gegl_buffer_iterator_new (dest_buffer,
+                                   GEGL_RECTANGLE (x1, y1, width, height), 0,
+                                   format,
+                                   GEGL_ACCESS_WRITE, GEGL_ABYSS_NONE, 1);
+
+  while (gegl_buffer_iterator_next (iter))
     {
-      guchar *dest = dest_rgn.data;
+      GeglRectangle  roi  = iter->items[0].roi;
+      guchar        *dest = iter->items[0].data;
 
-      switch (dest_rgn.bpp)
+      switch (bpp)
         {
         case 1:
-          for (y = 0, row = dest_rgn.y - y1; y < dest_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               guchar       *d       = dest;
               const guchar *tmprow  = p->col + row * rowstride;
 
-              for (x = 0, col = dest_rgn.x - x1; x < dest_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k = col * 3;
 
@@ -425,18 +458,18 @@ gimpressionist_main (void)
                                              tmprow[k + 2]);
                 }
 
-              dest += dest_rgn.rowstride;
+              dest += bpp * roi.width;
             }
           break;
 
         case 2:
-          for (y = 0, row = dest_rgn.y - y1; y < dest_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               guchar       *d       = dest;
               const guchar *tmprow  = p->col + row * rowstride;
               const guchar *tmparow = inalpha.col + row * rowstride;
 
-              for (x = 0, col = dest_rgn.x - x1; x < dest_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k     = col * 3;
                   gint value = GIMP_RGB_LUMINANCE (tmprow[k + 0],
@@ -449,29 +482,29 @@ gimpressionist_main (void)
                   d += 2;
                 }
 
-              dest += dest_rgn.rowstride;
+              dest += bpp * roi.width;
             }
           break;
 
         case 3:
-          col = dest_rgn.x - x1;
+          col = roi.x - x1;
 
-          for (y = 0, row = dest_rgn.y - y1; y < dest_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
-              memcpy (dest, p->col + row * rowstride + col * 3, dest_rgn.w * 3);
+              memcpy (dest, p->col + row * rowstride + col * 3, roi.width * 3);
 
-              dest += dest_rgn.rowstride;
+              dest += bpp * roi.width;
             }
           break;
 
         case 4:
-          for (y = 0, row = dest_rgn.y - y1; y < dest_rgn.h; y++, row++)
+          for (y = 0, row = roi.y - y1; y < roi.height; y++, row++)
             {
               guchar       *d       = dest;
               const guchar *tmprow  = p->col + row * rowstride;
               const guchar *tmparow = inalpha.col + row * rowstride;
 
-              for (x = 0, col = dest_rgn.x - x1; x < dest_rgn.w; x++, col++)
+              for (x = 0, col = roi.x - x1; x < roi.width; x++, col++)
                 {
                   gint k = col * 3;
 
@@ -483,19 +516,20 @@ gimpressionist_main (void)
                   d += 4;
                 }
 
-              dest += dest_rgn.rowstride;
+              dest += bpp * roi.width;
             }
           break;
         }
 
-      done += dest_rgn.w * dest_rgn.h;
+      done += roi.width * roi.height;
 
-      if (count % 16 == 0)
-        gimp_progress_update (0.8 + 0.2 * done / total);
+      gimp_progress_update (0.8 + 0.2 * done / total);
     }
 
+  g_object_unref (dest_buffer);
+
   gimp_progress_update (1.0);
-  gimp_drawable_flush (drawable);
-  gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
-  gimp_drawable_update (drawable->drawable_id, x1, y1, width, height);
+
+  gimp_drawable_merge_shadow (drawable_id, TRUE);
+  gimp_drawable_update (drawable_id, x1, y1, width, height);
 }


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