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 }