Introduction
Introduction Statistics Contact Development Disclaimer Help
Add blind-{,un}premultiply, blind-{dot,cross,quaternion}-product, and blind-vec…
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
commit 4dfdb29707bf7af8df1fae28907d5e492338e8b8
parent f9adfc4c7c21dc0526c0d13285e41f4292176378
Author: Mattias Andrée <[email protected]>
Date: Sun, 2 Jul 2017 16:59:44 +0200
Add blind-{,un}premultiply, blind-{dot,cross,quaternion}-product, and blind-vec…
Signed-off-by: Mattias Andrée <[email protected]>
Diffstat:
M Makefile | 6 ++++++
M README | 18 ++++++++++++++++++
M TODO | 7 +++++++
M man/blind-arithm.1 | 4 ++++
A man/blind-cross-product.1 | 32 +++++++++++++++++++++++++++++…
A man/blind-dot-product.1 | 31 +++++++++++++++++++++++++++++…
A man/blind-premultiply.1 | 27 +++++++++++++++++++++++++++
A man/blind-quaternion-product.1 | 36 +++++++++++++++++++++++++++++…
A man/blind-unpremultiply.1 | 29 +++++++++++++++++++++++++++++
A man/blind-vector-projection.1 | 41 +++++++++++++++++++++++++++++…
M man/blind.7 | 18 ++++++++++++++++++
A src/blind-cross-product.c | 62 +++++++++++++++++++++++++++++…
A src/blind-dot-product.c | 55 +++++++++++++++++++++++++++++…
A src/blind-premultiply.c | 76 +++++++++++++++++++++++++++++…
A src/blind-quaternion-product.c | 62 +++++++++++++++++++++++++++++…
A src/blind-unpremultiply.c | 78 +++++++++++++++++++++++++++++…
A src/blind-vector-projection.c | 91 +++++++++++++++++++++++++++++…
17 files changed, 673 insertions(+), 0 deletions(-)
---
diff --git a/Makefile b/Makefile
@@ -11,10 +11,12 @@ BIN =\
blind-concat\
blind-convert\
blind-crop\
+ blind-cross-product\
blind-cut\
blind-decompress\
blind-disperse\
blind-dissolve\
+ blind-dot-product\
blind-extend\
blind-find-rectangle\
blind-flip\
@@ -29,6 +31,8 @@ BIN =\
blind-invert-luma\
blind-make-kernel\
blind-next-frame\
+ blind-quaternion-product\
+ blind-premultiply\
blind-read-head\
blind-repeat\
blind-reverse\
@@ -51,6 +55,8 @@ BIN =\
blind-to-video\
blind-translate\
blind-transpose\
+ blind-unpremultiply\
+ blind-vector-projection\
blind-write-head\
blind-kernel\
blind-temporal-mean
diff --git a/README b/README
@@ -33,12 +33,18 @@ UTILITIES
blind-convert(1)
Change pixel format of a video
+ blind-cross-product(1)
+ Calculate the cross product of colours in a video
+
blind-crop(1)
Extract subframes for all frames
blind-cut(1)
Retain consecutive frames
+ blind-dot-product(1)
+ Calculate the dot product of colours in a video
+
blind-dissolve(1)
Fade a video by chaning it's alpha channel
@@ -87,6 +93,12 @@ UTILITIES
blind-next-frame(1)
Extracts the next frame from a video
+ blind-premultiply(1)
+ Premultiply the alpha channel of a video
+
+ blind-quaternion-product(1)
+ Calculate the quaternion product of colours in a video
+
blind-read-head(1)
Reads the head from a video
@@ -162,6 +174,12 @@ UTILITIES
blind-transpose(1)
Transpose a video
+ blind-unpremultiply(1)
+ Unpremultiply the alpha channel of a video
+
+ blind-vector-projection(1)
+ Calculate the projection or rejection of colours in a video
+
blind-write-head(1)
Writes the head of a video
diff --git a/TODO b/TODO
@@ -64,6 +64,13 @@ long double (xyza q) could be added as another format.
unsigned char (xyza 8) could be added as another format, it's probably good fo…
+UNTESTED:
+ blind-dot-product
+ blind-cross-product
+ blind-quaternion-product
+ blind-vector-projection
+
+
HELP REQUIRED:
blind-z-map create a Z-map video from two or more videos
blind-track track the movement of a point
diff --git a/man/blind-arithm.1 b/man/blind-arithm.1
@@ -77,6 +77,10 @@ Do not modify the Y channel (the second channel).
Do not modify the Z channel (the third channel).
.SH SEE ALSO
.BR blind (7),
+.BR blind-dot-product (1),
+.BR blind-cross-product (1),
+.BR blind-quaternion-product (1),
+.BR blind-vector-projection (1),
.BR blind-single-colour (1),
.BR blind-set-alpha (1),
.BR blind-set-luma (1),
diff --git a/man/blind-cross-product.1 b/man/blind-cross-product.1
@@ -0,0 +1,32 @@
+.TH BLIND-CROSS-PRODUCT 1 blind
+.SH NAME
+blind-cross-product - Calculate the cross product of colours in a video
+.SH SYNOPSIS
+.B blind-cross-product
+.I right-hand-stream
+.SH DESCRIPTION
+.B blind-cross-product
+reads left-hand operands from stdin, and right-hand
+operands from
+.IR right-hand-stream ,
+and calculates the cross product of the colours.
+The values of the alpha channels multiple with each
+others with regular scalar-scalar multiplication.
+.P
+If stdin is longer than
+.IR right-hand-stream ,
+the remainder of stdin is printed without any changes.
+If stdin is shorter than
+.IR right-hand-stream ,
+the remainder of
+.I right-hand-stream
+is ignored but may be partially read.
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-arithm (1),
+.BR blind-dot-product (1),
+.BR blind-quaternion-product (1),
+.BR blind-vector-projection (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind-dot-product.1 b/man/blind-dot-product.1
@@ -0,0 +1,31 @@
+.TH BLIND-DOT-PRODUCT 1 blind
+.SH NAME
+blind-dot-product - Calculate the dot product of colours in a video
+.SH SYNOPSIS
+.B blind-dot-product
+.I right-hand-stream
+.SH DESCRIPTION
+.B blind-dot-product
+reads left-hand operands from stdin, and right-hand
+operands from
+.IR right-hand-stream ,
+and calculates the dot product of the colours. The
+product is store in all four channels.
+.P
+If stdin is longer than
+.IR right-hand-stream ,
+the remainder of stdin is printed without any changes.
+If stdin is shorter than
+.IR right-hand-stream ,
+the remainder of
+.I right-hand-stream
+is ignored but may be partially read.
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-arithm (1),
+.BR blind-cross-product (1),
+.BR blind-quaternion-product (1),
+.BR blind-vector-projection (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind-premultiply.1 b/man/blind-premultiply.1
@@ -0,0 +1,27 @@
+.TH BLIND-PREMULTIPLY 1 blind
+.SH NAME
+blind-premultiply - Premultiply the alpha channel of a video
+.SH SYNOPSIS
+.B blind-premultiply
+[-xyz]
+.SH DESCRIPTION
+.B blind-premultiply
+reads a video from stdin and multiplies the
+colour values with the alpha value for each pixel,
+and prints the resulting video to stdout.
+.SH OPTIONS
+.TP
+.B -x
+Do not modify the X channel (the first channel).
+.TP
+.B -y
+Do not modify the Y channel (the second channel).
+.TP
+.B -z
+Do not modify the Z channel (the third channel).
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-unpremultiply (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind-quaternion-product.1 b/man/blind-quaternion-product.1
@@ -0,0 +1,36 @@
+.TH BLIND-QUATERNION-PRODUCT 1 blind
+.SH NAME
+blind-quaternion-product - Calculate the quaternion product of colours in a vi…
+.SH SYNOPSIS
+.B blind-quaternion-product
+.I right-hand-stream
+.SH DESCRIPTION
+.B blind-quaternion-product
+reads left-hand operands from stdin, and right-hand
+operands from
+.IR right-hand-stream ,
+and calculates the quaternion product of the colours.
+The values in the the first channel (the X channel) are
+treated as real, the values in the the second channel
+(the Y channel) are treated as i-imaginary, the values
+in the the third channel (the Z channel) are treated
+as j-imaginary, and the values in the the fourth channel
+(the alpha channel) are treated as k-imaginary.
+.P
+If stdin is longer than
+.IR right-hand-stream ,
+the remainder of stdin is printed without any changes.
+If stdin is shorter than
+.IR right-hand-stream ,
+the remainder of
+.I right-hand-stream
+is ignored but may be partially read.
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-arithm (1),
+.BR blind-cross-product (1),
+.BR blind-quaternion-product (1),
+.BR blind-vector-projection (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind-unpremultiply.1 b/man/blind-unpremultiply.1
@@ -0,0 +1,29 @@
+.TH BLIND-UNPREMULTIPLY 1 blind
+.SH NAME
+blind-unpremultiply - Unpremultiply the alpha channel of a video
+.SH SYNOPSIS
+.B blind-unpremultiply
+[-xyz]
+.SH DESCRIPTION
+.B blind-unpremultiply
+reads a video from stdin and divides the colour
+with the alpha value for each pixel, and prints
+the resulting video to stdout, effectively
+undoing affects of
+.BR blind-unpremultiply (1).
+.SH OPTIONS
+.TP
+.B -x
+Do not modify the X channel (the first channel).
+.TP
+.B -y
+Do not modify the Y channel (the second channel).
+.TP
+.B -z
+Do not modify the Z channel (the third channel).
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-premultiply (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind-vector-projection.1 b/man/blind-vector-projection.1
@@ -0,0 +1,41 @@
+.TH BLIND-VECTOR-PROJECTION 1 blind
+.SH NAME
+blind-vector-projection - Calculate the projection or rejection of colours in …
+.SH SYNOPSIS
+.B blind-vector-projection
+[-r | -s]
+.I plane-stream
+.SH DESCRIPTION
+.B blind-vector-projection
+reads a video from stdin and a video from
+.IR plane-stream ,
+and calculates the projection of the colours from
+stdin onto the colours from
+.I plane-stream
+and prints the resulting video to stdout.
+.P
+If stdin is longer than
+.IR plane-stream ,
+the remainder of stdin is printed without any changes.
+If stdin is shorter than
+.IR plane-stream ,
+the remainder of
+.I plane-stream
+is ignored but may be partially read.
+.SH OPTIONS
+.TP
+.B -r
+Calculate the vector rejection instead of the vector projection.
+.TP
+.B -s
+Calculate the scalar projection instead of the vector projection.
+The scalar projection is stored in all four channels.
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-arithm (1),
+.BR blind-dot-product (1),
+.BR blind-cross-product (1),
+.BR blind-quaternion-product (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind.7 b/man/blind.7
@@ -43,6 +43,9 @@ Concatenate videos
.BR blind-convert (1)
Change pixel format of a video
.TP
+.BR blind-cross-product (1)
+Calculate the cross product of colours in a video
+.TP
.BR blind-crop (1)
Extract subframes for all frames
.TP
@@ -58,6 +61,9 @@ Fade a video by chaning it's alpha channel
.BR blind-disperse (1)
Framewise split a video into multiple videos
.TP
+.BR blind-dot-product (1)
+Calculate the dot product of colours in a video
+.TP
.BR blind-extend (1)
Add margins to a video
.TP
@@ -100,6 +106,12 @@ Create a custom convolution matrix
.BR blind-next-frame (1)
Extracts the next frame from a video
.TP
+.BR blind-premultiply (1)
+Premultiply the alpha channel of a video
+.TP
+.BR blind-quaternion-product (1)
+Calculate the quaternion product of colours in a video
+.TP
.BR blind-read-head (1)
Reads the head from a video
.TP
@@ -177,6 +189,12 @@ Perform framewise translation of a video
.BR blind-transpose (1)
Transpose a video
.TP
+.BR blind-unpremultiply (1)
+Unpremultiply the alpha channel of a video
+.TP
+.BR blind-vector-projection (1)
+Calculate the projection or rejection of colours in a video
+.TP
.BR blind-write-head (1)
Writes the head of a video
.SH SEE ALSO
diff --git a/src/blind-cross-product.c b/src/blind-cross-product.c
@@ -0,0 +1,62 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("right-hand-stream")
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+#endif
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *left, struct stream *right, size_t n)\
+ {\
+ size_t i;\
+ TYPE *lx, *ly, *lz, *la, *rx, *ry, *rz, *ra, x, y, z, a;\
+ for (i = 0; i < n; i += 4 * sizeof(TYPE)) {\
+ lx = ((TYPE *)(left->buf + i)) + 0, rx = ((TYPE *)(rig…
+ ly = ((TYPE *)(left->buf + i)) + 1, ry = ((TYPE *)(rig…
+ lz = ((TYPE *)(left->buf + i)) + 2, rz = ((TYPE *)(rig…
+ la = ((TYPE *)(left->buf + i)) + 3, ra = ((TYPE *)(rig…
+ x = *ly * *rz - *lz * *ry;\
+ y = *lz * *rx - *lx * *rz;\
+ z = *lx * *ry - *ly * *rx;\
+ a = *la * *ra;\
+ *lx = x;\
+ *ly = y;\
+ *lz = z;\
+ *la = a;\
+ }\
+ }
+
+PROCESS(double, lf)
+PROCESS(float, f)
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic pop
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ struct stream left, right;
+ void (*process)(struct stream *left, struct stream *right, size_t n);
+
+ UNOFLAGS(argc != 2);
+
+ eopen_stream(&left, NULL);
+ eopen_stream(&right, argv[1]);
+
+ if (!strcmp(left.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(left.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", left.p…
+
+ fprint_stream_head(stdout, &left);
+ efflush(stdout, "<stdout>");
+ process_two_streams(&left, &right, STDOUT_FILENO, "<stdout>", process);
+ return 0;
+}
diff --git a/src/blind-dot-product.c b/src/blind-dot-product.c
@@ -0,0 +1,55 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("right-hand-stream")
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+#endif
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *left, struct stream *right, size_t n)\
+ {\
+ size_t i;\
+ TYPE *lx, *ly, *lz, *la, *rx, *ry, *rz, *ra;\
+ for (i = 0; i < n; i += 4 * sizeof(TYPE)) {\
+ lx = ((TYPE *)(left->buf + i)) + 0, rx = ((TYPE *)(rig…
+ ly = ((TYPE *)(left->buf + i)) + 1, ry = ((TYPE *)(rig…
+ lz = ((TYPE *)(left->buf + i)) + 2, rz = ((TYPE *)(rig…
+ la = ((TYPE *)(left->buf + i)) + 3, ra = ((TYPE *)(rig…
+ *lx = *ly = *lz = *la = *lx * *rx + *ly * *ry + *lz * …
+ }\
+ }
+
+PROCESS(double, lf)
+PROCESS(float, f)
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic pop
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ struct stream left, right;
+ void (*process)(struct stream *left, struct stream *right, size_t n);
+
+ UNOFLAGS(argc != 2);
+
+ eopen_stream(&left, NULL);
+ eopen_stream(&right, argv[1]);
+
+ if (!strcmp(left.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(left.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", left.p…
+
+ fprint_stream_head(stdout, &left);
+ efflush(stdout, "<stdout>");
+ process_two_streams(&left, &right, STDOUT_FILENO, "<stdout>", process);
+ return 0;
+}
diff --git a/src/blind-premultiply.c b/src/blind-premultiply.c
@@ -0,0 +1,76 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("[-xyz]")
+
+static int skip_x = 0;
+static int skip_y = 0;
+static int skip_z = 0;
+
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *stream)\
+ {\
+ 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];\
+ if (!skip_x)\
+ ((TYPE *)(stream->buf))[4 * i + 0] *= …
+ if (!skip_y)\
+ ((TYPE *)(stream->buf))[4 * i + 1] *= …
+ if (!skip_z)\
+ ((TYPE *)(stream->buf))[4 * i + 2] *= …
+ }\
+ n *= stream->pixel_size;\
+ ewriteall(STDOUT_FILENO, stream->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;
+ void (*process)(struct stream *stream);
+
+ ARGBEGIN {
+ case 'x':
+ skip_x = 1;
+ break;
+ case 'y':
+ skip_y = 1;
+ break;
+ case 'z':
+ skip_z = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc)
+ usage();
+
+ eopen_stream(&stream, NULL);
+
+ 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…
+
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+ process(&stream);
+ return 0;
+}
diff --git a/src/blind-quaternion-product.c b/src/blind-quaternion-product.c
@@ -0,0 +1,62 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("right-hand-stream")
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+#endif
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *left, struct stream *right, size_t n)\
+ {\
+ size_t i;\
+ TYPE *lx, *ly, *lz, *la, *rx, *ry, *rz, *ra, x, y, z, a;\
+ for (i = 0; i < n; i += 4 * sizeof(TYPE)) {\
+ lx = ((TYPE *)(left->buf + i)) + 0, rx = ((TYPE *)(rig…
+ ly = ((TYPE *)(left->buf + i)) + 1, ry = ((TYPE *)(rig…
+ lz = ((TYPE *)(left->buf + i)) + 2, rz = ((TYPE *)(rig…
+ la = ((TYPE *)(left->buf + i)) + 3, ra = ((TYPE *)(rig…
+ x = *lx * *rx - *ly * *ry - *lz * *rz - *la * *ra;\
+ y = *lz * *ra - *la * *rz + *lx * *ry + *ly * *rx;\
+ z = *la * *ry - *ly * *rz + *lx * *rz + *lz * *rx;\
+ a = *ly * *rz - *lz * *rz + *lx * *ra + *la * *rx;\
+ *lx = x;\
+ *ly = y;\
+ *lz = z;\
+ *la = a;\
+ }\
+ }
+
+PROCESS(double, lf)
+PROCESS(float, f)
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic pop
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ struct stream left, right;
+ void (*process)(struct stream *left, struct stream *right, size_t n);
+
+ UNOFLAGS(argc != 2);
+
+ eopen_stream(&left, NULL);
+ eopen_stream(&right, argv[1]);
+
+ if (!strcmp(left.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(left.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", left.p…
+
+ fprint_stream_head(stdout, &left);
+ efflush(stdout, "<stdout>");
+ process_two_streams(&left, &right, STDOUT_FILENO, "<stdout>", process);
+ return 0;
+}
diff --git a/src/blind-unpremultiply.c b/src/blind-unpremultiply.c
@@ -0,0 +1,78 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("[-xyz]")
+
+static int skip_x = 0;
+static int skip_y = 0;
+static int skip_z = 0;
+
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *stream)\
+ {\
+ 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];\
+ if (!a)\
+ continue;\
+ if (!skip_x)\
+ ((TYPE *)(stream->buf))[4 * i + 0] /= …
+ if (!skip_y)\
+ ((TYPE *)(stream->buf))[4 * i + 1] /= …
+ if (!skip_z)\
+ ((TYPE *)(stream->buf))[4 * i + 2] /= …
+ }\
+ n *= stream->pixel_size;\
+ ewriteall(STDOUT_FILENO, stream->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;
+ void (*process)(struct stream *stream);
+
+ ARGBEGIN {
+ case 'x':
+ skip_x = 1;
+ break;
+ case 'y':
+ skip_y = 1;
+ break;
+ case 'z':
+ skip_z = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc)
+ usage();
+
+ eopen_stream(&stream, NULL);
+
+ 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…
+
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+ process(&stream);
+ return 0;
+}
diff --git a/src/blind-vector-projection.c b/src/blind-vector-projection.c
@@ -0,0 +1,91 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("[-r | -s] plane-stream")
+
+static int level = 1;
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+#endif
+
+#define PROCESS(TYPE, SUFFIX)\
+ static void\
+ process_##SUFFIX(struct stream *left, struct stream *right, size_t n)\
+ {\
+ size_t i;\
+ TYPE *lx, *ly, *lz, *la, rx, ry, rz, ra, x, y, z, a, norm;\
+ for (i = 0; i < n; i += 4 * sizeof(TYPE)) {\
+ lx = ((TYPE *)(left->buf + i)) + 0, rx = ((TYPE *)(rig…
+ ly = ((TYPE *)(left->buf + i)) + 1, ry = ((TYPE *)(rig…
+ lz = ((TYPE *)(left->buf + i)) + 2, rz = ((TYPE *)(rig…
+ la = ((TYPE *)(left->buf + i)) + 3, ra = ((TYPE *)(rig…
+ norm = rx * rx + ry * ry + rz * rz + ra * ra;\
+ norm = sqrt(norm);\
+ x = y = z = a = *lx * rx + *ly * ry + *lz * rz + *la *…
+ if (level) {\
+ x *= rx;\
+ y *= ry;\
+ z *= rz;\
+ a *= rz;\
+ if (level > 1) {\
+ x = *lx - x;\
+ y = *ly - y;\
+ z = *lz - z;\
+ a = *la - a;\
+ }\
+ }\
+ *lx = x;\
+ *ly = y;\
+ *lz = z;\
+ *la = a;\
+ }\
+ }
+
+PROCESS(double, lf)
+PROCESS(float, f)
+
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic pop
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ struct stream left, right;
+ void (*process)(struct stream *left, struct stream *right, size_t n);
+
+ ARGBEGIN {
+ case 'r':
+ if (level == 0)
+ usage();
+ level = 2;
+ break;
+ case 's':
+ if (level == 2)
+ usage();
+ level = 0;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc != 2)
+ usage();
+
+ eopen_stream(&left, NULL);
+ eopen_stream(&right, argv[1]);
+
+ if (!strcmp(left.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(left.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", left.p…
+
+ fprint_stream_head(stdout, &left);
+ efflush(stdout, "<stdout>");
+ process_two_streams(&left, &right, STDOUT_FILENO, "<stdout>", process);
+ return 0;
+}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.