blind-vector-projection.c - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
blind-vector-projection.c (1697B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("[-r | -s] plane-stream")
6
7 static int level = 1;
8
9 #define FILE "blind-vector-projection.c"
10 #include "define-functions.h"
11
12 int
13 main(int argc, char *argv[])
14 {
15 struct stream left, right;
16 void (*process)(struct stream *left, struct stream *right, size_t n);
17
18 ARGBEGIN {
19 case 'r':
20 if (level == 0)
21 usage();
22 level = 2;
23 break;
24 case 's':
25 if (level == 2)
26 usage();
27 level = 0;
28 break;
29 default:
30 usage();
31 } ARGEND;
32
33 if (argc != 1)
34 usage();
35
36 eopen_stream(&left, NULL);
37 eopen_stream(&right, argv[0]);
38
39 SELECT_PROCESS_FUNCTION(&left);
40 CHECK_ALPHA_CHAN(&left);
41 CHECK_N_CHAN(&left, 4, 4);
42
43 fprint_stream_head(stdout, &left);
44 efflush(stdout, "<stdout>");
45 process_two_streams(&left, &right, STDOUT_FILENO, "<stdout>", process);
46 return 0;
47 }
48
49 #else
50
51 static void
52 PROCESS(struct stream *left, struct stream *right, size_t n)
53 {
54 size_t i;
55 TYPE *lx, *ly, *lz, *la, rx, ry, rz, ra, x, y, z, a, norm;
56 for (i = 0; i < n; i += 4 * sizeof(TYPE)) {
57 lx = ((TYPE *)(left->buf + i)) + 0, rx = ((TYPE *)(right->buf + i))[0];
58 ly = ((TYPE *)(left->buf + i)) + 1, ry = ((TYPE *)(right->buf + i))[1];
59 lz = ((TYPE *)(left->buf + i)) + 2, rz = ((TYPE *)(right->buf + i))[2];
60 la = ((TYPE *)(left->buf + i)) + 3, ra = ((TYPE *)(right->buf + i))[3];
61 norm = rx * rx + ry * ry + rz * rz + ra * ra;
62 norm = sqrt(norm);
63 x = y = z = a = *lx * rx + *ly * ry + *lz * rz + *la * ra;
64 if (level) {
65 x *= rx;
66 y *= ry;
67 z *= rz;
68 a *= rz;
69 if (level > 1) {
70 x = *lx - x;
71 y = *ly - y;
72 z = *lz - z;
73 a = *la - a;
74 }
75 }
76 *lx = x;
77 *ly = y;
78 *lz = z;
79 *la = a;
80 }
81 }
82
83 #endif