blind-extract-alpha.c (1400B)
1 /* See LICENSE file for copyright and license details. */ 2 #ifndef TYPE 3 #include "common.h" 4 5 USAGE("colour-file") 6 7 #define FILE "blind-extract-alpha.c" 8 #include "define-functions.h" 9 10 int 11 main(int argc, char *argv[]) 12 { 13 struct stream stream; 14 int fd; 15 void (*process)(struct stream *stream, int fd, const char *fname); 16 17 UNOFLAGS(argc != 1); 18 19 eopen_stream(&stream, NULL); 20 fd = eopen(argv[0], O_WRONLY | O_CREAT | O_TRUNC, 0666); 21 22 SELECT_PROCESS_FUNCTION(&stream); 23 CHECK_CHANS(&stream, != -1, == stream.luma_chan); 24 25 fprint_stream_head(stdout, &stream); 26 efflush(stdout, "<stdout>"); 27 if (dprint_stream_head(fd, &stream) < 0) 28 eprintf("dprintf %s:", argv[0]); 29 process(&stream, fd, argv[0]); 30 return 0; 31 } 32 33 #else 34 35 static void 36 PROCESS(struct stream *stream, int fd, const char *fname) 37 { 38 char buf[sizeof(stream->buf)]; 39 size_t i, j, n; 40 TYPE a, *p, *b; 41 do { 42 n = stream->ptr / stream->pixel_size; 43 p = (TYPE *)(stream->buf) + stream->luma_chan; 44 b = (TYPE *)buf; 45 for (i = 0; i < n; i++, p += stream->n_chan) { 46 a = *p, *p = 1; 47 for (j = stream->n_chan - 1; j--;) 48 *b++ = a; 49 *b++ = 1; 50 } 51 n *= stream->pixel_size; 52 ewriteall(fd, stream->buf, n, fname); 53 ewriteall(STDOUT_FILENO, buf, n, "<stdout>"); 54 memmove(stream->buf, stream->buf + n, stream->ptr -= n); 55 } while (eread_stream(stream, SIZE_MAX)); 56 if (stream->ptr) 57 eprintf("%s: incomplete frame\n", stream->file); 58 } 59 60 #endif