]> Pileus Git - ~andy/gtk/blobdiff - gdk-pixbuf/io-pnm.c
_-prefix the nonstatic pixops_... functions. (#142233, Morten Welinder)
[~andy/gtk] / gdk-pixbuf / io-pnm.c
index bb188eedf2114d396d29dedeb84d8d9912fbd837..437ccaf0e0547da325122cfcba7fa70b3916c83f 100644 (file)
@@ -53,8 +53,9 @@ typedef struct {
 } PnmIOBuffer;
 
 typedef struct {
-       ModuleUpdatedNotifyFunc updated_func;
-       ModulePreparedNotifyFunc prepared_func;
+       GdkPixbufModuleUpdatedFunc updated_func;
+       GdkPixbufModulePreparedFunc prepared_func;
+       GdkPixbufModuleSizeFunc size_func;
        gpointer user_data;
        
        GdkPixbuf *pixbuf;
@@ -81,8 +82,9 @@ typedef struct {
 } 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);
@@ -93,13 +95,6 @@ static gboolean    gdk_pixbuf__pnm_image_load_increment (gpointer context,
 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          */
@@ -764,10 +759,10 @@ gdk_pixbuf__pnm_image_load (FILE *f, GError **error)
                        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,
@@ -775,6 +770,9 @@ gdk_pixbuf__pnm_image_load (FILE *f, GError **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 */
@@ -797,10 +795,7 @@ gdk_pixbuf__pnm_image_load (FILE *f, GError **error)
                        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;
 }
 
 /* 
@@ -810,8 +805,9 @@ gdk_pixbuf__pnm_image_load (FILE *f, GError **error)
  */
 
 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)
 {
@@ -825,6 +821,7 @@ gdk_pixbuf__pnm_image_begin_load (ModulePreparedNotifyFunc prepared_func,
                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;
@@ -949,6 +946,16 @@ gdk_pixbuf__pnm_image_load_increment (gpointer 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) {
@@ -1013,8 +1020,6 @@ gdk_pixbuf__pnm_image_load_increment (gpointer data,
                        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 */
@@ -1037,10 +1042,45 @@ gdk_pixbuf__pnm_image_load_increment (gpointer data,
 }
 
 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;
 }