Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[xsrc/trunk]: xsrc/local/programs/bdfload add -h option to write font data as...
details: https://anonhg.NetBSD.org/xsrc/rev/135bdd290a91
branches: trunk
changeset: 7135:135bdd290a91
user: macallan <macallan%NetBSD.org@localhost>
date: Tue Aug 23 13:56:04 2022 +0000
description:
add -h option to write font data as a header file that can be compiled
into a kernel
diffstat:
local/programs/bdfload/bdfload.c | 144 +++++++++++++++++++++++++++++---------
1 files changed, 109 insertions(+), 35 deletions(-)
diffs (192 lines):
diff -r ab323e7d42af -r 135bdd290a91 local/programs/bdfload/bdfload.c
--- a/local/programs/bdfload/bdfload.c Tue Aug 16 21:52:00 2022 +0000
+++ b/local/programs/bdfload/bdfload.c Tue Aug 23 13:56:04 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bdfload.c,v 1.7 2022/08/16 21:52:00 macallan Exp $ */
+/* $NetBSD: bdfload.c,v 1.8 2022/08/23 13:56:04 macallan Exp $ */
/*
* Copyright (c) 2018 Michael Lorenz
@@ -99,6 +99,7 @@
int encoding = -1;
int verbose = 0;
int dump = 0;
+int header = 0;
void
dump_line(char *gptr, int stride)
@@ -117,6 +118,103 @@
}
void
+write_wsf(const char *oname, struct wsdisplay_font *f, char *buffer, int buflen)
+{
+ struct wsfthdr h;
+
+ memset(&h, 0, sizeof(h));
+ strncpy(h.magic, "WSFT", sizeof(h.magic));
+ strncpy(h.name, f->name, sizeof(h.name));
+ h.firstchar = htole32(f->firstchar);
+ h.numchars = htole32(f->numchars);
+ h.encoding = htole32(f->encoding);
+ h.fontwidth = htole32(f->fontwidth);
+ h.fontheight = htole32(f->fontheight);
+ h.stride = htole32(f->stride);
+ h.bitorder = htole32(f->bitorder);
+ h.byteorder = htole32(f->byteorder);
+
+ int wsfd = open(ofile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (wsfd < 0)
+ err(EXIT_FAILURE, "%s", ofile);
+
+ ssize_t nwritten;
+ nwritten = write(wsfd, &h, sizeof(h));
+ if (nwritten < 0)
+ err(EXIT_FAILURE, "%s", ofile);
+ if (nwritten != sizeof(h))
+ errx(EXIT_FAILURE, "%s: partial write", ofile);
+
+ nwritten = write(wsfd, buffer, buflen);
+ if (nwritten < 0)
+ err(EXIT_FAILURE, "%s", ofile);
+ if (nwritten != buflen)
+ errx(EXIT_FAILURE, "%s: partial write", ofile);
+ close(wsfd);
+}
+
+int
+write_header(const char *filename, struct wsdisplay_font *f, char *name,
+ char *buffer, int buflen)
+{
+ FILE *output;
+ int i, j, x, y, idx;
+ char fontname[64], c, msk;
+
+ /* now output as a header file */
+ snprintf(fontname, sizeof(fontname), "%s_%dx%d", name,
+ f->fontwidth, f->fontheight);
+ for (i = 0; i < strlen(fontname); i++) {
+ if (isblank((int)fontname[i]))
+ fontname[i]='_';
+ }
+ if ((output = fopen(filename, "w")) == NULL) {
+ fprintf(stderr, "Can't open output file %s\n", filename);
+ return -1;
+ }
+ fprintf(output, "static u_char %s_data[];\n", fontname);
+ fprintf(output, "\n");
+ fprintf(output, "static struct wsdisplay_font %s = {\n", fontname);
+ fprintf(output, "\t\"%s\",\t\t\t/* typeface name */\n", name);
+ fprintf(output, "\t%d,\t\t\t\t/* firstchar */\n", f->firstchar);
+ fprintf(output, "\t%d,\t\t\t\t/* numchars */\n", f->numchars);
+ fprintf(output, "\t%d,\t\t\t\t/* encoding */\n", f->encoding);
+ fprintf(output, "\t%d,\t\t\t\t/* fontwidth */\n", f->fontwidth);
+ fprintf(output, "\t%d,\t\t\t\t/* fontheight */\n", f->fontheight);
+ fprintf(output, "\t%d,\t\t\t\t/* stride */\n", f->stride);
+ fprintf(output, "\tWSDISPLAY_FONTORDER_L2R,\t/* bit order */\n");
+ fprintf(output, "\tWSDISPLAY_FONTORDER_L2R,\t/* byte order */\n");
+ fprintf(output, "\t%s_data\t\t/* data */\n", fontname);
+ fprintf(output, "};\n\n");
+ fprintf(output, "static u_char %s_data[] = {\n", fontname);
+ for (i = f->firstchar; i < f->firstchar + f->numchars; i++) {
+ fprintf(output, "\t/* %d */\n", i);
+ idx = i * f->stride * f->fontheight;
+ for (y = 0; y < f->fontheight; y++) {
+ for (x = 0; x < f->stride; x++) {
+ fprintf(output, "0x%02x, ",buffer[idx + x]);
+ }
+ fprintf(output, "/* ");
+ for (x = 0; x < f->stride; x++) {
+ c = buffer[idx + x];
+ msk = 0x80;
+ for (j = 0; j < 8; j++) {
+ fprintf(output, "%c",
+ (c & msk) != 0 ? '#' : ' ');
+ msk = msk >> 1;
+ }
+ }
+ fprintf(output, " */\n");
+
+ idx += f->stride;
+ }
+ }
+ fprintf(output, "};\n");
+ fclose(output);
+ return 0;
+}
+
+void
interpret(FILE *foo)
{
char line[128], *arg, name[64] = "foop", *buffer;
@@ -257,45 +355,17 @@
close(fdev);
}
else {
- struct wsfthdr h;
-
- memset(&h, 0, sizeof(h));
- strncpy(h.magic, "WSFT", sizeof(h.magic));
- strncpy(h.name, f.name, sizeof(h.name));
- h.firstchar = htole32(f.firstchar);
- h.numchars = htole32(f.numchars);
- h.encoding = htole32(f.encoding);
- h.fontwidth = htole32(f.fontwidth);
- h.fontheight = htole32(f.fontheight);
- h.stride = htole32(f.stride);
- h.bitorder = htole32(f.bitorder);
- h.byteorder = htole32(f.byteorder);
-
- int wsfd = open(ofile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if (wsfd < 0)
- err(EXIT_FAILURE, "%s", ofile);
-
- ssize_t nwritten;
- nwritten = write(wsfd, &h, sizeof(h));
- if (nwritten < 0)
- err(EXIT_FAILURE, "%s", ofile);
- if (nwritten != sizeof(h))
- errx(EXIT_FAILURE, "%s: partial write", ofile);
-
- nwritten = write(wsfd, buffer, buflen);
- if (nwritten < 0)
- err(EXIT_FAILURE, "%s", ofile);
- if (nwritten != buflen)
- errx(EXIT_FAILURE, "%s: partial write", ofile);
- close(wsfd);
+ if (header == 0) {
+ write_wsf(ofile, &f, buffer, buflen);
+ } else
+ write_header(ofile, &f, name, buffer, buflen);
}
}
-
__dead void
usage()
{
- fprintf(stderr, "usage: bdfload [-vd] [-e encoding] [-o ofile.wsf] font.bdf\n");
+ fprintf(stderr, "usage: bdfload [-vdh] [-e encoding] [-o ofile.wsf] font.bdf\n");
exit(EXIT_FAILURE);
}
@@ -306,7 +376,7 @@
const char *encname = NULL;
int c;
- while ((c = getopt(argc, argv, "e:o:vd")) != -1) {
+ while ((c = getopt(argc, argv, "e:o:vdh")) != -1) {
switch (c) {
/* font encoding */
@@ -331,6 +401,10 @@
dump = 1;
break;
+ case 'h':
+ header = 1;
+ break;
+
case '?': /* FALLTHROUGH */
default:
usage();
Home |
Main Index |
Thread Index |
Old Index