Commit a83f00d8 authored by Mark Crichton's avatar Mark Crichton
Browse files

Ok, now it determines if it has an alpha channel. If it does, load it, if



Ok, now it determines if it has an alpha channel.  If it does, load it, if
not, don't make one.
parent 8854db3c
......@@ -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))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment