8 int read_png(char *filename, png_data *pdata)
11 png_structp png_ptr = NULL;
12 png_infop info_ptr = NULL;
13 png_bytepp row_pointers = NULL;
14 png_uint_32 width, height;
15 int depth, color_type;
19 if (!filename || !pdata)
22 if ((fp = fopen(filename, "rb")) == NULL)
25 fread(header, 1, 8, fp);
26 if (!png_check_sig(header, 8))
29 png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
30 info_ptr = png_create_info_struct(png_ptr);
32 pdata->data = pdata->palette = NULL;
33 pdata->num_palette = 0;
34 if (setjmp(png_ptr->jmpbuf))
36 png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
47 png_init_io(png_ptr, fp);
48 png_set_sig_bytes(png_ptr, 8);
49 png_read_info(png_ptr, info_ptr);
50 png_get_IHDR(png_ptr, info_ptr, &width, &height, &depth, &color_type, NULL, NULL, NULL);
53 pdata->height = height;
56 pdata->data = (ubyte*)malloc(png_get_rowbytes(png_ptr, info_ptr) * height);
57 row_pointers = (png_bytep *)malloc(sizeof(png_bytep) * height);
58 for (i = 0; i < height; i++)
59 row_pointers[i] = &pdata->data[png_get_rowbytes(png_ptr, info_ptr) * i];
61 png_read_image(png_ptr, row_pointers);
64 png_read_end(png_ptr, info_ptr);
66 if (color_type == PNG_COLOR_TYPE_PALETTE)
70 if (png_get_PLTE(png_ptr, info_ptr, &palette, &pdata->num_palette))
72 pdata->palette = (ubyte*)malloc(pdata->num_palette * 3);
73 memcpy(pdata->palette, palette, pdata->num_palette * 3);
77 pdata->paletted = (color_type & PNG_COLOR_MASK_PALETTE) > 0;
78 pdata->color = (color_type & PNG_COLOR_MASK_COLOR) > 0;
79 pdata->alpha = (color_type & PNG_COLOR_MASK_ALPHA) > 0;
80 if (pdata->color && pdata->alpha)
82 else if (pdata->color && !pdata->alpha)
84 else if (!pdata->color && pdata->alpha)
86 else //if (!pdata->color && !pdata->alpha)
89 png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);