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

Reply via email to