{
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;
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);
/* 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)) {
/* 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]);
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]);
}
/* 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))