blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

blind-extract-alpha.c (1400B)


      1 /* See LICENSE file for copyright and license details. */
      2 #ifndef TYPE
      3 #include "common.h"
      4 
      5 USAGE("colour-file")
      6 
      7 #define FILE "blind-extract-alpha.c"
      8 #include "define-functions.h"
      9 
     10 int
     11 main(int argc, char *argv[])
     12 {
     13 	struct stream stream;
     14 	int fd;
     15 	void (*process)(struct stream *stream, int fd, const char *fname);
     16 
     17 	UNOFLAGS(argc != 1);
     18 
     19 	eopen_stream(&stream, NULL);
     20 	fd = eopen(argv[0], O_WRONLY | O_CREAT | O_TRUNC, 0666);
     21 
     22 	SELECT_PROCESS_FUNCTION(&stream);
     23 	CHECK_CHANS(&stream, != -1, == stream.luma_chan);
     24 
     25 	fprint_stream_head(stdout, &stream);
     26 	efflush(stdout, "<stdout>");
     27 	if (dprint_stream_head(fd, &stream) < 0)
     28 		eprintf("dprintf %s:", argv[0]);
     29 	process(&stream, fd, argv[0]);
     30 	return 0;
     31 }
     32 
     33 #else
     34 
     35 static void
     36 PROCESS(struct stream *stream, int fd, const char *fname)
     37 {
     38 	char buf[sizeof(stream->buf)];
     39 	size_t i, j, n;
     40 	TYPE a, *p, *b;
     41 	do {
     42 		n = stream->ptr / stream->pixel_size;
     43 		p = (TYPE *)(stream->buf) + stream->luma_chan;
     44 		b = (TYPE *)buf;
     45 		for (i = 0; i < n; i++, p += stream->n_chan) {
     46 			a = *p, *p = 1;
     47 			for (j = stream->n_chan - 1; j--;)
     48 				*b++ = a;
     49 			*b++ = 1;
     50 		}
     51 		n *= stream->pixel_size;
     52 		ewriteall(fd, stream->buf, n, fname);
     53 		ewriteall(STDOUT_FILENO, buf, n, "<stdout>");
     54 		memmove(stream->buf, stream->buf + n, stream->ptr -= n);
     55 	} while (eread_stream(stream, SIZE_MAX));
     56 	if (stream->ptr)
     57 		eprintf("%s: incomplete frame\n", stream->file);
     58 }
     59 
     60 #endif