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



commit 88e4a462baf869ad7fb2385cb07ef1190cffe1ba
Author: Michael Natterer <mitch gimp org>
Date:   Mon Nov 19 00:25:10 2012 +0100

    plug-ins: port file-csource to GEGL

 plug-ins/common/Makefile.am    |    1 +
 plug-ins/common/file-csource.c |  193 +++++++++++++++++++++-------------------
 plug-ins/common/plugin-defs.pl |    2 +-
 3 files changed, 103 insertions(+), 93 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index 17fad50..745ad58 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -1018,6 +1018,7 @@ file_csource_LDADD = \
 	$(libgimpcolor)		\
 	$(libgimpbase)		\
 	$(GTK_LIBS)		\
+	$(GEGL_LIBS)		\
 	$(RT_LIBS)		\
 	$(INTLLIBS)		\
 	$(file_csource_RC)
diff --git a/plug-ins/common/file-csource.c b/plug-ins/common/file-csource.c
index 3d505d8..ed8eabb 100644
--- a/plug-ins/common/file-csource.c
+++ b/plug-ins/common/file-csource.c
@@ -51,7 +51,6 @@ typedef struct
 } Config;
 
 
-/* --- prototypes --- */
 static void     query           (void);
 static void     run             (const gchar      *name,
                                  gint              nparams,
@@ -65,7 +64,7 @@ static gboolean save_image      (Config           *config,
                                  GError          **error);
 static gboolean run_save_dialog (Config           *config);
 
-/* --- variables --- */
+
 const GimpPlugInInfo PLUG_IN_INFO =
 {
   NULL,  /* init_proc  */
@@ -88,10 +87,10 @@ static Config config =
   100.0,        /* opacity */
 };
 
-/* --- implement main (), provided by libgimp --- */
+
 MAIN ()
 
-/* --- functions --- */
+
 static void
 query (void)
 {
@@ -133,13 +132,14 @@ run (const gchar      *name,
   GimpExportReturn   export = GIMP_EXPORT_CANCEL;
   GError            *error  = NULL;
 
+  INIT_I18N ();
+  gegl_init (NULL, NULL);
+
   run_mode = param[0].data.d_int32;
 
   *nreturn_vals = 1;
   *return_vals  = values;
 
-  INIT_I18N ();
-
   values[0].type          = GIMP_PDB_STATUS;
   values[0].data.d_status = GIMP_PDB_EXECUTION_ERROR;
 
@@ -173,8 +173,8 @@ 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_ALPHA ));
+                                  GIMP_EXPORT_CAN_HANDLE_RGB |
+                                  GIMP_EXPORT_CAN_HANDLE_ALPHA);
 
       if (export == GIMP_EXPORT_CANCEL)
         {
@@ -390,15 +390,19 @@ save_image (Config  *config,
             gint32   drawable_ID,
             GError **error)
 {
-  GimpDrawable *drawable      = gimp_drawable_get (drawable_ID);
-  GimpImageType drawable_type = gimp_drawable_type (drawable_ID);
-  GimpPixelRgn pixel_rgn;
-  gchar  *s_uint_8, *s_uint, *s_char, *s_null;
-  FILE   *fp;
-  guint   c;
-  gchar  *macro_name;
-  guint8 *img_buffer, *img_buffer_end;
-  gchar  *basename;
+  GeglBuffer    *buffer;
+  FILE          *fp;
+  GimpImageType  drawable_type = gimp_drawable_type (drawable_ID);
+  gchar         *s_uint_8, *s_uint, *s_char, *s_null;
+  guint          c;
+  gchar         *macro_name;
+  guint8        *img_buffer, *img_buffer_end;
+  gchar         *basename;
+  guint8        *data, *p;
+  gint           width;
+  gint           height;
+  gint           x, y, pad, n_bytes, bpp;
+  gint           drawable_bpp;
 
   fp = g_fopen (config->file_name, "w");
   if (! fp)
@@ -410,84 +414,90 @@ save_image (Config  *config,
       return FALSE;
     }
 
-  gimp_pixel_rgn_init (&pixel_rgn, drawable,
-                       0, 0, drawable->width, drawable->height, FALSE, FALSE);
+  buffer = gimp_drawable_get_buffer (drawable_ID);
 
-  if (1)
-    {
-      guint8 *data, *p;
-      gint x, y, pad, n_bytes, bpp;
+  width  = gegl_buffer_get_width  (buffer);
+  height = gegl_buffer_get_height (buffer);
 
-      bpp = config->rgb565 ? 2 : (config->alpha ? 4 : 3);
-      n_bytes = drawable->width * drawable->height * bpp;
-      pad = drawable->width * drawable->bpp;
-      if (config->use_rle)
-        pad = MAX (pad, 130 + n_bytes / 127);
+  drawable_bpp = gimp_drawable_bpp (drawable_ID);
+
+  bpp = config->rgb565 ? 2 : (config->alpha ? 4 : 3);
+  n_bytes = width * height * bpp;
+  pad = width * bpp;
+  if (config->use_rle)
+    pad = MAX (pad, 130 + n_bytes / 127);
 
-      data = g_new (guint8, pad + n_bytes);
-      p = data + pad;
+  data = g_new (guint8, pad + n_bytes);
+  p = data + pad;
+
+  for (y = 0; y < height; y++)
+    {
+      gegl_buffer_get (buffer, GEGL_RECTANGLE (0, y, width, 1), 1.0,
+                       NULL, data,
+                       GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
 
-      for (y = 0; y < drawable->height; y++)
+      if (bpp == 2)
         {
-          gimp_pixel_rgn_get_row (&pixel_rgn, data, 0, y, drawable->width);
-
-          if (bpp == 2)
-             for (x = 0; x < drawable->width; x++)
-              {
-                guint8 *d = data + x * drawable->bpp;
-                guint8 r, g, b;
-                gushort rgb16;
-                gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
-
-                alpha *= config->opacity / 25500.0;
-                r = (0.5 + alpha * (gdouble) d[0]);
-                g = (0.5 + alpha * (gdouble) d[1]);
-                b = (0.5 + alpha * (gdouble) d[2]);
-                r >>= 3;
-                g >>= 2;
-                b >>= 3;
-                rgb16 = (r << 11) + (g << 5) + b;
-                *(p++) = (guchar) rgb16;
-                *(p++) = (guchar) (rgb16 >> 8);
-              }
-          else if (config->alpha)
-            for (x = 0; x < drawable->width; x++)
-              {
-                guint8 *d = data + x * drawable->bpp;
-                gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
-
-                alpha *= config->opacity / 100.0;
-                *(p++) = d[0];
-                *(p++) = d[1];
-                *(p++) = d[2];
-                *(p++) = alpha + 0.5;
-              }
-          else
-            for (x = 0; x < drawable->width; x++)
-              {
-                guint8 *d = data + x * drawable->bpp;
-                gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
-
-                alpha *= config->opacity / 25500.0;
-                *(p++) = 0.5 + alpha * (gdouble) d[0];
-                *(p++) = 0.5 + alpha * (gdouble) d[1];
-                *(p++) = 0.5 + alpha * (gdouble) d[2];
-              }
+          for (x = 0; x < width; x++)
+            {
+              guint8 *d = data + x * drawable_bpp;
+              guint8 r, g, b;
+              gushort rgb16;
+              gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
+
+              alpha *= config->opacity / 25500.0;
+              r = (0.5 + alpha * (gdouble) d[0]);
+              g = (0.5 + alpha * (gdouble) d[1]);
+              b = (0.5 + alpha * (gdouble) d[2]);
+              r >>= 3;
+              g >>= 2;
+              b >>= 3;
+              rgb16 = (r << 11) + (g << 5) + b;
+              *(p++) = (guchar) rgb16;
+              *(p++) = (guchar) (rgb16 >> 8);
+            }
         }
-
-      img_buffer = data + pad;
-      if (config->use_rle)
+      else if (config->alpha)
         {
-          img_buffer_end = rl_encode_rgbx (data, img_buffer,
-                                           img_buffer + n_bytes, bpp);
-          img_buffer = data;
+          for (x = 0; x < width; x++)
+            {
+              guint8 *d = data + x * drawable_bpp;
+              gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
+
+              alpha *= config->opacity / 100.0;
+              *(p++) = d[0];
+              *(p++) = d[1];
+              *(p++) = d[2];
+              *(p++) = alpha + 0.5;
+            }
         }
       else
         {
-          img_buffer_end = img_buffer + n_bytes;
+          for (x = 0; x < width; x++)
+            {
+              guint8 *d = data + x * drawable_bpp;
+              gdouble alpha = drawable_type == GIMP_RGBA_IMAGE ? d[3] : 0xff;
+
+              alpha *= config->opacity / 25500.0;
+              *(p++) = 0.5 + alpha * (gdouble) d[0];
+              *(p++) = 0.5 + alpha * (gdouble) d[1];
+              *(p++) = 0.5 + alpha * (gdouble) d[2];
+            }
         }
     }
 
+  img_buffer = data + pad;
+  if (config->use_rle)
+    {
+      img_buffer_end = rl_encode_rgbx (data, img_buffer,
+                                       img_buffer + n_bytes, bpp);
+      img_buffer = data;
+    }
+  else
+    {
+      img_buffer_end = img_buffer + n_bytes;
+    }
+
   if (!config->use_macros && config->glib_types)
     {
       s_uint_8 =  "guint8 ";
@@ -551,21 +561,21 @@ save_image (Config  *config,
         fprintf (fp, "%u + 1];\n", (guint) (img_buffer_end - img_buffer));
       else
         fprintf (fp, "%u * %u * %u + 1];\n",
-                 drawable->width,
-                 drawable->height,
+                 width,
+                 height,
                  config->rgb565 ? 2 : (config->alpha ? 4 : 3));
       fprintf (fp, "} %s = {\n", config->prefixed_name);
       fprintf (fp, "  %u, %u, %u,\n",
-               drawable->width,
-               drawable->height,
+               width,
+               height,
                config->rgb565 ? 2 : (config->alpha ? 4 : 3));
     }
   else /* use macros */
     {
       fprintf (fp, "#define %s_WIDTH (%u)\n",
-               macro_name, drawable->width);
+               macro_name, width);
       fprintf (fp, "#define %s_HEIGHT (%u)\n",
-               macro_name, drawable->height);
+               macro_name, height);
       fprintf (fp, "#define %s_BYTES_PER_PIXEL (%u) /* 3:RGB, 4:RGBA */\n",
                macro_name, config->alpha ? 4 : 3);
     }
@@ -630,8 +640,8 @@ save_image (Config  *config,
         fprintf (fp, "%u] =\n", (guint) (img_buffer_end - img_buffer));
       else
         fprintf (fp, "%u * %u * %u + 1] =\n",
-                 drawable->width,
-                 drawable->height,
+                 width,
+                 height,
                  config->alpha ? 4 : 3);
       fprintf (fp, "(\"");
       c = 2;
@@ -660,8 +670,7 @@ save_image (Config  *config,
     fprintf (fp, "\");\n\n");
 
   fclose (fp);
-
-  gimp_drawable_detach (drawable);
+  g_object_unref (buffer);
 
   return TRUE;
 }
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index 7aaebc8..c120c54 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -46,7 +46,7 @@
     'engrave' => { ui => 1 },
     'file-aa' => { ui => 1, gegl => 1, optional => 1, libs => 'AA_LIBS' },
     'file-cel' => { ui => 1 },
-    'file-csource' => { ui => 1 },
+    'file-csource' => { ui => 1, gegl => 1 },
     'file-desktop-link' => {},
     'file-dicom' => { ui => 1, cflags => '-fno-strict-aliasing' },
     'file-gbr' => { ui => 1, gegl => 1 },



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