fb2ff.c - randomcrap - random crap programs of varying quality
(HTM) git clone git://git.codemadness.org/randomcrap
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
fb2ff.c (2380B)
---
1 /* convert framebuffer data in specified format to farbfeld */
2 #include <arpa/inet.h>
3
4 #include <errno.h>
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9
10 static char *argv0;
11
12 #include "arg.h"
13
14 static void
15 usage(void)
16 {
17 fprintf(stderr, "usage: %s [-w width] [-h height] [-f fmt]\n", argv0);
18 exit(1);
19 }
20
21 int
22 main(int argc, char *argv[])
23 {
24 size_t rowlen, rowlenin, fmtlen;
25 uint32_t width = 0, height = 0, i, j, k, t;
26 uint16_t *row;
27 uint8_t *rowin;
28 long l;
29 char *fmt = "RGBA";
30
31 ARGBEGIN {
32 case 'w':
33 if ((l = strtol(EARGF(usage()), NULL, 10)) < 0)
34 usage();
35 width = (uint32_t)l;
36 break;
37 case 'h':
38 if ((l = strtol(EARGF(usage()), NULL, 10)) < 0)
39 usage();
40 height = (uint32_t)l;
41 break;
42 case 'f':
43 fmt = EARGF(usage());
44 if (!fmt[0])
45 usage();
46 break;
47 } ARGEND;
48 if (argc || !width || !height)
49 usage();
50 fmtlen = strlen(fmt);
51
52 fputs("farbfeld", stdout);
53 t = htonl(width);
54 fwrite(&t, sizeof(uint32_t), 1, stdout);
55 t = htonl(height);
56 fwrite(&t, sizeof(uint32_t), 1, stdout);
57
58 /* write rows */
59 if (width > SIZE_MAX / ((sizeof("RGBA") - 1) * sizeof(uint16_t))) {
60 fprintf(stderr, "%s: row length integer overflow\n", argv0);
61 return 1;
62 }
63 rowlen = width * (sizeof("RGBA") - 1);
64
65 if (!(row = malloc(rowlen * sizeof(uint16_t)))) {
66 fprintf(stderr, "%s: malloc: out of memory\n", argv0);
67 return 1;
68 }
69
70 rowlenin = width * fmtlen;
71 if (!(rowin = malloc(rowlenin))) {
72 fprintf(stderr, "%s: malloc: out of memory\n", argv0);
73 return 1;
74 }
75
76 for (i = 0; i < height; i++) {
77 if (fread(rowin, 1, rowlenin, stdin) != rowlenin)
78 goto readerr;
79 for (j = 0, k = 0; j < rowlenin - fmtlen && k < rowlen - 4; j += fmtlen, k += 4) {
80 row[k] = row[k + 1] = row[k + 2] = 0;
81 row[k + 3] = 65535;
82
83 for (t = 0; t < fmtlen; t++) {
84 switch (fmt[t]) {
85 case 'R': case 'r':
86 row[k] = htons(rowin[j + t] * 257); break;
87 case 'G': case 'g':
88 row[k + 1] = htons(rowin[j + t] * 257); break;
89 case 'B': case 'b':
90 row[k + 2] = htons(rowin[j + t] * 257); break;
91 case 'A': case 'a':
92 row[k + 3] = htons(rowin[j + t] * 257); break;
93 }
94 }
95 }
96 if (fwrite(row, sizeof(int16_t), rowlen, stdout) != rowlen)
97 goto writeerr;
98 }
99
100 return 0;
101
102 readerr:
103 fprintf(stderr, "%s: fread: ", argv0);
104 perror(NULL);
105
106 return 1;
107
108 writeerr:
109 fprintf(stderr, "%s: fwrite: ", argv0);
110 perror(NULL);
111
112 return 1;
113 }