refresh rate: comments
[fceu.git] / drivers / gp2x / readpng.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <png.h>
4
5 void readpng(unsigned short *dest, const char *fname)
6 {
7         FILE *fp;
8         png_structp png_ptr = NULL;
9         png_infop info_ptr = NULL;
10         png_bytepp row_ptr = NULL;
11         int height, width, h;
12
13         if (dest == NULL || fname == NULL)
14         {
15                 return;
16         }
17
18         fp = fopen(fname, "rb");
19         if (fp == NULL)
20         {
21                 printf(__FILE__ ": failed to open: %s\n", fname);
22                 return;
23         }
24
25         png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
26         if (!png_ptr)
27         {
28                 printf(__FILE__ ": png_create_read_struct() failed\n");
29                 fclose(fp);
30                 return;
31         }
32
33         info_ptr = png_create_info_struct(png_ptr);
34         if (!info_ptr)
35         {
36                 printf(__FILE__ ": png_create_info_struct() failed\n");
37                 goto done;
38         }
39
40         // Start reading
41         png_init_io(png_ptr, fp);
42         png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_STRIP_ALPHA | PNG_TRANSFORM_PACKING, NULL);
43         row_ptr = png_get_rows(png_ptr, info_ptr);
44         if (row_ptr == NULL)
45         {
46                 printf(__FILE__ ": png_get_rows() failed\n");
47                 goto done;
48         }
49
50         height = info_ptr->height;
51         if (height > 240) height = 240;
52         width = info_ptr->width;
53         if (width > 320) width = 320;
54
55         for (h = 0; h < height; h++)
56         {
57                 unsigned char *src = row_ptr[h];
58                 int len = width;
59                 while (len--)
60                 {
61                         *dest++ = ((src[0]&0xf8)<<8) | ((src[1]&0xf8)<<3) | (src[2] >> 3);
62                         src += 3;
63                 }
64                 dest += 320 - width;
65         }
66
67
68 done:
69         png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, (png_infopp)NULL);
70         fclose(fp);
71 }
72