47d0839e |
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 | |