commit 878849c465604d90d236b3c8766bf75a4b6836d2
parent 4df594b3f48679f594e6f738981cb3baca8a42d9
Author: Mattias Andrée <maandree@kth.se>
Date: Sun, 7 May 2017 16:48:25 +0200
Add blind-convert
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
4 files changed, 87 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
@@ -7,6 +7,7 @@ BIN =\
blind-colour-srgb\
blind-compress\
blind-concat\
+ blind-convert\
blind-crop\
blind-cut\
blind-decompress\
diff --git a/src/blind-convert.c 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;
+}
diff --git a/src/blind-next-frame.c b/src/blind-next-frame.c
@@ -56,9 +56,8 @@ main(int argc, char *argv[])
w = stream.width * stream.pixel_size;
for (; stream.frames; stream.frames--) {
for (h = stream.height; h; h--) {
- for (n = w; n; n -= stream.ptr) {
- stream.ptr = 0;
- if (!enread_stream(2, &stream, n))
+ for (n = w; n; n -= stream.ptr, stream.ptr = 0) {
+ if (!stream.ptr && !enread_stream(2, &stream, n))
goto done;
anything = 1;
enwriteall(2, STDOUT_FILENO, stream.buf, stream.ptr, "<stdout>");
diff --git a/src/stream.c b/src/stream.c
@@ -106,6 +106,8 @@ set_pixel_size(struct stream *stream)
{
if (!strcmp(stream->pixfmt, "xyza"))
stream->pixel_size = 4 * sizeof(double);
+ else if (!strcmp(stream->pixfmt, "xyza f"))
+ stream->pixel_size = 4 * sizeof(float);
else
return -1;
return 0;