aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/fonts/mkfont.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /sys/gio/fonts/mkfont.c
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'sys/gio/fonts/mkfont.c')
-rw-r--r--sys/gio/fonts/mkfont.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/sys/gio/fonts/mkfont.c b/sys/gio/fonts/mkfont.c
new file mode 100644
index 00000000..841d99f5
--- /dev/null
+++ b/sys/gio/fonts/mkfont.c
@@ -0,0 +1,199 @@
+#include <stdio.h>
+
+#define DEBUG 0
+#define MASK 0x3F
+#define SCALE 1.0
+
+#define max(a,b) (a > b ? a : b)
+#define min(a,b) (a < b ? a : b)
+/*
+#define XCOORD() ((*dp - 'R') + 9)
+#define YCOORD() (('R' - *dp) + 14)
+#define XCOORD() (max(0,min(20,((int)(((*dp - 'R') + 9)*SCALE+0.5)))))
+#define XCOORD() (max(0,min(20,((int)(((*dp - 'R') - minx)*SCALE+0.5)))))
+#define YCOORD() ((int)((('R' - *dp) + 13) * SCALE + 0.5))
+#define XCOORD() ((int)(((*dp - 'R') - minx) * SCALE + 0.5))
+#define YCOORD() (max(0,min(32,(((int)(('R' - *dp) + 13)*SCALE+0.5)))))
+*/
+#define XCOORD() (max(0,((int)(((*dp - 'R') - minx - 2) * SCALE + 0.5))))
+#define YCOORD() (max(0,min(35,(((int)(('R' - *dp) + 16)*SCALE+0.5)))))
+#define ENCODE(pen,x,y) ((int)(((pen<<12)|((x&MASK)<<6))|(y&MASK)))
+
+int chridx[200]; /* Character index table */
+int chrwid[200]; /* Character width table */
+int chrtab[5000]; /* Character stroke table */
+
+
+struct hershey_tab {
+ int num; /* hershey number */
+ int length; /* length */
+ char *code; /* stroke data string */
+} htab[] = {
+#include "hershey.dat"
+};
+
+int encode();
+
+
+main (argc, argv)
+int argc;
+char *argv[];
+{
+ register int i=0;
+ int minx, maxx, charnum=0, idx=0, hnum, hindex, hlength;
+ short x, y, pen, xspace, yspace;
+ char ch, *dp, *data;
+
+ /* Read all the hershey numbers from standard input and build up a
+ * table of stroke data.
+ */
+ ch = 32;
+ while (scanf ("%d", &hnum) != EOF) {
+
+ chridx[charnum] = idx + 1;
+
+ /* Get the index for the given number. */
+ for (hindex=0; hnum != htab[hindex].num; hindex++)
+ ;
+
+ hlength = htab[hindex].length;
+ dp = data = htab[hindex].code;
+
+ if (DEBUG)
+ printf ("'%c' %4d: index=%4d len=%3d dlen=%3d %s\n",
+ ch, hnum, hindex, hlength, strlen(data),
+ (strlen(data) % 2) ? "ERROR" : "");
+
+ /* Now decode the stroke data into X-Y pairs, first pair is for
+ * proportional spacing.
+ */
+ minx = (*dp - 'R'); dp++;
+ maxx = (*dp - 'R'); dp++;
+ chrwid[charnum++] = min (32, maxx - minx + 5);
+
+ if (DEBUG) printf("\twidth (%02d) (%d,%d)\n", maxx-minx,minx,maxx);
+
+ /* Next pair is the initial move. The Y coords are flipped
+ * for what we need so fix that every place we get a Yval.
+ */
+ pen = 0;
+ x = XCOORD(); dp++;
+x = (ch == '1' ? x-3: x);
+ y = YCOORD(); dp++;
+ chrtab[idx++] = ENCODE(pen, x, y);
+
+ if (DEBUG) printf ("\tmove (%3d,%3d) '%s'\n", x, y, dp);
+
+ /* The remainder of the codes are move/draw strokes.
+ */
+ for (i=0; i < (hlength-2); i++) {
+ if (*dp == ' ') {
+ pen = 0;
+ x = XCOORD(); dp++; /* skip pen-up coords */
+x = (ch == '1' ? x-3: x);
+ y = YCOORD(); dp++;
+ i++;
+ } else
+ pen = 1;
+ x = XCOORD(); dp++;
+x = (ch == '1' ? x-3: x);
+ y = YCOORD(); dp++;
+
+ chrtab[idx++] = ENCODE(pen, x, y);
+
+ if (DEBUG)
+ printf("\t%s (%3d,%3d) => %6d\n",
+ pen?"draw":"move", x, y, ENCODE(pen,x,y));
+ }
+ chrtab[idx++] = ENCODE(0, 0, 0);
+ ch++;
+ }
+
+ print_prologue (charnum, idx);
+ print_index (chridx, charnum);
+ printf ("\n\n# Width data.\n\n");
+ print_widths (chrwid, charnum);
+ printf ("\n\n# Stroke data.\n\n");
+ print_strokes (chrtab, idx);
+}
+
+
+print_index (idxtab, N)
+int *idxtab, N;
+{
+ register int i, j, start=1, end=5;
+
+ for (i=0; i < N; ) {
+ printf ("data (chridx(i), i=%03d,%03d) /", start, min(N,end));
+ for (j=0; j < 5 && i < N; j++)
+ printf ("%5d%c", idxtab[i++], (j<4 && i<N ? ',' : '/'));
+ printf ("\n");
+ start = end + 1;
+ end += 5;
+ }
+}
+
+
+print_widths (wtab, N)
+int *wtab, N;
+{
+ register int i, j, start=1, end=5;
+
+ for (i=0; i < N; ) {
+ printf ("data (chrwid(i), i=%03d,%03d) /", start, min(N,end));
+ for (j=0; j < 5 && i < N; j++)
+ printf ("%5d%c", wtab[i++], (j<4 && i<N ? ',' : '/'));
+ printf ("\n");
+ start = end + 1;
+ end += 5;
+ }
+}
+
+
+print_strokes (strtab, N)
+int *strtab, N;
+{
+ register int i, j, start=1, end=5;
+
+ for (i=0; i < N; ) {
+ printf ("data (chrtab(i), i=%04d,%04d) /", start, min(N,end));
+ for (j=0; j < 5 && i < N; j++)
+ printf ("%6d%c", strtab[i++], (j<4 && i<N ? ',' : '/'));
+ printf ("\n");
+ start = end + 1;
+ end += 5;
+ }
+}
+
+
+print_prologue(nidx, nchar)
+int nidx;
+int nchar;
+{
+
+printf ("# CHRTAB -- Table of strokes for the printable ASCII characters. Each\n");
+printf ("# character is encoded as a series of strokes. Each stroke is ex-\n");
+printf ("# pressed by a single integer containing the following bitfields:\n");
+printf ("#\n");
+printf ("# 2 1\n");
+printf ("# 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1\n");
+printf ("# | | | | | | |\n");
+printf ("# | | | +---------+ +---------+\n");
+printf ("# | | | | |\n");
+printf ("# | | | X Y\n");
+printf ("# | | |\n");
+printf ("# | | +-- pen up/down\n");
+printf ("# | +---- begin paint (not used at present)\n");
+printf ("# +------ end paint (not used at present)\n");
+printf ("#\n");
+printf ("#----------------------------------------------------------------------------\n");
+printf ("\n");
+printf ("# Define the database.\n");
+printf ("\n");
+printf ("short chridx[%d]\t# character index in chrtab\n", nidx+1);
+printf ("short chrwid[%d]\t# character width table\n", nidx+1);
+printf ("short chrtab[%d]\t# stroke data to draw the characters\n", nchar+1);
+printf ("\n");
+printf ("# Index into CHRTAB of each printable character (starting with SP)\n");
+printf ("\n");
+}