aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-convert.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-05-07 16:48:25 +0200
committerMattias Andrée <maandree@kth.se>2017-05-07 17:10:45 +0200
commit878849c465604d90d236b3c8766bf75a4b6836d2 (patch)
tree315982d2c98ff7ae4de597697575837b41f24206 /src/blind-convert.c
parentAdd support for floats (diff)
downloadblind-878849c465604d90d236b3c8766bf75a4b6836d2.tar.gz
blind-878849c465604d90d236b3c8766bf75a4b6836d2.tar.bz2
blind-878849c465604d90d236b3c8766bf75a4b6836d2.tar.xz
Add blind-convert
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/blind-convert.c')
-rw-r--r--src/blind-convert.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/blind-convert.c b/src/blind-convert.c
new file mode 100644
index 0000000..e26e304
--- /dev/null
+++ b/src/blind-convert.c
@@ -0,0 +1,82 @@
+/* See LICENSE file for copyright and license details. */
+#include "stream.h"
+#include "util.h"
+
+#include <string.h>
+
+USAGE("pixel-format ...")
+
+static void (*outconv)(double x, double y, double z, double a);
+
+#define INCONV(TYPE)\
+ do {\
+ TYPE *pixel, x, y, z, a;\
+ size_t n;\
+ do {\
+ pixel = (TYPE *)stream->buf;\
+ for (n = stream->ptr / stream->pixel_size; n--; pixel += 4) {\
+ x = (TYPE)(pixel[0]);\
+ y = (TYPE)(pixel[1]);\
+ z = (TYPE)(pixel[2]);\
+ a = (TYPE)(pixel[3]);\
+ outconv(x, y, z, a);\
+ }\
+ n = stream->ptr - (stream->ptr % stream->pixel_size);\
+ memmove(stream->buf, stream->buf + n, stream->ptr -= n);\
+ } while (eread_stream(stream, SIZE_MAX));\
+ if (stream->ptr)\
+ eprintf("%s: incomplete frame\n", stream->file);\
+ } while (0)
+
+#define OUTCONV(TYPE)\
+ do {\
+ TYPE pixel[4];\
+ pixel[0] = (TYPE)x;\
+ pixel[1] = (TYPE)y;\
+ pixel[2] = (TYPE)z;\
+ pixel[3] = (TYPE)a;\
+ ewriteall(STDOUT_FILENO, pixel, sizeof(pixel), "<stdout>");\
+ } while (0)
+
+static void inconv_xyza (struct stream *stream) {INCONV(double);}
+static void inconv_xyzaf(struct stream *stream) {INCONV(float);}
+
+static void outconv_xyza (double x, double y, double z, double a) {OUTCONV(double);}
+static void outconv_xyzaf(double x, double y, double z, double a) {OUTCONV(float);}
+
+int
+main(int argc, char *argv[])
+{
+ struct stream stream;
+ const char *pixfmt;
+ void (*inconv)(struct stream *stream);
+
+ UNOFLAGS(!argc);
+
+ eopen_stream(&stream, NULL);
+
+ if (!strcmp(stream.pixfmt, "xyza"))
+ inconv = inconv_xyza;
+ else if (!strcmp(stream.pixfmt, "xyza f"))
+ inconv = inconv_xyzaf;
+ else
+ eprintf("input pixel format %s is not supported\n", stream.pixfmt);
+
+ pixfmt = stream.pixfmt;
+ while (*argv)
+ pixfmt = get_pixel_format(*argv++, pixfmt);
+
+ if (!strcmp(pixfmt, "xyza"))
+ outconv = outconv_xyza;
+ else if (!strcmp(pixfmt, "xyza f"))
+ outconv = outconv_xyzaf;
+ else
+ eprintf("output pixel format %s is not supported\n", pixfmt);
+
+ strcpy(stream.pixfmt, pixfmt);
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+
+ inconv(&stream);
+ return 0;
+}