ff2ppm.c - farbfeld - suckless image format with conversion tools
(HTM) git clone git://git.suckless.org/farbfeld
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
ff2ppm.c (1526B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <arpa/inet.h>
3
4 #include <errno.h>
5 #include <inttypes.h>
6 #include <stdint.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10
11 #include "arg.h"
12 #include "util.h"
13
14 static void
15 usage(void)
16 {
17 die("usage: %s [-b colour]", argv0);
18 }
19
20 int
21 main(int argc, char *argv[])
22 {
23 size_t rowlen, rowoutlen;
24 uint64_t a;
25 uint32_t width, height, i, j, k, l;
26 uint16_t *row, mask[3] = { 0xffff, 0xffff, 0xffff };
27 uint8_t *rowout;
28
29 /* arguments */
30 ARGBEGIN {
31 case 'b':
32 if (parse_mask(EARGF(usage()), mask)) {
33 usage();
34 }
35 break;
36 default:
37 usage();
38 } ARGEND
39
40 if (argc) {
41 usage();
42 }
43
44 /* prepare */
45 ff_read_header(&width, &height);
46 row = ereallocarray(NULL, width, (sizeof("RGBA") - 1) * sizeof(uint16_t));
47 rowout = ereallocarray(NULL, width, (sizeof("RGB") - 1) * sizeof(uint8_t));
48 rowlen = width * (sizeof("RGBA") - 1);
49 rowoutlen = width * (sizeof("RGB") - 1);
50
51 /* write data */
52 printf("P6\n%" PRIu32 " %" PRIu32 "\n255\n", width, height);
53
54 for (i = 0; i < height; ++i) {
55 efread(row, sizeof(uint16_t), rowlen, stdin);
56
57 for (j = 0, k = 0; j < rowlen; j += 4, k += 3) {
58 a = ntohs(row[j + 3]);
59 for (l = 0; l < 3; l++) {
60 /* alpha blending and 8-bit-reduction */
61 rowout[k + l] = (a * ntohs(row[j + l]) +
62 (UINT16_MAX - a) * mask[l]) /
63 (UINT16_MAX *
64 (UINT16_MAX / UINT8_MAX));
65 }
66 }
67
68 efwrite(rowout, sizeof(uint8_t), rowoutlen, stdout);
69 }
70
71 return fshut(stdout, "<stdout>");
72 }