blind-time-blur.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-time-blur.c (1617B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("alpha-stream")
6
7 static int first = 1;
8
9 #define FILE "blind-time-blur.c"
10 #include "define-functions.h"
11
12 int
13 main(int argc, char *argv[])
14 {
15 struct stream colour, alpha;
16 void (*process)(char *restrict output, char *restrict cbuf, char *restrict abuf,
17 struct stream *colour, struct stream *alpha);
18
19 ARGBEGIN {
20 default:
21 usage();
22 } ARGEND;
23
24 if (argc != 1)
25 usage();
26
27 eopen_stream(&colour, NULL);
28 eopen_stream(&alpha, argv[0]);
29
30 SELECT_PROCESS_FUNCTION(&colour);
31 CHECK_CHANS(&colour, == 3, == 1);
32 CHECK_N_CHAN(&colour, 4, 4);
33
34 echeck_compat(&colour, &alpha);
35 fprint_stream_head(stdout, &colour);
36 efflush(stdout, "<stdout>");
37 process_each_frame_two_streams(&colour, &alpha, STDOUT_FILENO, "<stdout>", process);
38 return 0;
39 }
40
41 #else
42
43 static void
44 PROCESS(char *output, char *restrict cbuf, char *restrict abuf,
45 struct stream *colour, struct stream *alpha)
46 {
47 typedef TYPE pixel_t[4];
48 pixel_t *restrict clr = (pixel_t *)cbuf;
49 pixel_t *restrict alf = (pixel_t *)abuf;
50 pixel_t *img = (pixel_t *)output;
51 size_t i, n = colour->width * colour->height;
52 TYPE a1, a2;
53
54 if (first) {
55 memcpy(output, cbuf, colour->frame_size);
56 first = 0;
57 return;
58 }
59
60 for (i = 0; i < n; i++, clr++, alf++, img++) {
61 a1 = (*img)[3];
62 a2 = (*clr)[3] * (*alf)[1] * (*alf)[3];
63 a1 *= (1 - a2);
64 (*img)[0] = (*img)[0] * a1 + (*clr)[0] * a2;
65 (*img)[1] = (*img)[1] * a1 + (*clr)[1] * a2;
66 (*img)[2] = (*img)[2] * a1 + (*clr)[2] * a2;
67 (*img)[3] = a1 + a2;
68 }
69
70 (void) colour;
71 (void) alpha;
72
73 }
74
75 #endif