blind-matrix-shear.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-matrix-shear.c (1952B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("[-a [-d]] [-c]")
6
7 static int by_angle = 0;
8 static int per_channel = 0;
9 static int in_degrees = 0;
10
11 #define FILE "blind-matrix-shear.c"
12 #include "define-functions.h"
13
14 int
15 main(int argc, char *argv[])
16 {
17 struct stream stream;
18 void (*process)(struct stream *stream);
19
20 ARGBEGIN {
21 case 'a':
22 by_angle = 1;
23 break;
24 case 'c':
25 per_channel = 1;
26 break;
27 case 'd':
28 in_degrees = 1;
29 break;
30 default:
31 usage();
32 } ARGEND;
33
34 if (argc || (in_degrees && !by_angle))
35 usage();
36
37 eopen_stream(&stream, NULL);
38
39 SELECT_PROCESS_FUNCTION(&stream);
40 CHECK_CHANS(&stream, == 3, == 1);
41
42 if (stream.width > 2 || stream.height > 2 || stream.width * stream.height != 2)
43 eprintf("<stdin>: each frame must contain exactly 2 pixels\n");
44
45 stream.width = 3;
46 stream.height = 3;
47 fprint_stream_head(stdout, &stream);
48 efflush(stdout, "<stdout>");
49
50 process(&stream);
51 return 0;
52 }
53
54 #else
55
56 static void
57 PROCESS(struct stream *stream)
58 {
59 typedef TYPE pixel_t[4];
60 pixel_t matrix[9];
61 pixel_t buf[2];
62 TYPE conv = in_degrees ? (TYPE)(M_PI / 180.) : 1;
63 size_t i;
64
65 for (i = 0; i < stream->n_chan; i++) {
66 matrix[0][i] = 1, matrix[1][i] = 0, matrix[2][i] = 0;
67 matrix[3][i] = 0, matrix[4][i] = 1, matrix[5][i] = 0;
68 matrix[6][i] = 0, matrix[7][i] = 0, matrix[8][i] = 1;
69 }
70
71 while (eread_frame(stream, buf)) {
72 if (by_angle) {
73 for (i = !per_channel; i < (per_channel ? stream->n_chan : 2); i++) {
74 buf[0][i] = tan(buf[0][i] * conv);
75 buf[1][i] = tan(buf[1][i] * conv);
76 }
77 }
78 if (per_channel) {
79 for (i = 0; i < stream->n_chan; i++) {
80 matrix[1][i] = buf[0][i];
81 matrix[3][i] = buf[1][i];
82 }
83 } else {
84 buf[0][1] *= buf[0][3];
85 buf[1][1] *= buf[1][3];
86 for (i = 0; i < stream->n_chan; i++) {
87 matrix[1][i] = buf[0][1];
88 matrix[3][i] = buf[1][1];
89 }
90 }
91 ewriteall(STDOUT_FILENO, matrix, sizeof(matrix), "<stdout>");
92 }
93 }
94
95 #endif