ff2png.c - farbfeld - suckless image format with conversion tools | |
git clone git://git.suckless.org/farbfeld | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
ff2png.c (1526B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <arpa/inet.h> | |
3 | |
4 #include <errno.h> | |
5 #include <stdint.h> | |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 | |
10 #include <png.h> | |
11 | |
12 #include "util.h" | |
13 | |
14 static void | |
15 png_err(png_struct *pngs, const char *msg) | |
16 { | |
17 (void)pngs; | |
18 die("libpng: %s", msg); | |
19 } | |
20 | |
21 static void | |
22 png_setup_writer(png_struct **s, png_info **i, uint32_t w, uint32_t h) | |
23 { | |
24 *s = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, png_er… | |
25 *i = png_create_info_struct(*s); | |
26 | |
27 if (!*s || !*i) { | |
28 die("Failed to initialize libpng"); | |
29 } | |
30 | |
31 png_init_io(*s, stdout); | |
32 png_set_IHDR(*s, *i, w, h, 16, PNG_COLOR_TYPE_RGB_ALPHA, | |
33 PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, | |
34 PNG_FILTER_TYPE_BASE); | |
35 png_write_info(*s, *i); | |
36 } | |
37 | |
38 static void | |
39 usage(void) | |
40 { | |
41 die("usage: %s", argv0); | |
42 } | |
43 | |
44 int | |
45 main(int argc, char *argv[]) | |
46 { | |
47 png_struct *pngs; | |
48 png_info *pngi; | |
49 size_t rowlen; | |
50 uint32_t width, height, i; | |
51 uint16_t *row; | |
52 | |
53 /* arguments */ | |
54 argv0 = argv[0], argc--, argv++; | |
55 | |
56 if (argc) { | |
57 usage(); | |
58 } | |
59 | |
60 /* prepare */ | |
61 ff_read_header(&width, &height); | |
62 png_setup_writer(&pngs, &pngi, width, height); | |
63 row = ereallocarray(NULL, width, (sizeof("RGBA") - 1) * sizeof(u… | |
64 rowlen = width * (sizeof("RGBA") - 1); | |
65 | |
66 /* write data */ | |
67 for (i = 0; i < height; ++i) { | |
68 efread(row, sizeof(uint16_t), rowlen, stdin); | |
69 png_write_row(pngs, (uint8_t *)row); | |
70 } | |
71 | |
72 /* clean up */ | |
73 png_write_end(pngs, NULL); | |
74 png_destroy_write_struct(&pngs, NULL); | |
75 | |
76 return fshut(stdout, "<stdout>"); | |
77 } |