blind-transpose.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-transpose.c (1379B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include "common.h"
            3 
            4 USAGE("")
            5 
            6 static size_t srcw, srch, srcwps, srchps, ps, n;
            7 
            8 #define PROCESS(TYPE)\
            9         do {\
           10                 size_t x, i;\
           11                 char *src, *img;\
           12                 for (x = 0; x < srchps; x += ps) {\
           13                         img = row + x;\
           14                         src = col + x * srcw;\
           15                         for (i = 0; i < n; i++)\
           16                                 ((TYPE *)img)[i] = ((TYPE *)src)[i];\
           17                 }\
           18         } while (0)
           19 
           20 static void process_long(char *row, char *col) {PROCESS(long);}
           21 static void process_char(char *row, char *col) {PROCESS(char);}
           22 
           23 int
           24 main(int argc, char *argv[])
           25 {
           26         struct stream stream;
           27         char *buf, *image;
           28         size_t y;
           29         void (*process)(char *row, char *col);
           30 
           31         UNOFLAGS(argc);
           32 
           33         eopen_stream(&stream, NULL);
           34         echeck_dimensions(&stream, WIDTH | HEIGHT, NULL);
           35         srch = stream.height, srchps = stream.col_size;
           36         srcw = stream.width,  srcwps = stream.row_size;
           37         stream.height = srcw;
           38         stream.width  = srch;
           39         fprint_stream_head(stdout, &stream);
           40         efflush(stdout, "<stdout>");
           41 
           42         buf   = emalloc(stream.frame_size);
           43         image = emalloc(srchps);
           44 
           45         ps = stream.pixel_size;
           46         process = ps % sizeof(long) ? process_char : process_long;
           47         n = ps / (ps % sizeof(long) ? sizeof(char) : sizeof(long));
           48         while (eread_frame(&stream, buf)) {
           49                 for (y = 0; y < srcwps; y += stream.pixel_size) {
           50                         process(image, buf + y);
           51                         ewriteall(STDOUT_FILENO, image, srchps, "<stdout>");
           52                 }
           53         }
           54 
           55         free(buf);
           56         free(image);
           57         return 0;
           58 }