cb9a1e3e |
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | #include <png.h> |
5 | |
6 | #define WIDTH 512 |
7 | #define HEIGHT 256 |
8 | |
9 | static unsigned short work_buf[WIDTH * HEIGHT]; |
10 | |
11 | static int writepng(const char *fname, const unsigned short *src) |
12 | { |
13 | png_structp png_ptr = NULL; |
14 | png_infop info_ptr = NULL; |
15 | png_bytepp row_pointers; |
16 | int i, j, ret = -1; |
17 | FILE *f; |
18 | |
19 | f = fopen(fname, "wb"); |
20 | if (f == NULL) { |
21 | printf(__FILE__ ": failed to open \"%s\"\n", fname); |
22 | return -1; |
23 | } |
24 | |
25 | row_pointers = calloc(HEIGHT, sizeof(row_pointers[0])); |
26 | if (row_pointers == NULL) |
27 | goto end1; |
28 | |
29 | for (i = 0; i < HEIGHT; i++) { |
30 | unsigned char *dst = malloc(WIDTH * 3); |
31 | if (dst == NULL) |
32 | goto end2; |
33 | row_pointers[i] = dst; |
34 | for (j = 0; j < WIDTH; j++, src++, dst += 3) { |
35 | unsigned short v = (*src >> 8) | (*src << 8); |
36 | dst[0] = (v & 0x7c00) >> 7; |
37 | dst[1] = (v & 0x03e0) >> 2; |
38 | dst[2] = (v & 0x001f) << 3; |
39 | } |
40 | } |
41 | |
42 | /* initialize stuff */ |
43 | png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
44 | if (png_ptr == NULL) { |
45 | fprintf(stderr, "png_create_write_struct() failed"); |
46 | goto end2; |
47 | } |
48 | |
49 | info_ptr = png_create_info_struct(png_ptr); |
50 | if (info_ptr == NULL) { |
51 | fprintf(stderr, "png_create_info_struct() failed"); |
52 | goto end3; |
53 | } |
54 | |
55 | if (setjmp(png_jmpbuf(png_ptr)) != 0) { |
56 | fprintf(stderr, "error in png code\n"); |
57 | goto end4; |
58 | } |
59 | |
60 | png_init_io(png_ptr, f); |
61 | |
62 | png_set_IHDR(png_ptr, info_ptr, WIDTH, HEIGHT, |
63 | 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, |
64 | PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); |
65 | |
66 | png_write_info(png_ptr, info_ptr); |
67 | png_write_image(png_ptr, row_pointers); |
68 | png_write_end(png_ptr, NULL); |
69 | |
70 | ret = 0; |
71 | |
72 | end4: |
73 | // png_destroy_info_struct(png_ptr, &info_ptr); // freed below |
74 | end3: |
75 | png_destroy_write_struct(&png_ptr, &info_ptr); |
76 | end2: |
77 | for (i = 0; i < HEIGHT; i++) |
78 | free(row_pointers[i]); |
79 | free(row_pointers); |
80 | end1: |
81 | fclose(f); |
82 | return ret; |
83 | } |
84 | |
85 | int main(int argc, char *argv[]) |
86 | { |
87 | FILE *f; |
88 | |
89 | if (argc != 3) { |
90 | printf("usage:\n%s <fb_dump> <png>\n", argv[0]); |
91 | return 1; |
92 | } |
93 | |
94 | f = fopen(argv[1], "rb"); |
95 | if (!f) { |
96 | perror("fopen fb_dump"); |
97 | return 1; |
98 | } |
99 | |
100 | if (fread(work_buf, 1, sizeof(work_buf), f) != sizeof(work_buf)) |
101 | printf("read error?\n"); |
102 | |
103 | writepng(argv[2], work_buf); |
104 | return 0; |
105 | } |
106 | |