| blind-invert-luma.c - blind - suckless command-line video editing utility | |
| git clone git://git.suckless.org/blind | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| blind-invert-luma.c (3065B) | |
| --- | |
| 1 /* See LICENSE file for copyright and license details. */ | |
| 2 #include "common.h" | |
| 3 | |
| 4 USAGE("[-iw] mask-stream") | |
| 5 | |
| 6 #define PROCESS(TYPE, INV)\ | |
| 7 do {\ | |
| 8 size_t i;\ | |
| 9 TYPE w, y, yo;\ | |
| 10 for (i = 0; i < n; i += colour->pixel_size) {\ | |
| 11 w = INV ((TYPE *)(mask->buf + i))[1];\ | |
| 12 w *= ((TYPE *)(mask->buf + i))[3];\ | |
| 13 yo = ((TYPE *)(colour->buf + i))[1];\ | |
| 14 y = (1 - yo) * w + yo * (1 - w);\ | |
| 15 ((TYPE *)(colour->buf + i))[0] += (y - yo) * (TY… | |
| 16 ((TYPE *)(colour->buf + i))[1] = y;\ | |
| 17 ((TYPE *)(colour->buf + i))[2] += (y - yo) * (TY… | |
| 18 /* | |
| 19 * Explaination: | |
| 20 * Y is the luma and ((X / Xn - Y / Yn), (Z / … | |
| 21 * is the chroma (according to CIELAB), where … | |
| 22 * is the white point. | |
| 23 */\ | |
| 24 }\ | |
| 25 } while (0) | |
| 26 | |
| 27 #define PROCESS_W(TYPE, INV)\ | |
| 28 do {\ | |
| 29 size_t i;\ | |
| 30 TYPE w, y, yo, X, Z;\ | |
| 31 for (i = 0; i < n; i += colour->pixel_size) {\ | |
| 32 X = ((TYPE *)(mask->buf + i))[0];\ | |
| 33 Z = ((TYPE *)(mask->buf + i))[2];\ | |
| 34 w = INV ((TYPE *)(mask->buf + i))[1];\ | |
| 35 w *= ((TYPE *)(mask->buf + i))[3];\ | |
| 36 yo = ((TYPE *)(colour->buf + i))[1];\ | |
| 37 y = (1 - yo) * w + yo * (1 - w);\ | |
| 38 ((TYPE *)(colour->buf + i))[0] += (y - yo) * X;\ | |
| 39 ((TYPE *)(colour->buf + i))[1] = y;\ | |
| 40 ((TYPE *)(colour->buf + i))[2] += (y - yo) * Z;\ | |
| 41 }\ | |
| 42 } while (0) | |
| 43 | |
| 44 static void process_lf (struct stream *colour, struct stream *mask, si… | |
| 45 static void process_lf_i (struct stream *colour, struct stream *mask, si… | |
| 46 static void process_lf_w (struct stream *colour, struct stream *mask, si… | |
| 47 static void process_lf_iw(struct stream *colour, struct stream *mask, si… | |
| 48 static void process_f (struct stream *colour, struct stream *mask, si… | |
| 49 static void process_f_i (struct stream *colour, struct stream *mask, si… | |
| 50 static void process_f_w (struct stream *colour, struct stream *mask, si… | |
| 51 static void process_f_iw (struct stream *colour, struct stream *mask, si… | |
| 52 | |
| 53 int | |
| 54 main(int argc, char *argv[]) | |
| 55 { | |
| 56 int invert = 0, whitepoint = 0; | |
| 57 struct stream colour, mask; | |
| 58 void (*process)(struct stream *colour, struct stream *mask, size… | |
| 59 | |
| 60 ARGBEGIN { | |
| 61 case 'i': | |
| 62 invert = 1; | |
| 63 break; | |
| 64 case 'w': | |
| 65 whitepoint = 1; | |
| 66 break; | |
| 67 default: | |
| 68 usage(); | |
| 69 } ARGEND; | |
| 70 | |
| 71 if (argc != 1) | |
| 72 usage(); | |
| 73 | |
| 74 eopen_stream(&colour, NULL); | |
| 75 eopen_stream(&mask, argv[0]); | |
| 76 | |
| 77 CHECK_ALPHA(&colour); | |
| 78 CHECK_COLOUR_SPACE(&colour, CIEXYZ); | |
| 79 if (colour.encoding == DOUBLE) | |
| 80 process = invert ? whitepoint ? process_lf_iw : process_… | |
| 81 : whitepoint ? process_lf_w : process_… | |
| 82 else if (colour.encoding == FLOAT) | |
| 83 process = invert ? whitepoint ? process_f_iw : process_f… | |
| 84 : whitepoint ? process_f_w : process_f; | |
| 85 else | |
| 86 eprintf("pixel format %s is not supported, try xyza\n", … | |
| 87 | |
| 88 fprint_stream_head(stdout, &colour); | |
| 89 efflush(stdout, "<stdout>"); | |
| 90 process_two_streams(&colour, &mask, STDOUT_FILENO, "<stdout>", p… | |
| 91 return 0; | |
| 92 } |