[gimp] plug-ins: port file-mng to GEGL



commit 20477b6c0884ecbd354217ff518b60477989ed96
Author: Michael Natterer <mitch gimp org>
Date:   Thu Nov 29 01:30:34 2012 +0100

    plug-ins: port file-mng to GEGL

 plug-ins/common/Makefile.am    |    1 +
 plug-ins/common/file-mng.c     |  112 +++++++++++++++++++--------------------
 plug-ins/common/plugin-defs.pl |    2 +-
 3 files changed, 57 insertions(+), 58 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index 2a3d485..8d56062 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -1230,6 +1230,7 @@ file_mng_LDADD = \
 	$(libgimpcolor)		\
 	$(libgimpbase)		\
 	$(GTK_LIBS)		\
+	$(GEGL_LIBS)		\
 	$(MNG_LIBS)		\
 	$(RT_LIBS)		\
 	$(INTLLIBS)		\
diff --git a/plug-ins/common/file-mng.c b/plug-ins/common/file-mng.c
index 6a9a4a7..a022543 100644
--- a/plug-ins/common/file-mng.c
+++ b/plug-ins/common/file-mng.c
@@ -210,7 +210,7 @@ static gboolean  respin_cmap     (png_structp       png_ptr,
                                   png_infop         png_info_ptr,
                                   guchar           *remap,
                                   gint32            image_id,
-                                  GimpDrawable     *drawable,
+                                  GeglBuffer       *buffer,
                                   int              *bit_depth);
 
 static gboolean  mng_save_image  (const gchar      *filename,
@@ -451,10 +451,10 @@ get_bit_depth_for_palette (int num_palette)
 static gboolean
 respin_cmap (png_structp  pp,
              png_infop    info,
-             guchar       *remap,
+             guchar      *remap,
              gint32       image_id,
-             GimpDrawable *drawable,
-             int          *bit_depth)
+             GeglBuffer  *buffer,
+             int         *bit_depth)
 {
   static guchar  trans[] = { 0 };
   guchar        *before;
@@ -463,7 +463,6 @@ respin_cmap (png_structp  pp,
   gint           colors;
   gint           transparent;
   gint           cols, rows;
-  GimpPixelRgn   pixel_rgn;
 
   before = gimp_image_get_colormap (image_id, &colors);
 
@@ -474,17 +473,15 @@ respin_cmap (png_structp  pp,
       colors = 1;
     }
 
-  cols      = drawable->width;
-  rows      = drawable->height;
+  cols      = gegl_buffer_get_width  (buffer);
+  rows      = gegl_buffer_get_height (buffer);
   numpixels = cols * rows;
 
-  gimp_pixel_rgn_init (&pixel_rgn, drawable, 0, 0,
-                       drawable->width, drawable->height, FALSE, FALSE);
-
   pixels = (guchar *) g_malloc (numpixels * 2);
 
-  gimp_pixel_rgn_get_rect (&pixel_rgn, pixels, 0, 0,
-                           drawable->width, drawable->height);
+  gegl_buffer_get (buffer, GEGL_RECTANGLE (0, 0, cols, rows), 1.0,
+                   NULL, pixels,
+                   GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
 
   if (ia_has_transparent_pixels (pixels, numpixels))
     {
@@ -817,13 +814,13 @@ mng_save_image (const gchar  *filename,
   for (i = (num_layers - 1); i >= 0; i--)
     {
       GimpImageType   layer_drawable_type;
-      GimpDrawable   *layer_drawable;
+      GeglBuffer     *layer_buffer;
       gint            layer_offset_x, layer_offset_y;
       gint            layer_rows, layer_cols;
       gchar          *layer_name;
       gint            layer_chunks_type;
+      const Babl     *layer_format;
       volatile gint   layer_bpp;
-      GimpPixelRgn    layer_pixel_rgn;
 
       guint8          layer_mng_colortype;
       guint8          layer_mng_compression_type;
@@ -849,9 +846,9 @@ mng_save_image (const gchar  *filename,
       layer_chunks_type   = parse_chunks_type_from_layer_name (layer_name);
       layer_drawable_type = gimp_drawable_type (layers[i]);
 
-      layer_drawable      = gimp_drawable_get (layers[i]);
-      layer_rows          = layer_drawable->height;
-      layer_cols          = layer_drawable->width;
+      layer_buffer        = gimp_drawable_get_buffer (layers[i]);
+      layer_rows          = gegl_buffer_get_width  (layer_buffer);
+      layer_cols          = gegl_buffer_get_height (layer_buffer);
 
       gimp_drawable_offsets (layers[i], &layer_offset_x, &layer_offset_y);
       layer_has_unique_palette = TRUE;
@@ -862,27 +859,27 @@ mng_save_image (const gchar  *filename,
       switch (layer_drawable_type)
         {
         case GIMP_RGB_IMAGE:
-          layer_bpp = 3;
+          layer_format        = babl_format ("R'G'B' u8");
           layer_mng_colortype = MNG_COLORTYPE_RGB;
           break;
         case GIMP_RGBA_IMAGE:
-          layer_bpp = 4;
+          layer_format        = babl_format ("R'G'B'A u8");
           layer_mng_colortype = MNG_COLORTYPE_RGBA;
           break;
         case GIMP_GRAY_IMAGE:
-          layer_bpp = 1;
+          layer_format        = babl_format ("Y' u8");
           layer_mng_colortype = MNG_COLORTYPE_GRAY;
           break;
         case GIMP_GRAYA_IMAGE:
-          layer_bpp = 2;
+          layer_format        = babl_format ("Y'A u8");
           layer_mng_colortype = MNG_COLORTYPE_GRAYA;
           break;
         case GIMP_INDEXED_IMAGE:
-          layer_bpp = 1;
+          layer_format        = gegl_buffer_get_format (layer_buffer);
           layer_mng_colortype = MNG_COLORTYPE_INDEXED;
           break;
         case GIMP_INDEXEDA_IMAGE:
-          layer_bpp = 2;
+          layer_format        = gegl_buffer_get_format (layer_buffer);
           layer_mng_colortype = MNG_COLORTYPE_INDEXED | MNG_COLORTYPE_GRAYA;
           break;
         default:
@@ -890,6 +887,8 @@ mng_save_image (const gchar  *filename,
           goto err3;
         }
 
+      layer_bpp = babl_format_get_bytes_per_pixel (layer_format);
+
       /* Delta PNG chunks are not yet supported */
 
       /* if (i == (num_layers - 1)) */
@@ -989,7 +988,7 @@ mng_save_image (const gchar  *filename,
         }
 
       pp = png_create_write_struct (PNG_LIBPNG_VER_STRING,
-                                         NULL, NULL, NULL);
+                                    NULL, NULL, NULL);
       if (NULL == pp)
         {
           g_warning ("Unable to png_create_write_struct() in mng_save_image()");
@@ -1047,7 +1046,7 @@ mng_save_image (const gchar  *filename,
           color_type = PNG_COLOR_TYPE_PALETTE;
           layer_has_unique_palette =
             respin_cmap (pp, info, layer_remap,
-                         image_id, layer_drawable,
+                         image_id, layer_buffer,
                          &bit_depth);
           break;
         default:
@@ -1061,11 +1060,11 @@ mng_save_image (const gchar  *filename,
       /* Note: png_set_IHDR() must be called before any other
          png_set_*() functions. */
       png_set_IHDR (pp, info, layer_cols, layer_rows,
-                bit_depth,
-                color_type,
-                mng_data.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
-                PNG_COMPRESSION_TYPE_BASE,
-                PNG_FILTER_TYPE_BASE);
+                    bit_depth,
+                    color_type,
+                    mng_data.interlaced ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE,
+                    PNG_COMPRESSION_TYPE_BASE,
+                    PNG_FILTER_TYPE_BASE);
 
       if (mngg.has_trns)
         {
@@ -1097,9 +1096,6 @@ mng_save_image (const gchar  *filename,
       for (j = 0; j < tile_height; j++)
         layer_pixels[j] = layer_pixel + (layer_cols * layer_bpp * j);
 
-      gimp_pixel_rgn_init (&layer_pixel_rgn, layer_drawable, 0, 0,
-                           layer_cols, layer_rows, FALSE, FALSE);
-
       for (pass = 0; pass < num_passes; pass++)
         {
           for (begin = 0, end = tile_height;
@@ -1110,8 +1106,11 @@ mng_save_image (const gchar  *filename,
                 end = layer_rows;
 
               num = end - begin;
-              gimp_pixel_rgn_get_rect (&layer_pixel_rgn, layer_pixel, 0,
-                                       begin, layer_cols, num);
+
+              gegl_buffer_get (layer_buffer,
+                               GEGL_RECTANGLE (0, begin, layer_cols, num), 1.0,
+                               layer_format, layer_pixel,
+                               GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
 
               if (png_get_valid (pp, info, PNG_INFO_tRNS))
                 {
@@ -1124,9 +1123,8 @@ mng_save_image (const gchar  *filename,
                           layer_remap[fixed[k * 2]] : 0;
                     }
                 }
-              else
-                if (png_get_valid (pp, info, PNG_INFO_PLTE)
-                    && (layer_bpp == 2))
+              else if (png_get_valid (pp, info, PNG_INFO_PLTE)
+                       && (layer_bpp == 2))
                 {
                   for (j = 0; j < num; j++)
                     {
@@ -1141,6 +1139,8 @@ mng_save_image (const gchar  *filename,
             }
         }
 
+      g_object_unref (layer_buffer);
+
       png_write_end (pp, info);
       png_destroy_write_struct (&pp, &info);
 
@@ -1572,6 +1572,16 @@ mng_save_dialog (gint32 image_id)
 
 /* GIMP calls these methods. */
 
+const GimpPlugInInfo PLUG_IN_INFO =
+{
+  NULL,
+  NULL,
+  query,
+  run
+};
+
+MAIN ()
+
 static void
 query (void)
 {
@@ -1625,9 +1635,11 @@ run (const gchar      *name,
   static GimpParam values[2];
 
   INIT_I18N ();
+  gegl_init (NULL, NULL);
 
   *nreturn_vals = 1;
   *return_vals  = values;
+
   values[0].type          = GIMP_PDB_STATUS;
   values[0].data.d_status = GIMP_PDB_SUCCESS;
 
@@ -1646,11 +1658,11 @@ run (const gchar      *name,
 
           gimp_ui_init (PLUG_IN_BINARY, FALSE);
           export = gimp_export_image (&image_id, &drawable_id, NULL,
-                                      (GIMP_EXPORT_CAN_HANDLE_RGB |
-                                       GIMP_EXPORT_CAN_HANDLE_GRAY |
-                                       GIMP_EXPORT_CAN_HANDLE_INDEXED |
-                                       GIMP_EXPORT_CAN_HANDLE_ALPHA |
-                                       GIMP_EXPORT_CAN_HANDLE_LAYERS));
+                                      GIMP_EXPORT_CAN_HANDLE_RGB     |
+                                      GIMP_EXPORT_CAN_HANDLE_GRAY    |
+                                      GIMP_EXPORT_CAN_HANDLE_INDEXED |
+                                      GIMP_EXPORT_CAN_HANDLE_ALPHA   |
+                                      GIMP_EXPORT_CAN_HANDLE_LAYERS);
         }
 
       if (export == GIMP_EXPORT_CANCEL)
@@ -1767,17 +1779,3 @@ run (const gchar      *name,
       values[0].data.d_status = GIMP_PDB_CALLING_ERROR;
     }
 }
-
-
-
-/* Only query and run are implemented by this plug-in. */
-
-const GimpPlugInInfo PLUG_IN_INFO =
-{
-  NULL,
-  NULL,
-  query,
-  run
-};
-
-MAIN ()
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index 3468471..5c09d14 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -58,7 +58,7 @@
     'file-header' => { ui => 1, gegl => 1 },
     'file-html-table' => { ui => 1, gegl => 1 },
     'file-jp2-load' => { optional => 1, gegl => 1, libs => 'JP2_LIBS' },
-    'file-mng' => { ui => 1, optional => 1, libs => 'MNG_LIBS', cflags => 'MNG_CFLAGS' },
+    'file-mng' => { ui => 1, gegl => 1, optional => 1, libs => 'MNG_LIBS', cflags => 'MNG_CFLAGS' },
     'file-pat' => { ui => 1, gegl => 1 },
     'file-pcx' => { ui => 1, gegl => 1 },
     'file-pix' => { ui => 1, gegl => 1 },



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