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);
+}