blind-single-colour.c - blind - suckless command-line video editing utility
 (HTM) git clone git://git.suckless.org/blind
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       blind-single-colour.c (2028B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #ifndef TYPE
            3 #include "common.h"
            4 
            5 USAGE("[-f frames | -f 'inf'] [-F pixel-format] -w width -h height (X Y Z | Y) [alpha]")
            6 
            7 static struct stream stream = { .width = 0, .height = 0, .frames = 1 };
            8 static double X, Y, Z, alpha = 1;
            9 static int inf = 0;
           10 
           11 #define FILE "blind-single-colour.c"
           12 #include "define-functions.h"
           13 
           14 int
           15 main(int argc, char *argv[])
           16 {
           17         char *arg;
           18         const char *pixfmt = "xyza";
           19         void (*process)(void);
           20 
           21         ARGBEGIN {
           22         case 'f':
           23                 arg = UARGF();
           24                 if (!strcmp(arg, "inf"))
           25                         inf = 1, stream.frames = 0;
           26                 else
           27                         stream.frames = etozu_flag('f', arg, 1, SIZE_MAX);
           28                 break;
           29         case 'F':
           30                 pixfmt = UARGF();
           31                 break;
           32         case 'w':
           33                 stream.width = etozu_flag('w', UARGF(), 1, SIZE_MAX);
           34                 break;
           35         case 'h':
           36                 stream.height = etozu_flag('h', UARGF(), 1, SIZE_MAX);
           37                 break;
           38         default:
           39                 usage();
           40         } ARGEND;
           41 
           42         if (!stream.width || !stream.height || !argc || argc > 4)
           43                 usage();
           44 
           45         if (argc < 3) {
           46                 Y = etolf_arg("the Y value", argv[0]);
           47                 X = Y * D65_XYZ_X;
           48                 Z = Y * D65_XYZ_Z;
           49         } else {
           50                 X = etolf_arg("the X value", argv[0]);
           51                 Y = etolf_arg("the Y value", argv[1]);
           52                 Z = etolf_arg("the Z value", argv[2]);
           53         }
           54         if (~argc & 1)
           55                 alpha = etolf_arg("the alpha value", argv[argc - 1]);
           56 
           57         if (inf)
           58                 einf_check_fd(STDOUT_FILENO, "<stdout>");
           59 
           60         eset_pixel_format(&stream, pixfmt);
           61         SELECT_PROCESS_FUNCTION(&stream);
           62         CHECK_N_CHAN(&stream, 4, 4);
           63         if (argc < 3)
           64                 CHECK_COLOUR_SPACE(&stream, CIEXYZ);
           65 
           66         fprint_stream_head(stdout, &stream);
           67         efflush(stdout, "<stdout>");
           68 
           69         process();
           70         return 0;
           71 }
           72 
           73 #else
           74 
           75 static void
           76 PROCESS(void)
           77 {
           78         typedef TYPE pixel_t[4];
           79         pixel_t buf[BUFSIZ / 4];
           80         size_t x, y, n, r;
           81         for (x = 0; x < ELEMENTSOF(buf); x++) {
           82                 buf[x][0] = (TYPE)X;
           83                 buf[x][1] = (TYPE)Y;
           84                 buf[x][2] = (TYPE)Z;
           85                 buf[x][3] = (TYPE)alpha;
           86         }
           87         while (inf || stream.frames--)
           88                 for (y = stream.height; y--;)
           89                         for (x = stream.width * sizeof(*buf); x;)
           90                                 for (x -= n = MIN(sizeof(buf), x); n; n -= r)
           91                                         r = ewrite(STDOUT_FILENO, buf, n, "<stdout>");
           92 }
           93 
           94 #endif