perfect vsync, bugfixes
[fceu.git] / drivers / gp2x / readpng.c
CommitLineData
47d0839e 1#include <stdio.h>
2#include <string.h>
3#include <png.h>
4
5void 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
68done:
69 png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, (png_infopp)NULL);
70 fclose(fp);
71}
72