invert.c - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       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 }