take a vertically stacked image and make it 2x as wide and 1/2x as tall
[rdex:client.git] / utils / ppmreshape.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int main(int argc, char **argv) {
6   if (argc != 3) { return 1; }
7   char *widths = argv[1];
8   char *heights = argv[2];
9   char ppmtemplate[1024];
10   snprintf(ppmtemplate, 1000, "P6\n%s %s 255\n", widths, heights);
11   int width;
12   int height;
13   if (sscanf(ppmtemplate, "P6\n%d %d 255\n", &width, &height) != 2) { fprintf(stderr, "ppm template parse\n"); return 1; }
14   int n = width * height;
15   int rowbytes = width * 3;
16   unsigned char *rgbs = malloc(n * 3);
17   char ppmout[1024];
18   snprintf(ppmout, 1000, "P6\n%d %d 255\n", width * 2, height / 2);
19   int ppmoutlen = strlen(ppmout);
20   int ppml = strlen(ppmtemplate);
21   char ppm[1024];
22   while (fread(ppm, ppml, 1, stdin) == 1) {
23     ppm[ppml] = '\0';
24     if (strncmp(ppmtemplate, ppm, ppml)) { fprintf(stderr, "ppm template mismatch\n%s%s", ppmtemplate, ppm); return 1; }
25     if (fread(rgbs, n * 3, 1, stdin) != 1) { fprintf(stderr, "ppm read mismatch\n"); return 1; }
26     if (fwrite(ppmout, ppmoutlen, 1, stdout) != 1) { fprintf(stderr, "ppm header write\n"); return 1; }
27     for (int y = 0; y < height / 2; ++y) {
28       if (fwrite(rgbs + ((height / 2) + y) * rowbytes, rowbytes, 1, stdout) != 1) { fprintf(stderr, "ppm write\n"); return 1; }
29       if (fwrite(rgbs +                 y  * rowbytes, rowbytes, 1, stdout) != 1) { fprintf(stderr, "ppm write\n"); return 1; }
30     }
31   }
32   return 0;
33 }