RSS/Atom feed Twitter
Site is read-only, email is disabled

Extended ppm-load.c to support pgm

This discussion is connected to the gegl-developer-list.gnome.org mailing list which is provided by the GIMP developers and not related to gimpusers.com.

This is a read-only list on gimpusers.com so this discussion thread is read-only, too.

3 of 3 messages available
Toggle history

Please log in to manage your subscriptions.

Extended ppm-load.c to support pgm Dov Grobgeld 26 May 20:03
  Extended ppm-load.c to support pgm Daniel Sabo 27 May 15:20
   Extended ppm-load.c to support pgm Dov Grobgeld 27 May 19:37
Dov Grobgeld
2013-05-26 20:03:24 UTC (over 11 years ago)

Extended ppm-load.c to support pgm

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
@@ -39,8 +40,10 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load."))
#include

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

Daniel Sabo
2013-05-27 15:20:37 UTC (over 11 years ago)

Extended ppm-load.c to support pgm

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 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
@@ -39,8 +40,10 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load."))
#include

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

Dov Grobgeld
2013-05-27 19:37:40 UTC (over 11 years ago)

Extended ppm-load.c to support pgm

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 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 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
@@ -39,8 +40,10 @@ gegl_chant_file_path (path, _("File"), "", _("Path of file to load."))
#include

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