T hanks for the privilage. After running complete testing of all the different file formats, and fixing several bugs, I went ahead and pushed my first commit to gegl. :-)
Regards, Dov On Mon, May 27, 2013 at 6:20 PM, Daniel Sabo <daniels...@gmail.com> wrote: > 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