URI: 
       blind-matrix-rotate.c - 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
       ---
       blind-matrix-rotate.c (2093B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #ifndef TYPE
            3 #include "common.h"
            4 
            5 USAGE("[-cd]")
            6 
            7 static int per_channel = 0;
            8 static int in_degrees = 0;
            9 
           10 #define FILE "blind-matrix-rotate.c"
           11 #include "define-functions.h"
           12 
           13 int
           14 main(int argc, char *argv[])
           15 {
           16         struct stream stream;
           17         void (*process)(struct stream *stream);
           18 
           19         ARGBEGIN {
           20         case 'c':
           21                 per_channel = 1;
           22                 break;
           23         case 'd':
           24                 in_degrees = 1;
           25                 break;
           26         default:
           27                 usage();
           28         } ARGEND;
           29 
           30         if (argc)
           31                 usage();
           32 
           33         eopen_stream(&stream, NULL);
           34 
           35         SELECT_PROCESS_FUNCTION(&stream);
           36         CHECK_CHANS(&stream, == 3, == 1);
           37 
           38         if (stream.width != 1 || stream.height != 1)
           39                 eprintf("<stdin>: each frame must contain exactly 1 pixels\n");
           40 
           41         stream.width  = 3;
           42         stream.height = 3;
           43         fprint_stream_head(stdout, &stream);
           44         efflush(stdout, "<stdout>");
           45 
           46         process(&stream);
           47         return 0;
           48 }
           49 
           50 #else
           51 
           52 static void
           53 PROCESS(struct stream *stream)
           54 {
           55         typedef TYPE pixel_t[4];
           56         pixel_t matrix[9];
           57         pixel_t buf;
           58         size_t i;
           59 
           60         for (i = 0; i < stream->n_chan; i++) {
           61                 matrix[0][i] = 1, matrix[1][i] = 0, matrix[2][i] = 0;
           62                 matrix[3][i] = 0, matrix[4][i] = 1, matrix[5][i] = 0;
           63                 matrix[6][i] = 0, matrix[7][i] = 0, matrix[8][i] = 1;
           64         }
           65 
           66         while (eread_frame(stream, buf)) {
           67                 if (per_channel && in_degrees) {
           68                         for (i = 0; i < stream->n_chan; i++) {
           69                                 matrix[4][i] = matrix[0][i] = degcos(buf[i]);
           70                                 matrix[3][i] = -(matrix[1][i] = degsin(buf[i]));
           71                         }
           72                 } else if (per_channel) {
           73                         for (i = 0; i < stream->n_chan; i++) {
           74                                 matrix[4][i] = matrix[0][i] = cos(buf[i]);
           75                                 matrix[3][i] = -(matrix[1][i] = sin(buf[i]));
           76                         }
           77                 } else {
           78                         buf[1] *= buf[3];
           79                         if (in_degrees) {
           80                                 matrix[4][0] = matrix[0][0] = degcos(buf[1]);
           81                                 matrix[3][0] = -(matrix[1][0] = degsin(buf[1]));
           82                         } else {
           83                                 matrix[4][0] = matrix[0][0] = cos(buf[1]);
           84                                 matrix[3][0] = -(matrix[1][0] = sin(buf[1]));
           85                         }
           86                         for (i = 0; i < stream->n_chan; i++) {
           87                                 matrix[0][i] = matrix[0][0];
           88                                 matrix[1][i] = matrix[1][0];
           89                                 matrix[3][i] = matrix[3][0];
           90                                 matrix[4][i] = matrix[4][0];
           91                         }
           92                 }
           93                 ewriteall(STDOUT_FILENO, matrix, sizeof(matrix), "<stdout>");
           94         }
           95 }
           96 
           97 #endif