Introduction
Introduction Statistics Contact Development Disclaimer Help
blind-affine-colour.c - blind - suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
blind-affine-colour.c (3345B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("[-alp] matrix-stream")
6
7 static int skip_alpha = 0;
8 static int linear = 0;
9 static int per_pixel = 0;
10 static size_t dim;
11
12 #define FILE "blind-affine-colour.c"
13 #include "define-functions.h"
14
15 int
16 main(int argc, char *argv[])
17 {
18 struct stream colour, matrix;
19 void (*process)(struct stream *colour, struct stream *matrix);
20 size_t h;
21
22 ARGBEGIN {
23 case 'a':
24 skip_alpha = 1;
25 break;
26 case 'l':
27 linear = 1;
28 break;
29 case 'p':
30 per_pixel = 1;
31 break;
32 default:
33 usage();
34 } ARGEND;
35
36 if (argc != 1)
37 usage();
38
39 eopen_stream(&colour, NULL);
40 eopen_stream(&matrix, argv[0]);
41
42 SELECT_PROCESS_FUNCTION(&colour);
43 if (skip_alpha && colour.alpha_chan != -1)
44 CHECK_CHANS(&colour, == (short int)(colour.n_chan - 1), …
45 else
46 skip_alpha = 0;
47
48 if (strcmp(colour.pixfmt, matrix.pixfmt))
49 eprintf("videos use incompatible pixel formats\n");
50
51 dim = colour.n_chan - (size_t)skip_alpha + (size_t)!linear;
52 h = matrix.height, matrix.height = dim;
53 echeck_dimensions(&matrix, WIDTH | HEIGHT, "matrix");
54 matrix.height = h;
55
56 if (per_pixel) {
57 if (matrix.height != dim * colour.height || matrix.width…
58 eprintf("the matrice should have the size %zux%z…
59 dim * colour.height, dim * colour.width,…
60 } else {
61 if (matrix.height != dim || matrix.width != dim)
62 eprintf("the matrice should have the size %zux%z…
63 dim, dim, matrix.height, matrix.width);
64 }
65
66 fprint_stream_head(stdout, &colour);
67 efflush(stdout, "<stdout>");
68 process(&colour, &matrix);
69 return 0;
70 }
71
72 #else
73
74 static void
75 PROCESS(struct stream *colour, struct stream *matrix)
76 {
77 char *mbuf;
78 TYPE *mat, *pixel, V[5], M[ELEMENTSOF(V)][ELEMENTSOF(V)];
79 size_t ptr, i, j, w, x = 0, y = 0, cn;
80
81 mbuf = emalloc2(dim, matrix->row_size);
82 mat = (TYPE *)mbuf;
83 w = matrix->width * matrix->n_chan;
84 cn = colour->n_chan - (size_t)skip_alpha;
85
86 memset(M, 0, sizeof(M));
87 for (i = 0; i < ELEMENTSOF(V); i++)
88 M[i][i] = V[i] = 1;
89
90 do {
91 for (ptr = 0; ptr + colour->pixel_size <= colour->ptr; x…
92 if (!x) {
93 if (!y && !eread_segment(matrix, mbuf, d…
94 break;
95 if (!per_pixel) {
96 if (!y) {
97 mat = (TYPE *)mbuf;
98 for (i = 0; i < dim; i++…
99 for (j = 0; j < …
100 M[i][j] …
101 …
102 }
103 y = (y + 1) % colour->height;
104 }
105 }
106 if (per_pixel) {
107 mat = (TYPE *)(mbuf + x * dim * matrix->…
108 for (i = 0; i < dim; i++, mat += w)
109 for (j = 0; j < dim; j++)
110 M[i][j] = mat[j * matrix…
111 * mat[(j + 1) * …
112 }
113 pixel = (TYPE *)(colour->buf + ptr);
114 for (i = 0; i < dim; i++) {
115 V[i] = 0;
116 for (j = 0; j < cn; j++)
117 V[i] += M[i][j] * pixel[j];
118 for (; j < dim; j++)
119 V[i] += M[i][j];
120 }
121 for (i = 0; i < cn; i++)
122 pixel[i] = V[i] / V[cn];
123 }
124 ewriteall(STDOUT_FILENO, colour->buf, ptr, "<stdout>");
125 memmove(colour->buf, colour->buf + ptr, colour->ptr -= p…
126 } while (eread_stream(colour, SIZE_MAX));
127 if (colour->ptr)
128 eprintf("%s: incomplete frame\n", colour->file);
129
130 free(mbuf);
131 }
132
133 #endif
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.