blind

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

blind-time-blur.c (1617B)


      1 /* See LICENSE file for copyright and license details. */
      2 #ifndef TYPE
      3 #include "common.h"
      4 
      5 USAGE("alpha-stream")
      6 
      7 static int first = 1;
      8 
      9 #define FILE "blind-time-blur.c"
     10 #include "define-functions.h"
     11 
     12 int
     13 main(int argc, char *argv[])
     14 {
     15 	struct stream colour, alpha;
     16 	void (*process)(char *restrict output, char *restrict cbuf, char *restrict abuf,
     17 	                struct stream *colour, struct stream *alpha);
     18 
     19 	ARGBEGIN {
     20 	default:
     21 		usage();
     22 	} ARGEND;
     23 
     24 	if (argc != 1)
     25 		usage();
     26 
     27 	eopen_stream(&colour, NULL);
     28 	eopen_stream(&alpha, argv[0]);
     29 
     30 	SELECT_PROCESS_FUNCTION(&colour);
     31 	CHECK_CHANS(&colour, == 3, == 1);
     32 	CHECK_N_CHAN(&colour, 4, 4);
     33 
     34 	echeck_compat(&colour, &alpha);
     35 	fprint_stream_head(stdout, &colour);
     36 	efflush(stdout, "<stdout>");
     37 	process_each_frame_two_streams(&colour, &alpha, STDOUT_FILENO, "<stdout>", process);
     38 	return 0;
     39 }
     40 
     41 #else
     42 
     43 static void
     44 PROCESS(char *output, char *restrict cbuf, char *restrict abuf,
     45         struct stream *colour, struct stream *alpha)
     46 {
     47 	typedef TYPE pixel_t[4];
     48 	pixel_t *restrict clr = (pixel_t *)cbuf;
     49 	pixel_t *restrict alf = (pixel_t *)abuf;
     50 	pixel_t *img = (pixel_t *)output;
     51 	size_t i, n = colour->width * colour->height;
     52 	TYPE a1, a2;
     53 
     54 	if (first) {
     55 		memcpy(output, cbuf, colour->frame_size);
     56 		first = 0;
     57 		return;
     58 	}
     59 
     60 	for (i = 0; i < n; i++, clr++, alf++, img++) {
     61 		a1 = (*img)[3];
     62 		a2 = (*clr)[3] * (*alf)[1] * (*alf)[3];
     63 		a1 *= (1 - a2);
     64 		(*img)[0] = (*img)[0] * a1 + (*clr)[0] * a2;
     65 		(*img)[1] = (*img)[1] * a1 + (*clr)[1] * a2;
     66 		(*img)[2] = (*img)[2] * a1 + (*clr)[2] * a2;
     67 		(*img)[3] = a1 + a2;
     68 	}
     69 
     70 	(void) colour;
     71 	(void) alpha;
     72 
     73 }
     74 
     75 #endif