blind-matrix-scale.c (1558B)
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-scale.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 size_t i; 55 56 for (i = 0; i < stream->n_chan; i++) { 57 matrix[0][i] = 1, matrix[1][i] = 0, matrix[2][i] = 0; 58 matrix[3][i] = 0, matrix[4][i] = 1, matrix[5][i] = 0; 59 matrix[6][i] = 0, matrix[7][i] = 0, matrix[8][i] = 1; 60 } 61 62 while (eread_frame(stream, buf)) { 63 if (per_channel) { 64 for (i = 0; i < stream->n_chan; i++) { 65 matrix[0][i] = buf[0][i]; 66 matrix[4][i] = buf[1][i]; 67 } 68 } else { 69 buf[0][1] *= buf[0][3]; 70 buf[1][1] *= buf[1][3]; 71 for (i = 0; i < stream->n_chan; i++) { 72 matrix[0][i] = buf[0][1]; 73 matrix[4][i] = buf[1][1]; 74 } 75 } 76 ewriteall(STDOUT_FILENO, matrix, sizeof(matrix), "<stdout>"); 77 } 78 } 79 80 #endif