aboutsummaryrefslogtreecommitdiffstats
path: root/src/vu-single-colour.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vu-single-colour.c')
-rw-r--r--src/vu-single-colour.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/vu-single-colour.c b/src/vu-single-colour.c
new file mode 100644
index 0000000..19fa768
--- /dev/null
+++ b/src/vu-single-colour.c
@@ -0,0 +1,81 @@
+/* See LICENSE file for copyright and license details. */
+#include "arg.h"
+#include "util.h"
+
+#include <inttypes.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+static void
+usage(void)
+{
+ eprintf("usage: %s [-f frames] -w width -h height red green blue [alpha]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ int red, green, blue, alpha = 255;
+ size_t width = 0, height = 0, frames = 1;
+ unsigned char pixel[4];
+ size_t x, y, n;
+ int32_t buf[1024];
+ ssize_t r;
+
+ ARGBEGIN {
+ case 'f':
+ if (tozu(EARGF(usage()), 1, SIZE_MAX, &frames))
+ eprintf("argument of -f must be an integer in [1, %zu]\n", SIZE_MAX);
+ break;
+ case 'w':
+ if (tozu(EARGF(usage()), 1, SIZE_MAX, &width))
+ eprintf("argument of -w must be an integer in [1, %zu]\n", SIZE_MAX);
+ break;
+ case 'h':
+ if (tozu(EARGF(usage()), 1, SIZE_MAX, &height))
+ eprintf("argument of -h must be an integer in [1, %zu]\n", SIZE_MAX);
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (!width || !height || argc < 3 || argc > 4)
+ usage();
+
+ if (toi(argv[0], 0, 255, &red))
+ eprintf("the red value must be an integer in [0, 255]\n");
+ if (toi(argv[1], 0, 255, &green))
+ eprintf("the green value must be an integer in [0, 255]\n");
+ if (toi(argv[2], 0, 255, &blue))
+ eprintf("the blue value must be an integer in [0, 255]\n");
+ if (argc > 3 && toi(argv[3], 0, 255, &alpha))
+ eprintf("the alpha value must be an integer in [0, 255]\n");
+
+ pixel[0] = (unsigned char)red;
+ pixel[1] = (unsigned char)green;
+ pixel[2] = (unsigned char)blue;
+ pixel[3] = (unsigned char)alpha;
+
+ for (x = 0; x < ELEMENTSOF(buf); x++)
+ buf[x] = *(int32_t *)(void *)pixel;
+ while (frames--) {
+ for (y = height; y--;) {
+ for (x = width; x;) {
+ n = ELEMENTSOF(buf) < x ? ELEMENTSOF(buf) : x;
+ x -= n;
+ n *= sizeof(*buf);
+ while (n) {
+ r = write(STDOUT_FILENO, buf, n);
+ if (r < 0)
+ eprintf("write <stdout>:");
+ n -= (size_t)r;
+ }
+ }
+ }
+ }
+
+ efshut(stdout, "<stdout>");
+ return 0;
+}