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