blind-dual-key.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-dual-key.c (2574B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("[-m] X Y Z dual-X dual-Y dual-Z dual-stream")
6
7 static double X1, Y1, Z1, X2, Y2, Z2;
8
9 #define FILE "blind-dual-key.c"
10 #include "define-functions.h"
11
12 int
13 main(int argc, char *argv[])
14 {
15 struct stream stream, dual;
16 void (*process)(struct stream *stream, struct stream *dual, size_t n);
17
18 UNOFLAGS(argc != 7);
19
20 X1 = etolf_arg("the X value", argv[0]);
21 Y1 = etolf_arg("the Y value", argv[1]);
22 Z1 = etolf_arg("the Z value", argv[2]);
23
24 X2 = etolf_arg("the dual-X value", argv[3]);
25 Y2 = etolf_arg("the dual-Y value", argv[4]);
26 Z2 = etolf_arg("the dual-Z value", argv[5]);
27
28 eopen_stream(&stream, NULL);
29 eopen_stream(&dual, argv[6]);
30
31 SELECT_PROCESS_FUNCTION(&stream);
32 CHECK_ALPHA_CHAN(&stream);
33 CHECK_N_CHAN(&stream, 4, 4);
34
35 fprint_stream_head(stdout, &stream);
36 efflush(stdout, "<stdout>");
37 process_two_streams(&stream, &dual, STDOUT_FILENO, "<stdout>", process);
38 return 0;
39 }
40
41 #else
42
43 static void
44 PROCESS(struct stream *stream, struct stream *dual, size_t n)
45 {
46 size_t i;
47 TYPE x1k = (TYPE)X1, y1k = (TYPE)Y1, z1k = (TYPE)Z1;
48 TYPE x2k = (TYPE)X2, y2k = (TYPE)Y2, z2k = (TYPE)Z2;
49 TYPE x1, y1, z1, a1, x2, y2, z2, a2;
50 TYPE alpha, xalpha, yalpha, zalpha;
51 for (i = 0; i < n; i += stream->pixel_size) {
52 x1 = ((TYPE *)(stream->buf + i))[0];
53 y1 = ((TYPE *)(stream->buf + i))[1];
54 z1 = ((TYPE *)(stream->buf + i))[2];
55 a1 = ((TYPE *)(stream->buf + i))[3];
56 x2 = ((TYPE *)(dual->buf + i))[0];
57 y2 = ((TYPE *)(dual->buf + i))[1];
58 z2 = ((TYPE *)(dual->buf + i))[2];
59 a2 = ((TYPE *)(dual->buf + i))[3];
60 if (x1 == x2 && y1 == y2 && z1 == z2) {
61 if (a1 != a2)
62 ((TYPE *)(stream->buf + i))[3] = (a1 + a2) / 2;
63 continue;
64 }
65 xalpha = x1 == x2 ? (TYPE)0 : (x2 - x1 + x1k - x2k) / (x1k - x2k);
66 yalpha = y1 == y2 ? (TYPE)0 : (y2 - y1 + y1k - y2k) / (y1k - y2k);
67 zalpha = z1 == z2 ? (TYPE)0 : (z2 - z1 + z1k - z2k) / (z1k - z2k);
68 alpha = xalpha > yalpha ? xalpha : yalpha;
69 alpha = alpha > zalpha ? alpha : zalpha;
70 if (!alpha) {
71 ((TYPE *)(stream->buf + i))[0] = (TYPE)0;
72 ((TYPE *)(stream->buf + i))[1] = (TYPE)0;
73 ((TYPE *)(stream->buf + i))[2] = (TYPE)0;
74 ((TYPE *)(stream->buf + i))[3] = (TYPE)0;
75 } else {
76 ((TYPE *)(stream->buf + i))[0] = ((x1 - x1k + x2 - x2k) / alpha + x1k + x2k) / 2;
77 ((TYPE *)(stream->buf + i))[1] = ((y1 - y1k + y2 - y2k) / alpha + y1k + y2k) / 2;
78 ((TYPE *)(stream->buf + i))[2] = ((z1 - z1k + z2 - z2k) / alpha + z1k + z2k) / 2;
79 ((TYPE *)(stream->buf + i))[3] = (a1 + a2) / 2 * alpha;
80 }
81 }
82 }
83
84 #endif