blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

blind-matrix-reflect.c (2008B)


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