Looks fine to me, assuming you've tested it with both the new and old formats go ahead and push it.
On Sun, May 26, 2013 at 1:03 PM, Dov Grobgeld <dov grobgeld gmail com> wrote:
_______________________________________________In my efforts to learn gegl, I extended the load-ppm.c operation to support PGM files.Do I have permission to commit this on my own, or should I open a bug request?On my todo list is next to create a npy save file operation, to make it easy to examine floating point gray level images in numpy.Regards,DovDiff for ppm-load.c follows:diff --git a/operations/external/ppm-load.c b/operations/external/ppm-load.cindex e22521c..3b25438 100644--- a/operations/external/ppm-load.c+++ b/operations/external/ppm-load.c@@ -31,7 +31,8 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load."))#define MAX_CHARS_IN_ROW 500#define CHANNEL_COUNT 3-#define ASCII_P 80+#define CHANNEL_COUNT_GRAY 1+#define ASCII_P 'P'#include "gegl-chant.h"#include <stdio.h>@@ -39,8 +40,10 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load."))#include <errno.h>typedef enum {- PIXMAP_ASCII = 51,- PIXMAP_RAW = 54,+ PIXMAP_ASCII_GRAY = '2',+ PIXMAP_ASCII = '3',+ PIXMAP_RAW_GRAY = '5',+ PIXMAP_RAW = '6',} map_type;typedef struct {@@ -61,12 +64,15 @@ ppm_load_read_header(FILE *fp,//gchar *retval;gchar header[MAX_CHARS_IN_ROW];gint maxval;+ int channel_count;/* Check the PPM file Type P3 or P6 */fgets (header,MAX_CHARS_IN_ROW,fp);if (header[0] != ASCII_P ||- (header[1] != PIXMAP_ASCII &&+ (header[1] != PIXMAP_ASCII_GRAY &&+ header[1] != PIXMAP_ASCII &&+ header[1] != PIXMAP_RAW_GRAY &&header[1] != PIXMAP_RAW)){g_warning ("Image is not a portable pixmap");@@ -75,6 +81,11 @@ ppm_load_read_header(FILE *fp,img->type = header[1];+ if (img->type == PIXMAP_ASCII_GRAY || img->type == PIXMAP_ASCII_GRAY)+ channel_count = CHANNEL_COUNT_GRAY;+ else+ channel_count = CHANNEL_COUNT;+/* Check the Comments */fgets (header,MAX_CHARS_IN_ROW,fp);while(header[0] == '#')@@ -139,7 +150,9 @@ ppm_load_read_header(FILE *fp,g_warning ("Illegal width/height: %ld/%ld", img->width, img->height);return FALSE;}- img->numsamples = img->width * img->height * CHANNEL_COUNT;+++ img->numsamples = img->width * img->height * channel_count;return TRUE;}@@ -150,7 +163,7 @@ ppm_load_read_image(FILE *fp,{guint i;- if (img->type == PIXMAP_RAW)+ if (img->type == PIXMAP_RAW || img->type == PIXMAP_RAW_GRAY){fread (img->data, img->bpc, img->numsamples, fp);@@ -168,7 +181,7 @@ ppm_load_read_image(FILE *fp,}else{- /* Plain PPM format */+ /* Plain PPM or PGM format */if (img->bpc == sizeof (guchar)){@@ -215,21 +228,26 @@ get_bounding_box (GeglOperation *operation)if (!ppm_load_read_header (fp, &img))goto out;- switch (img.bpc)+ if (img.bpc == 1){- case 1:+ if (img.numsamples == 3)gegl_operation_set_format (operation, "output",babl_format ("R'G'B' u8"));- break;-- case 2:+ else+ gegl_operation_set_format (operation, "output",+ babl_format ("Y' u8"));+ }+ else if (img.bpc == 2)+ {+ if (img.numsamples == 3)gegl_operation_set_format (operation, "output",babl_format ("R'G'B' u16"));- break;-- default:- g_warning ("%s: Programmer stupidity error", G_STRLOC);+ else+ gegl_operation_set_format (operation, "output",+ babl_format ("Y' u8"));}+ else+ g_warning ("%s: Programmer stupidity error", G_STRLOC);result.width = img.width;result.height = img.height;@@ -279,39 +297,49 @@ process (GeglOperation *operation,rect.height = img.height;rect.width = img.width;- switch (img.bpc)+ if (img.bpc == 1){- case 1:+ if (img.numsamples == 3)gegl_buffer_get (output, &rect, 1.0, babl_format ("R'G'B' u8"), img.data,GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);- break;-- case 2:+ else+ gegl_buffer_get (output, &rect, 1.0, babl_format ("Y' u8"), img.data,+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);+ }+ else if (img.bpc == 2)+ {+ if (img.numsamples == 3)gegl_buffer_get (output, &rect, 1.0, babl_format ("R'G'B' u16"), img.data,GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);- break;-- default:- g_warning ("%s: Programmer stupidity error", G_STRLOC);+ else+ gegl_buffer_get (output, &rect, 1.0, babl_format ("Y' u16"), img.data,+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);}+ else+ g_warning ("%s: Programmer stupidity error", G_STRLOC);ppm_load_read_image (fp, &img);- switch (img.bpc)+ if (img.bpc == 1){- case 1:+ if (img.numsamples == 3)gegl_buffer_set (output, &rect, 0, babl_format ("R'G'B' u8"), img.data,GEGL_AUTO_ROWSTRIDE);- break;-- case 2:+ else+ gegl_buffer_set (output, &rect, 0, babl_format ("Y' u8"), img.data,+ GEGL_AUTO_ROWSTRIDE);+ }+ else if (img.bpc == 2)+ {+ if (img.numsamples == 3)gegl_buffer_set (output, &rect, 0, babl_format ("R'G'B' u16"), img.data,GEGL_AUTO_ROWSTRIDE);- break;-- default:- g_warning ("%s: Programmer stupidity error", G_STRLOC);+ else+ gegl_buffer_set (output, &rect, 0, babl_format ("Y' u16"), img.data,+ GEGL_AUTO_ROWSTRIDE);}+ else+ g_warning ("%s: Programmer stupidity error", G_STRLOC);g_free (img.data);@@ -351,6 +379,7 @@ gegl_chant_class_init (GeglChantClass *klass)NULL);gegl_extension_handler_register (".ppm", "gegl:ppm-load");+ gegl_extension_handler_register (".pgm", "gegl:ppm-load");}#endif
gegl-developer-list mailing list
gegl-developer-list gnome org
https://mail.gnome.org/mailman/listinfo/gegl-developer-list