invert.c - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
invert.c (2295B) | |
--- | |
1 /* | |
2 * 0BSD-License | |
3 * | |
4 * (c) 2017 Laslo Hunhold <[email protected]> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for | |
7 * any purpose with or without fee is hereby granted. | |
8 * | |
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | |
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | |
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | |
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | |
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | |
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
16 * PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 #include <arpa/inet.h> | |
19 | |
20 #include <errno.h> | |
21 #include <stdint.h> | |
22 #include <stdio.h> | |
23 #include <string.h> | |
24 | |
25 #define LEN(x) (sizeof (x) / sizeof *(x)) | |
26 | |
27 static void | |
28 invert(uint16_t rgba[4]) | |
29 { | |
30 rgba[0] = UINT16_MAX - rgba[0]; | |
31 rgba[1] = UINT16_MAX - rgba[1]; | |
32 rgba[2] = UINT16_MAX - rgba[2]; | |
33 } | |
34 | |
35 int | |
36 main(int argc, char *argv[]) | |
37 { | |
38 uint32_t hdr[4], width, height, i, j, k; | |
39 uint16_t rgba[4]; | |
40 | |
41 /* arguments */ | |
42 if (argc != 1) { | |
43 fprintf(stderr, "usage: %s\n", argv[0]); | |
44 return 1; | |
45 } | |
46 | |
47 /* read header */ | |
48 if (fread(hdr, sizeof(*hdr), LEN(hdr), stdin) != LEN(hdr)) { | |
49 goto readerr; | |
50 } | |
51 if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { | |
52 fprintf(stderr, "%s: invalid magic value\n", argv[0]); | |
53 return 1; | |
54 } | |
55 width = ntohl(hdr[2]); | |
56 height = ntohl(hdr[3]); | |
57 | |
58 /* write data */ | |
59 if (fwrite(hdr, sizeof(*hdr), LEN(hdr), stdout) != 4) { | |
60 goto writerr; | |
61 } | |
62 | |
63 for (i = 0; i < height; i++) { | |
64 for (j = 0; j < width; j++) { | |
65 if (fread(rgba, sizeof(*rgba), LEN(rgba), | |
66 stdin) != LEN(rgba)) { | |
67 goto readerr; | |
68 } | |
69 for (k = 0; k < 4; k++) { | |
70 rgba[k] = ntohs(rgba[k]); | |
71 } | |
72 | |
73 invert(rgba); | |
74 | |
75 for (k = 0; k < 4; k++) { | |
76 rgba[k] = htons(rgba[k]); | |
77 } | |
78 if (fwrite(rgba, sizeof(*rgba), LEN(rgba), | |
79 stdout) != LEN(rgba)) { | |
80 goto writerr; | |
81 } | |
82 } | |
83 } | |
84 | |
85 /* clean up */ | |
86 if (fclose(stdout)) { | |
87 fprintf(stderr, "%s: fclose: %s\n", argv[0], | |
88 strerror(errno)); | |
89 return 1; | |
90 } | |
91 | |
92 return 0; | |
93 readerr: | |
94 fprintf(stderr, "%s: fread: Unexpected EOF\n", argv[0]); | |
95 return 1; | |
96 writerr: | |
97 fprintf(stderr, "%s: fwrite: %s\n", argv[0], strerror(errno)); | |
98 return 1; | |
99 } |