[gimp] plug-ins: port film to GEGL



commit c1f29732329cddef57e2451619c6e393e7c10a1e
Author: Michael Natterer <mitch gimp org>
Date:   Fri Jun 28 18:40:41 2019 +0200

    plug-ins: port film to GEGL

 plug-ins/common/Makefile.am    |   1 +
 plug-ins/common/film.c         | 113 +++++++++--------------------------------
 plug-ins/common/plugin-defs.pl |   2 +-
 3 files changed, 27 insertions(+), 89 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index d846b5faa3..1f7343f7b1 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -1329,6 +1329,7 @@ film_LDADD = \
        $(libgimpcolor)         \
        $(libgimpbase)          \
        $(GTK_LIBS)             \
+       $(GEGL_LIBS)            \
        $(RT_LIBS)              \
        $(INTLLIBS)             \
        $(film_RC)
diff --git a/plug-ins/common/film.c b/plug-ins/common/film.c
index 52c48878de..205dbd87bd 100644
--- a/plug-ins/common/film.c
+++ b/plug-ins/common/film.c
@@ -87,9 +87,7 @@ static gint32    create_new_image   (const gchar    *filename,
                                      guint           width,
                                      guint           height,
                                      GimpImageType   gdtype,
-                                     gint32         *layer_ID,
-                                     GimpDrawable  **drawable,
-                                     GimpPixelRgn   *pixel_rgn);
+                                     gint32         *layer_ID);
 
 static gchar   * compose_image_name (gint32          image_ID);
 
@@ -104,13 +102,6 @@ static void      set_pixels         (gint            numpix,
 static guchar  * create_hole_rgb    (gint            width,
                                      gint            height);
 
-static void      draw_hole_rgb      (GimpDrawable   *drw,
-                                     gint            x,
-                                     gint            y,
-                                     gint            width,
-                                     gint            height,
-                                     guchar         *hole);
-
 static void      draw_number        (gint32          layer_ID,
                                      gint            num,
                                      gint            x,
@@ -242,6 +233,7 @@ run (const gchar      *name,
   gint              k;
 
   INIT_I18N ();
+  gegl_init (NULL, NULL);
 
   run_mode = param[0].data.d_int32;
 
@@ -346,8 +338,6 @@ film (void)
   gint32       *image_ID_src, image_ID_dst, layer_ID_src, layer_ID_dst;
   gint          image_ID_tmp;
   gint32       *layers;
-  GimpDrawable *drawable_dst;
-  GimpPixelRgn  pixel_rgn_dst;
   gint          new_layer;
   gint          floating_sel;
 
@@ -422,17 +412,16 @@ film (void)
 
   image_ID_dst = create_new_image (_("Untitled"),
                                    (guint) film_width, (guint) film_height,
-                                   GIMP_RGB_IMAGE, &layer_ID_dst,
-                                   &drawable_dst, &pixel_rgn_dst);
+                                   GIMP_RGB_IMAGE, &layer_ID_dst);
 
   /* Fill film background */
   gimp_drawable_fill (layer_ID_dst, GIMP_FILL_BACKGROUND);
 
   /* Draw all the holes */
   hole_offset = film_height * filmvals.hole_offset;
-  hole_width = film_height * filmvals.hole_width;
+  hole_width  = film_height * filmvals.hole_width;
   hole_height = film_height * filmvals.hole_height;
-  hole_space = film_height * filmvals.hole_space;
+  hole_space  = film_height * filmvals.hole_space;
   hole_x = hole_space / 2;
 
 #ifdef FILM_DEBUG
@@ -443,21 +432,32 @@ film (void)
   hole = create_hole_rgb (hole_width, hole_height);
   if (hole)
     {
+      GeglBuffer *buffer = gimp_drawable_get_buffer (layer_ID_dst);
+
       while (hole_x < film_width)
         {
-          draw_hole_rgb (drawable_dst, hole_x,
-                         hole_offset,
-                         hole_width, hole_height, hole);
-          draw_hole_rgb (drawable_dst, hole_x,
-                         film_height-hole_offset-hole_height,
-                         hole_width, hole_height, hole);
+          gegl_buffer_set (buffer,
+                           GEGL_RECTANGLE (hole_x,
+                                           hole_offset,
+                                           hole_width,
+                                           hole_height), 0,
+                           babl_format ("R'G'B' u8"), hole,
+                           GEGL_AUTO_ROWSTRIDE);
+
+          gegl_buffer_set (buffer,
+                           GEGL_RECTANGLE (hole_x,
+                                           film_height - hole_offset - hole_height,
+                                           hole_width,
+                                           hole_height), 0,
+                           babl_format ("R'G'B' u8"), hole,
+                           GEGL_AUTO_ROWSTRIDE);
 
           hole_x += hole_width + hole_space;
         }
+
+      g_object_unref (buffer);
       g_free (hole);
     }
-  gimp_drawable_detach (drawable_dst);
-
 
   /* Compose all images and layers */
   picture_x0 = 0;
@@ -608,55 +608,6 @@ create_hole_rgb (gint width,
   return hole;
 }
 
-/* Draw the hole at the specified position */
-static void
-draw_hole_rgb (GimpDrawable *drw,
-               gint          x,
-               gint          y,
-               gint          width,
-               gint          height,
-               guchar       *hole)
-{
-  GimpPixelRgn    rgn;
-  guchar         *data;
-  gint            tile_height = gimp_tile_height ();
-  gint            i, j, scan_lines;
-  gint            d_width = gimp_drawable_width (drw->drawable_id);
-  gint            length;
-
-  if ((width <= 0) || (height <= 0))
-    return;
-  if ((x+width <= 0) || (x >= d_width))
-    return;
-  length = width;   /* Check that we don't draw past the image */
-  if ((x+length) >= d_width)
-    length = d_width-x;
-
-  data = g_new (guchar, length * tile_height * drw->bpp);
-
-  gimp_pixel_rgn_init (&rgn, drw, x, y, length, height, TRUE, FALSE);
-
-  i = 0;
-  while (i < height)
-    {
-      scan_lines = (i+tile_height-1 < height) ? tile_height : (height-i);
-      if (length == width)
-        {
-          memcpy (data, hole + 3*width*i, width*scan_lines*3);
-        }
-      else  /* We have to do some clipping */
-        {
-          for (j = 0; j < scan_lines; j++)
-            memcpy (data + j*length*3, hole + (i+j)*width*3, length*3);
-        }
-      gimp_pixel_rgn_set_rect (&rgn, data, x, y+i, length, scan_lines);
-
-      i += scan_lines;
-    }
-
-  g_free (data);
-}
-
 /* Draw the number of the picture onto the film */
 static void
 draw_number (gint32 layer_ID,
@@ -666,7 +617,6 @@ draw_number (gint32 layer_ID,
              gint   height)
 {
   gchar         buf[32];
-  GimpDrawable *drw;
   gint          k, delta, max_delta;
   gint32        image_ID;
   gint32        text_layer_ID;
@@ -675,7 +625,6 @@ draw_number (gint32 layer_ID,
 
   g_snprintf (buf, sizeof (buf), "%d", num);
 
-  drw = gimp_drawable_get (layer_ID);
   image_ID = gimp_item_get_image (layer_ID);
 
   max_delta = height / 10;
@@ -714,8 +663,6 @@ draw_number (gint32 layer_ID,
 
   if (text_layer_ID == -1)
     g_message ("draw_number: Error in drawing text\n");
-
-  gimp_drawable_detach (drw);
 }
 
 /* Create an image. Sets layer_ID, drawable and rgn. Returns image_ID */
@@ -724,9 +671,7 @@ create_new_image (const gchar    *filename,
                   guint           width,
                   guint           height,
                   GimpImageType   gdtype,
-                  gint32         *layer_ID,
-                  GimpDrawable  **drawable,
-                  GimpPixelRgn   *pixel_rgn)
+                  gint32         *layer_ID)
 {
   gint32            image_ID;
   GimpImageBaseType gitype;
@@ -748,14 +693,6 @@ create_new_image (const gchar    *filename,
                               gimp_image_get_default_new_layer_mode (image_ID));
   gimp_image_insert_layer (image_ID, *layer_ID, -1, 0);
 
-  if (drawable)
-    {
-      *drawable = gimp_drawable_get (*layer_ID);
-      if (pixel_rgn != NULL)
-        gimp_pixel_rgn_init (pixel_rgn, *drawable, 0, 0, (*drawable)->width,
-                             (*drawable)->height, TRUE, FALSE);
-    }
-
   return image_ID;
 }
 
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index f83300cc00..182b212068 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -59,7 +59,7 @@
     'file-xmc' => { ui => 1, gegl => 1, optional => 1, libs => 'XMC_LIBS' },
     'file-xpm' => { ui => 1, gegl => 1, optional => 1, libs => 'XPM_LIBS' },
     'file-xwd' => {  ui => 1, gegl => 1 },
-    'film' => { ui => 1 },
+    'film' => { ui => 1, gegl => 1 },
     'filter-pack' => { ui => 1 },
     'goat-exercise' => { gegl => 1 },
     'gradient-map' => { gegl => 1 },


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