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.
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 |
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
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."))
#includetypedef 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
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."))
#includetypedef 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