Introduction
Introduction Statistics Contact Development Disclaimer Help
blind-spatial-arithm.c - blind - suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
blind-spatial-arithm.c (2546B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include "common.h"
3
4 USAGE("operation")
5
6 /* Because the syntax for a function returning a function pointer is dis…
7 typedef void (*process_func)(struct stream *stream);
8
9 #define LIST_OPERATORS(PIXFMT, TYPE)\
10 X(add, img[j & 3] + *buf, PIXFMT, TYPE)\
11 X(mul, img[j & 3] * *buf, PIXFMT, TYPE)\
12 X(min, MIN(img[j & 3], *buf), PIXFMT, TYPE)\
13 X(max, MAX(img[j & 3], *buf), PIXFMT, TYPE)
14
15 #define X(NAME, ALGO, PIXFMT, TYPE)\
16 static void\
17 process_##PIXFMT##_##NAME(struct stream *stream)\
18 {\
19 TYPE img[4], *buf;\
20 size_t i, n, j = 0, m = stream->frame_size / sizeof(*img…
21 int first = 1;\
22 do {\
23 n = stream->ptr / stream->pixel_size * stream->n…
24 buf = (TYPE *)(stream->buf);\
25 for (i = 0; i < n; i++, buf++, j++, j %= m) {\
26 if (!j) {\
27 if (!first)\
28 ewriteall(STDOUT_FILENO,…
29 first = 0;\
30 img[0] = *buf++;\
31 img[1] = *buf++;\
32 img[2] = *buf++;\
33 img[3] = *buf;\
34 i += 3;\
35 j = 3;\
36 } else {\
37 img[j & 3] = ALGO;\
38 }\
39 }\
40 n *= sizeof(TYPE);\
41 memmove(stream->buf, stream->buf + n, stream->pt…
42 } while (eread_stream(stream, SIZE_MAX));\
43 if (!first)\
44 ewriteall(STDOUT_FILENO, img, sizeof(img), "<std…
45 }
46 LIST_OPERATORS(lf, double)
47 LIST_OPERATORS(f, float)
48 #undef X
49
50 static process_func
51 get_process_lf(const char *operation)
52 {
53 #define X(NAME, _ALGO, PIXFMT, TYPE)\
54 if (!strcmp(operation, #NAME)) return process_##PIXFMT##_##NAME;
55 LIST_OPERATORS(lf, double)
56 #undef X
57 eprintf("algorithm not recognised: %s\n", operation);
58 return NULL;
59 }
60
61 static process_func
62 get_process_f(const char *operation)
63 {
64 #define X(NAME, _ALGO, PIXFMT, TYPE)\
65 if (!strcmp(operation, #NAME)) return process_##PIXFMT##_##NAME;
66 LIST_OPERATORS(f, float)
67 #undef X
68 eprintf("algorithm not recognised: %s\n", operation);
69 return NULL;
70 }
71
72 int
73 main(int argc, char *argv[])
74 {
75 struct stream stream;
76 process_func process;
77
78 UNOFLAGS(argc != 1);
79
80 eopen_stream(&stream, NULL);
81 echeck_dimensions(&stream, WIDTH | HEIGHT, NULL);
82
83 CHECK_N_CHAN(&stream, 4, 4);
84 if (stream.encoding == DOUBLE)
85 process = get_process_lf(argv[0]);
86 else if (stream.encoding == FLOAT)
87 process = get_process_f(argv[0]);
88 else
89 eprintf("pixel format %s is not supported, try xyza\n", …
90
91 if (DPRINTF_HEAD(STDOUT_FILENO, stream.frames, 1, 1, stream.pixf…
92 eprintf("dprintf:");
93 process(&stream);
94 if (stream.ptr)
95 eprintf("%s: incomplete frame\n", stream.file);
96 return 0;
97 }
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.