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