blind-get-colours.c - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
blind-get-colours.c (1721B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include "common.h" | |
3 | |
4 USAGE("") | |
5 | |
6 static size_t width; | |
7 | |
8 static int | |
9 pixcmp(const void *a, const void *b) | |
10 { | |
11 return memcmp(a, b, width); | |
12 } | |
13 | |
14 static size_t | |
15 unique(char *base, size_t n) | |
16 { | |
17 size_t i, r = 1; | |
18 for (i = 1; i < n; i++) | |
19 if (pixcmp(base + (r - 1) * width, base + i * width) && … | |
20 memcpy(base + (r - 1) * width, base + i * width,… | |
21 return r; | |
22 } | |
23 | |
24 static size_t | |
25 merge(char **sink, size_t n, char *new, size_t m, size_t *siz) | |
26 { | |
27 size_t i, j; | |
28 int c; | |
29 for (i = j = 0; i < n && j < m; i++) { | |
30 c = pixcmp(*sink + i * width, new + j * width); | |
31 if (c > 0) { | |
32 if (n == *siz) { | |
33 *siz = n ? n * 2 : 8; | |
34 *sink = erealloc2(*sink, *siz, width); | |
35 } | |
36 n += 1; | |
37 memmove(*sink + (i + 1) * width, *sink + i * wid… | |
38 memcpy(*sink + i * width, new + j * width, width… | |
39 } | |
40 j += c >= 0; | |
41 } | |
42 m -= j; | |
43 if (n + m > *siz) { | |
44 *siz = n + m; | |
45 *sink = erealloc2(*sink, *siz, width); | |
46 } | |
47 memcpy(*sink + n * width, new + j * width, m * width); | |
48 return n + m; | |
49 } | |
50 | |
51 int | |
52 main(int argc, char *argv[]) | |
53 { | |
54 struct stream stream; | |
55 char *colours = NULL; | |
56 size_t ptr = 0, siz = 0; | |
57 size_t n, m; | |
58 | |
59 UNOFLAGS(argc); | |
60 | |
61 eopen_stream(&stream, NULL); | |
62 width = stream.pixel_size; | |
63 | |
64 do { | |
65 n = stream.ptr / width; | |
66 qsort(stream.buf, n, width, pixcmp); | |
67 m = unique(stream.buf, n); | |
68 ptr = merge(&colours, ptr, stream.buf, m, &siz); | |
69 n *= width; | |
70 memmove(stream.buf, stream.buf + n, stream.ptr -= n); | |
71 } while (eread_stream(&stream, SIZE_MAX)); | |
72 | |
73 stream.frames = 1; | |
74 stream.width = ptr; | |
75 stream.height = 1; | |
76 fprint_stream_head(stdout, &stream); | |
77 efflush(stdout, "<stdout>"); | |
78 ewriteall(STDOUT_FILENO, colours, ptr * width, "<stdout>"); | |
79 | |
80 return 0; | |
81 } |