} PnmIOBuffer;
typedef struct {
- ModuleUpdatedNotifyFunc updated_func;
- ModulePreparedNotifyFunc prepared_func;
+ GdkPixbufModuleUpdatedFunc updated_func;
+ GdkPixbufModulePreparedFunc prepared_func;
+ GdkPixbufModuleSizeFunc size_func;
gpointer user_data;
GdkPixbuf *pixbuf;
} PnmLoaderContext;
static GdkPixbuf *gdk_pixbuf__pnm_image_load (FILE *f, GError **error);
-static gpointer gdk_pixbuf__pnm_image_begin_load (ModulePreparedNotifyFunc func,
- ModuleUpdatedNotifyFunc func2,
+static gpointer gdk_pixbuf__pnm_image_begin_load (GdkPixbufModuleSizeFunc size_func,
+ GdkPixbufModulePreparedFunc func,
+ GdkPixbufModuleUpdatedFunc func2,
gpointer user_data,
GError **error);
static gboolean gdk_pixbuf__pnm_image_stop_load (gpointer context, GError **error);
static void explode_bitmap_into_buf (PnmLoaderContext *context);
static void explode_gray_into_buf (PnmLoaderContext *context);
-/* Destroy notification function for the pixbuf */
-static void
-free_buffer (guchar *pixels, gpointer data)
-{
- g_free (pixels);
-}
-
/* explode bitmap data into rgb components */
/* we need to know what the row so we can */
context.output_row = 0;
context.output_col = 0;
- context.rowstride = context.width * 3;
- context.pixels = g_try_malloc (context.height * context.width * 3);
+ context.pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
+ context.width, context.height);
- if (!context.pixels) {
+ if (!context.pixbuf) {
/* Failed to allocate memory */
g_set_error (error,
GDK_PIXBUF_ERROR,
_("Can't allocate memory for loading PNM image"));
return NULL;
}
+
+ context.rowstride = context.pixbuf->rowstride;
+ context.pixels = context.pixbuf->pixels;
}
/* if we got here we're reading image data */
break;
}
- return gdk_pixbuf_new_from_data (context.pixels, GDK_COLORSPACE_RGB, FALSE, 8,
- context.width, context.height,
- context.width * 3, free_buffer, NULL);
-
+ return context.pixbuf;
}
/*
*/
static gpointer
-gdk_pixbuf__pnm_image_begin_load (ModulePreparedNotifyFunc prepared_func,
- ModuleUpdatedNotifyFunc updated_func,
+gdk_pixbuf__pnm_image_begin_load (GdkPixbufModuleSizeFunc size_func,
+ GdkPixbufModulePreparedFunc prepared_func,
+ GdkPixbufModuleUpdatedFunc updated_func,
gpointer user_data,
GError **error)
{
return NULL;
}
memset (context, 0, sizeof (PnmLoaderContext));
+ context->size_func = size_func;
context->prepared_func = prepared_func;
context->updated_func = updated_func;
context->user_data = user_data;
context->got_header = TRUE;
}
+
+ if (context->size_func) {
+ gint w = context->width;
+ gint h = context->height;
+ (*context->size_func) (&w, &h, context->user_data);
+
+ if (w == 0 || h == 0)
+ return FALSE;
+ }
+
/* scan until we hit image data */
if (!context->did_prescan) {
if (retval == PNM_SUSPEND) {
break;
} else if (retval == PNM_FATAL_ERR) {
- if (context->pixbuf)
- g_object_unref (context->pixbuf);
return FALSE;
} else if (retval == PNM_OK) {
/* send updated signal */
}
void
-gdk_pixbuf__pnm_fill_vtable (GdkPixbufModule *module)
+MODULE_ENTRY (pnm, fill_vtable) (GdkPixbufModule *module)
+{
+ module->load = gdk_pixbuf__pnm_image_load;
+ module->begin_load = gdk_pixbuf__pnm_image_begin_load;
+ module->stop_load = gdk_pixbuf__pnm_image_stop_load;
+ module->load_increment = gdk_pixbuf__pnm_image_load_increment;
+}
+
+void
+MODULE_ENTRY (pnm, fill_info) (GdkPixbufFormat *info)
{
- module->load = gdk_pixbuf__pnm_image_load;
- module->begin_load = gdk_pixbuf__pnm_image_begin_load;
- module->stop_load = gdk_pixbuf__pnm_image_stop_load;
- module->load_increment = gdk_pixbuf__pnm_image_load_increment;
+ static GdkPixbufModulePattern signature[] = {
+ { "P1", NULL, 100 },
+ { "P2", NULL, 100 },
+ { "P3", NULL, 100 },
+ { "P4", NULL, 100 },
+ { "P5", NULL, 100 },
+ { "P6", NULL, 100 },
+ { NULL, NULL, 0 }
+ };
+ static gchar * mime_types[] = {
+ "image/x-portable-anymap",
+ "image/x-portable-bitmap",
+ "image/x-portable-graymap",
+ "image/x-portable-pixmap",
+ NULL
+ };
+ static gchar * extensions[] = {
+ "pnm",
+ "pbm",
+ "pgm",
+ "ppm",
+ NULL
+ };
+
+ info->name = "pnm";
+ info->signature = signature;
+ info->description = N_("The PNM/PBM/PGM/PPM image format family");
+ info->mime_types = mime_types;
+ info->extensions = extensions;
+ info->flags = 0;
}