aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-07-05 00:07:13 +0200
committerMattias Andrée <maandree@kth.se>2017-07-05 00:07:13 +0200
commit88752940275b41cf4b8c978f226ff7d55a5f6575 (patch)
tree814f306ccc407699758d57c0ecdbf10497499fd9 /src
parentFix blind-to-image -f (diff)
downloadblind-88752940275b41cf4b8c978f226ff7d55a5f6575.tar.gz
blind-88752940275b41cf4b8c978f226ff7d55a5f6575.tar.bz2
blind-88752940275b41cf4b8c978f226ff7d55a5f6575.tar.xz
Add blind-extract-alpha
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--src/blind-extract-alpha.c62
-rw-r--r--src/stream.c7
-rw-r--r--src/stream.h1
3 files changed, 70 insertions, 0 deletions
diff --git a/src/blind-extract-alpha.c b/src/blind-extract-alpha.c
new file mode 100644
index 0000000..ac27724
--- /dev/null
+++ b/src/blind-extract-alpha.c
@@ -0,0 +1,62 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("colour-file")
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *stream, int fd, const char *fname)\
+ {\
+ char buf[sizeof(stream->buf)];\
+ size_t i, n;\
+ TYPE a;\
+ do {\
+ n = stream->ptr / stream->pixel_size;\
+ for (i = 0; i < n; i++) {\
+ a = ((TYPE *)(stream->buf))[4 * i + 3];\
+ ((TYPE *)(stream->buf))[4 * i + 3] = 1;\
+ ((TYPE *)buf)[4 * i + 0] = a;\
+ ((TYPE *)buf)[4 * i + 1] = a;\
+ ((TYPE *)buf)[4 * i + 2] = a;\
+ ((TYPE *)buf)[4 * i + 3] = 1;\
+ }\
+ n *= stream->pixel_size;\
+ ewriteall(fd, stream->buf, n, fname);\
+ ewriteall(STDOUT_FILENO, buf, n, "<stdout>");\
+ 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);\
+ }
+
+PROCESS(double, lf)
+PROCESS(float, f)
+
+
+int
+main(int argc, char *argv[])
+{
+ struct stream stream;
+ int fd;
+ void (*process)(struct stream *stream, int fd, const char *fname);
+
+ UNOFLAGS(argc != 1);
+
+ eopen_stream(&stream, NULL);
+ fd = eopen(argv[0], O_WRONLY | O_CREAT | O_TRUNC, 0666);
+
+ if (!strcmp(stream.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(stream.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt);
+
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+ if (dprint_stream_head(fd, &stream) < 0)
+ eprintf("dprintf %s:", argv[0]);
+
+ process(&stream, fd, argv[0]);
+ return 0;
+}
diff --git a/src/stream.c b/src/stream.c
index 6c9dc72..c21d269 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -123,6 +123,13 @@ fprint_stream_head(FILE *fp, struct stream *stream)
}
+int
+dprint_stream_head(int fd, struct stream *stream)
+{
+ return DPRINTF_HEAD(fd, stream->frames, stream->width, stream->height, stream->pixfmt);
+}
+
+
size_t
enread_stream(int status, struct stream *stream, size_t n)
{
diff --git a/src/stream.h b/src/stream.h
index d15ce8d..8733f43 100644
--- a/src/stream.h
+++ b/src/stream.h
@@ -88,6 +88,7 @@ void enopen_stream(int status, struct stream *stream, const char *file);
int set_pixel_size(struct stream *stream);
void enset_pixel_size(int status, struct stream *stream);
void fprint_stream_head(FILE *fp, struct stream *stream);
+int dprint_stream_head(int fd, struct stream *stream);
size_t enread_stream(int status, struct stream *stream, size_t n);
void eninf_check_fd(int status, int fd, const char *file);
void encheck_dimensions(int status, const struct stream *stream, enum dimension dimensions, const char *prefix);