]> icculus.org git repositories - btb/d2x.git/blob - misc/pngfile.c
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / misc / pngfile.c
1 #include <stdio.h>
2 #include <png.h>
3
4 #include "pngfile.h"
5 #include "u_mem.h"
6 #include "pstypes.h"
7
8 int read_png(char *filename, png_data *pdata)
9 {
10         ubyte header[8];
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;
16         int i;
17         FILE *fp = NULL;
18
19         if (!filename || !pdata)
20                 return 0;
21
22         if ((fp = fopen(filename, "rb")) == NULL)
23                 return 0;
24
25         fread(header, 1, 8, fp);
26         if (!png_check_sig(header, 8))
27                 return 0;
28
29         png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
30         info_ptr = png_create_info_struct(png_ptr);
31
32         pdata->data = pdata->palette = NULL;
33         pdata->num_palette = 0;
34         if (setjmp(png_ptr->jmpbuf))
35         {
36                 png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
37                 if (pdata->data)
38                         free(pdata->data);
39                 if (pdata->palette)
40                         free(pdata->palette);
41                 if (row_pointers)
42                         free(row_pointers);
43                 fclose(fp);
44                 return 0;
45         }
46
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);
51
52         pdata->width = width;
53         pdata->height = height;
54         pdata->depth = depth;
55
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];
60
61         png_read_image(png_ptr, row_pointers);
62         free(row_pointers);
63         row_pointers=NULL;
64         png_read_end(png_ptr, info_ptr);
65
66         if (color_type == PNG_COLOR_TYPE_PALETTE)
67         {
68                 png_colorp palette;
69
70                 if (png_get_PLTE(png_ptr, info_ptr, &palette, &pdata->num_palette))
71                 {
72                         pdata->palette = (ubyte*)malloc(pdata->num_palette * 3);
73                         memcpy(pdata->palette, palette, pdata->num_palette * 3);
74                 }
75         }
76
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)
81                 pdata->channels = 4;
82         else if (pdata->color && !pdata->alpha)
83                 pdata->channels = 3;
84         else if (!pdata->color && pdata->alpha)
85                 pdata->channels = 2;
86         else //if (!pdata->color && !pdata->alpha)
87                 pdata->channels = 1;
88
89         png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL);
90         fclose(fp);
91
92         return 1;
93 }