aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-single-colour.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blind-single-colour.c')
-rw-r--r--src/blind-single-colour.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/blind-single-colour.c b/src/blind-single-colour.c
new file mode 100644
index 0000000..254ea2a
--- /dev/null
+++ b/src/blind-single-colour.c
@@ -0,0 +1,88 @@
+/* See LICENSE file for copyright and license details. */
+#include "stream.h"
+#include "util.h"
+
+#include <inttypes.h>
+#include <string.h>
+#include <unistd.h>
+
+USAGE("[-f frames | -f 'inf'] -w width -h height (X Y Z | Y) [alpha]")
+
+typedef double pixel_t[4];
+
+int
+main(int argc, char *argv[])
+{
+ struct stream stream;
+ double X, Y, Z, alpha = 1;
+ size_t x, y, n;
+ pixel_t buf[1024];
+ ssize_t r;
+ int inf = 0;
+ char *arg;
+
+ stream.width = 0;
+ stream.height = 0;
+ stream.frames = 1;
+
+ ARGBEGIN {
+ case 'f':
+ arg = EARG();
+ if (!strcmp(arg, "inf"))
+ inf = 1, stream.frames = 0;
+ else
+ stream.frames = etozu_flag('f', arg, 1, SIZE_MAX);
+ break;
+ case 'w':
+ stream.width = etozu_flag('w', EARG(), 1, SIZE_MAX);
+ break;
+ case 'h':
+ stream.height = etozu_flag('h', EARG(), 1, SIZE_MAX);
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (!stream.width || !stream.height || !argc || argc > 4)
+ usage();
+
+ if (argc < 3) {
+ X = D65_XYY_X / D65_XYY_Y;
+ Z = 1 / D65_XYY_Y - 1 - X;
+ Y = etolf_arg("the Y value", argv[1]);
+ } else {
+ X = etolf_arg("the X value", argv[0]);
+ Y = etolf_arg("the Y value", argv[1]);
+ Z = etolf_arg("the Z value", argv[2]);
+ }
+ if (~argc & 1)
+ alpha = etolf_arg("the alpha value", argv[argc - 1]);
+
+ if (inf)
+ einf_check_fd(STDOUT_FILENO, "<stdout>");
+
+ strcpy(stream.pixfmt, "xyza");
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+
+ for (x = 0; x < ELEMENTSOF(buf); x++) {
+ buf[x][0] = X;
+ buf[x][1] = Y;
+ buf[x][2] = Z;
+ buf[x][3] = alpha;
+ }
+ while (inf || stream.frames--) {
+ for (y = stream.height; y--;) {
+ for (x = stream.width; x;) {
+ x -= n = ELEMENTSOF(buf) < x ? ELEMENTSOF(buf) : x;
+ for (n *= sizeof(*buf); n; n -= (size_t)r) {
+ r = write(STDOUT_FILENO, buf, n);
+ if (r < 0)
+ eprintf("write <stdout>:");
+ }
+ }
+ }
+ }
+
+ return 0;
+}