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.
This commit is contained in:
Mark Crichton 1999-06-29 02:54:16 +00:00
parent 8854db3c4f
commit a83f00d89e

View 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))