]> Pileus Git - ~andy/gtk/commitdiff
Ok, now it determines if it has an alpha channel. If it does, load it, if
authorMark Crichton <crichton@src.gnome.org>
Tue, 29 Jun 1999 02:54:16 +0000 (02:54 +0000)
committerMark Crichton <crichton@src.gnome.org>
Tue, 29 Jun 1999 02:54:16 +0000 (02:54 +0000)
Ok, now it determines if it has an alpha channel.  If it does, load it, if
not, don't make one.

gdk-pixbuf/io-png.c

index a1fef8dfbf6efb8ee3450b0118023eb749ced2f8..70d2df645f1e2bcc3d6c4bbc58331f3e1911d95a 100644 (file)
@@ -17,7 +17,7 @@ GdkPixBuf *image_load(FILE * f)
 {
        png_structp png_ptr;
        png_infop info_ptr, end_info;
-       gint i, depth, ctype, inttype, passes;
+       gint i, depth, ctype, inttype, passes, bpp;  /* bpp = BYTES/pixel */
        png_uint_32 w, h, x, y;
        png_bytepp rows;
        art_u8 *pixels, *temp, *rowdata;
@@ -74,11 +74,6 @@ GdkPixBuf *image_load(FILE * f)
        if (depth < 8)
                png_set_packing(png_ptr);
 
-       /* Add filler bits to non-alpha PNGs */
-       /* make it 255, full opaque */
-       if (depth == 8 && ctype == PNG_COLOR_TYPE_RGB)
-               png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER);
-
        /* Lastly, if the PNG is greyscale, convert to RGB */
        if (ctype == PNG_COLOR_TYPE_GRAY || ctype == PNG_COLOR_TYPE_GRAY_ALPHA)
                png_set_gray_to_rgb(png_ptr);
@@ -91,7 +86,12 @@ GdkPixBuf *image_load(FILE * f)
 
        /* Allocate some memory and set up row array */
        /* This "inhales vigirously"... */
-       pixels = g_malloc(w*h*4);
+        if (ctype & PNG_COLOR_MASK_ALPHA)
+                bpp = 4;
+        else
+                bpp = 3;
+
+       pixels = g_malloc(w*h*bpp);
        rows = g_malloc(h*sizeof(png_bytep));
 
        if ((!pixels) || (!rows)) {
@@ -101,7 +101,7 @@ GdkPixBuf *image_load(FILE * f)
 
        /* Icky code, but it has to be done... */
        for (i = 0; i < h; i++) {
-               if ((rows[i] = g_malloc(w*sizeof(art_u8)*4)) == NULL) {
+               if ((rows[i] = g_malloc(w*sizeof(art_u8)*bpp)) == NULL) {
                        int n;
                        for (n = 0; n < i; n++)
                                g_free(rows[i]);
@@ -116,16 +116,18 @@ GdkPixBuf *image_load(FILE * f)
        png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
        
        /* Now stuff the bytes into pixels & free rows[y] */
-       /* RGBA order */
+       
        temp = pixels;
+
        for (y = 0; y < h; y++) {
                (png_bytep)rowdata = rows[y];
                for (x = 0; x < w; x++) {
-                       temp[0] = rowdata[(x*4)];
-                       temp[1] = rowdata[(x*4)+1];
-                       temp[2] = rowdata[(x*4)+2];
-                       temp[3] = rowdata[(x*4)+3];
-                       temp += 4;
+                       temp[0] = rowdata[(x*bpp)];
+                       temp[1] = rowdata[(x*bpp)+1];
+                       temp[2] = rowdata[(x*bpp)+2];
+                       if (bpp == 4)
+                               temp[3] = rowdata[(x*4)+3];
+                       temp += bpp;
                }
                g_free(rows[y]);
        }
@@ -134,7 +136,10 @@ GdkPixBuf *image_load(FILE * f)
        /* Return the GdkPixBuf */
        pixbuf = g_new(GdkPixBuf, 1);
 
-       pixbuf->art_pixbuf = art_pixbuf_new_rgba (pixels, w, h, (w*4));
+       if (ctype & PNG_COLOR_MASK_ALPHA)
+               pixbuf->art_pixbuf = art_pixbuf_new_rgba (pixels, w, h, (w*4));
+       else
+               pixbuf->art_pixbuf = art_pixbuf_new_rgb (pixels, w, h, (w*3));
 
        /* Ok, I'm anal...shoot me */
        if (!(pixbuf->art_pixbuf))