URI: 
       Add blind-extract-alpha - blind - suckless command-line video editing utility
  HTML git clone git://git.suckless.org/blind
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 88752940275b41cf4b8c978f226ff7d55a5f6575
   DIR parent 6128aa893ef5180be5280c7e8185bfee85a00a73
  HTML Author: Mattias Andrée <maandree@kth.se>
       Date:   Wed,  5 Jul 2017 00:07:13 +0200
       
       Add blind-extract-alpha
       
       Signed-off-by: Mattias Andrée <maandree@kth.se>
       
       Diffstat:
         M Makefile                            |       1 +
         M README                              |       3 +++
         A man/blind-extract-alpha.1           |      20 ++++++++++++++++++++
         M man/blind-set-alpha.1               |       3 ++-
         M man/blind.7                         |       3 +++
         A src/blind-extract-alpha.c           |      62 +++++++++++++++++++++++++++++++
         M src/stream.c                        |       7 +++++++
         M src/stream.h                        |       1 +
       
       8 files changed, 99 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       @@ -21,6 +21,7 @@ BIN =\
                blind-dot-product\
                blind-double-sine-wave\
                blind-extend\
       +        blind-extract-alpha\
                blind-find-rectangle\
                blind-flip\
                blind-flop\
   DIR diff --git a/README b/README
       @@ -63,6 +63,9 @@ UTILITIES
               blind-extend(1)
                      Add margins to a video
        
       +       blind-extract-alpha(1)
       +              Split a video into an alpha mask video and a colour mask video
       +
               blind-find-rectangle(1)
                      Locate a coloured rectangle
        
   DIR diff --git a/man/blind-extract-alpha.1 b/man/blind-extract-alpha.1
       @@ -0,0 +1,20 @@
       +.TH BLIND-EXTRACT-ALPHA 1 blind
       +.SH NAME
       +blind-extract-alpha - Split a video into an alpha mask video and a colour mask video
       +.SH SYNOPSIS
       +.B blind-extract-alpha
       +.I colour-file
       +.SH DESCRIPTION
       +.B blind-split
       +reads a video from stdin and writes the same video,
       +except fully opaque, to
       +.IR colour-file ,
       +and writes a fully opaque video to stdout where
       +the colour channels have the values from the alpha
       +channel from the video in stdin.
       +.SH SEE ALSO
       +.BR blind (7),
       +.BR blind-set-alpha (7)
       +.SH AUTHORS
       +Mattias Andrée
       +.RI < maandree@kth.se >
   DIR diff --git a/man/blind-set-alpha.1 b/man/blind-set-alpha.1
       @@ -35,7 +35,8 @@ alpha value.
        .BR blind-arithm (1),
        .BR blind-set-luma (1),
        .BR blind-invert-luma (1),
       -.BR blind-set-saturation (1)
       +.BR blind-set-saturation (1),
       +.BR blind-extract-alpha (1)
        .SH AUTHORS
        Mattias Andrée
        .RI < maandree@kth.se >
   DIR diff --git a/man/blind.7 b/man/blind.7
       @@ -79,6 +79,9 @@ Apply double-sine-wave repetition to gradient
        .BR blind-extend (1)
        Add margins to a video
        .TP
       +.BR blind-extract-alpha (1)
       +Split a video into an alpha mask video and a colour mask video
       +.TP
        .BR blind-find-rectangle (1)
        Locate a coloured rectangle
        .TP
   DIR diff --git a/src/blind-extract-alpha.c b/src/blind-extract-alpha.c
       @@ -0,0 +1,62 @@
       +/* See LICENSE file for copyright and license details. */
       +#include "common.h"
       +
       +USAGE("colour-file")
       +
       +#define PROCESS(TYPE, SUFFIX)\
       +        static void\
       +        process_##SUFFIX(struct stream *stream, int fd, const char *fname)\
       +        {\
       +                char buf[sizeof(stream->buf)];\
       +                size_t i, n;\
       +                TYPE a;\
       +                do {\
       +                        n = stream->ptr / stream->pixel_size;\
       +                        for (i = 0; i < n; i++) {\
       +                                a = ((TYPE *)(stream->buf))[4 * i + 3];\
       +                                ((TYPE *)(stream->buf))[4 * i + 3] = 1;\
       +                                ((TYPE *)buf)[4 * i + 0] = a;\
       +                                ((TYPE *)buf)[4 * i + 1] = a;\
       +                                ((TYPE *)buf)[4 * i + 2] = a;\
       +                                ((TYPE *)buf)[4 * i + 3] = 1;\
       +                        }\
       +                        n *= stream->pixel_size;\
       +                        ewriteall(fd, stream->buf, n, fname);\
       +                        ewriteall(STDOUT_FILENO, buf, n, "<stdout>");\
       +                        memmove(stream->buf, stream->buf + n, stream->ptr -= n);\
       +                } while (eread_stream(stream, SIZE_MAX));\
       +                if (stream->ptr)\
       +                        eprintf("%s: incomplete frame\n", stream->file);\
       +        }
       +
       +PROCESS(double, lf)
       +PROCESS(float, f)
       +
       +
       +int
       +main(int argc, char *argv[])
       +{
       +        struct stream stream;
       +        int fd;
       +        void (*process)(struct stream *stream, int fd, const char *fname);
       +
       +        UNOFLAGS(argc != 1);
       +
       +        eopen_stream(&stream, NULL);
       +        fd = eopen(argv[0], O_WRONLY | O_CREAT | O_TRUNC, 0666);
       +
       +        if (!strcmp(stream.pixfmt, "xyza"))
       +                process = process_lf;
       +        else if (!strcmp(stream.pixfmt, "xyza f"))
       +                process = process_f;
       +        else
       +                eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt);
       +
       +        fprint_stream_head(stdout, &stream);
       +        efflush(stdout, "<stdout>");
       +        if (dprint_stream_head(fd, &stream) < 0)
       +                eprintf("dprintf %s:", argv[0]);
       +
       +        process(&stream, fd, argv[0]);
       +        return 0;
       +}
   DIR diff --git a/src/stream.c b/src/stream.c
       @@ -123,6 +123,13 @@ fprint_stream_head(FILE *fp, struct stream *stream)
        }
        
        
       +int
       +dprint_stream_head(int fd, struct stream *stream)
       +{
       +        return DPRINTF_HEAD(fd, stream->frames, stream->width, stream->height, stream->pixfmt);
       +}
       +
       +
        size_t
        enread_stream(int status, struct stream *stream, size_t n)
        {
   DIR diff --git a/src/stream.h b/src/stream.h
       @@ -88,6 +88,7 @@ void enopen_stream(int status, struct stream *stream, const char *file);
        int set_pixel_size(struct stream *stream);
        void enset_pixel_size(int status, struct stream *stream);
        void fprint_stream_head(FILE *fp, struct stream *stream);
       +int dprint_stream_head(int fd, struct stream *stream);
        size_t enread_stream(int status, struct stream *stream, size_t n);
        void eninf_check_fd(int status, int fd, const char *file);
        void encheck_dimensions(int status, const struct stream *stream, enum dimension dimensions, const char *prefix);