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.grobg...@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, > Dov > > Diff for ppm-load.c follows: > > diff --git a/operations/external/ppm-load.c > b/operations/external/ppm-load.c > index 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 > >
_______________________________________________ gegl-developer-list mailing list gegl-developer-list@gnome.org https://mail.gnome.org/mailman/listinfo/gegl-developer-list