invert.c (2295B)
1 /* 2 * 0BSD-License 3 * 4 * (c) 2017 Laslo Hunhold <dev@frign.de> 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 }