FreeCalypso > hg > fc-tourmaline
diff bwsplash/pbm2c.c @ 195:4d9f24c501f3
bwsplash: simple splash screen for FreeCalypso Lite (smallbw)
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 28 Mar 2021 21:36:48 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bwsplash/pbm2c.c Sun Mar 28 21:36:48 2021 +0000 @@ -0,0 +1,116 @@ +/* + * This program compiles bwsplash.pbm into a C char array + * for inclusion into phone UI firmware source. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> + +FILE *inf, *outf; +char *infname, linebuf[128]; +int lineno; + +void +get_input_line() +{ + char *cp; + + if (!fgets(linebuf, sizeof linebuf, inf)) { + fprintf(stderr, "%s: premature EOF\n", infname); + exit(1); + } + lineno++; + cp = index(linebuf, '\n'); + if (!cp) { + fprintf(stderr, "%s line %d: too long or missing newline\n", + infname, lineno); + exit(1); + } + *cp = '\0'; +} + +void +parse_pixel_line(outbuf, npix) + u_char *outbuf; + unsigned npix; +{ + char *cp; + u_char *dp; + unsigned n; + + cp = linebuf; + dp = outbuf; + for (n = 0; n < npix; n++) { + if (*cp != '0' && *cp != '1') { +inv: fprintf(stderr, + "%s line %d: does not match expected line of %u 0/1 characters\n", + infname, lineno, npix); + exit(1); + } + *dp++ = *cp++ - '0'; + } + if (*cp) + goto inv; +} + +void +pack_pixel_byte(bits) + u_char *bits; +{ + unsigned byte, mask, n; + + byte = 0; + for (n = 0, mask = 0x80; n < 8; n++, mask >>= 1) + if (bits[n]) + byte |= mask; + fprintf(outf, "0x%02X,", byte); +} + +main(argc, argv) + char **argv; +{ + unsigned nrow, ncol; + u_char rowbuf[80]; + + if (argc != 3) { + fprintf(stderr, "usage: %s pbmfile outfile\n", argv[0]); + exit(1); + } + infname = argv[1]; + inf = fopen(infname, "r"); + if (!inf) { + perror(infname); + exit(1); + } + get_input_line(); + if (strcmp(linebuf, "P1")) { + fprintf(stderr, + "error in %s: first line is not the expected \"P1\"\n", + infname); + exit(1); + } + get_input_line(); + if (strcmp(linebuf, "80 30")) { + fprintf(stderr, + "error in %s: second line is not the expected \"80 30\"\n", + infname); + exit(1); + } + outf = fopen(argv[2], "w"); + if (!outf) { + perror(argv[2]); + exit(1); + } + for (nrow = 0; nrow < 30; nrow++) { + get_input_line(); + parse_pixel_line(rowbuf, 80); + putc('\t', outf); + for (ncol = 0; ncol < 80; ncol += 8) + pack_pixel_byte(rowbuf + ncol); + putc('\n', outf); + } + exit(0); +}