blind-time-blur.c - blind - suckless command-line video editing utility
 (HTM) git clone git://git.suckless.org/blind
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) 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