mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 10:50:10 +00:00
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:
parent
8854db3c4f
commit
a83f00d89e
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user