summary refs log tree commit diff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bin/man/psfed.15
-rw-r--r--bin/psfed.c22
2 files changed, 26 insertions, 1 deletions
diff --git a/bin/man/psfed.1 b/bin/man/psfed.1
index f0709594..11f0fb94 100644
--- a/bin/man/psfed.1
+++ b/bin/man/psfed.1
@@ -8,6 +8,7 @@
 .
 .Sh SYNOPSIS
 .Nm
+.Op Fl H Ar height
 .Op Fl g Ar glyphs
 .Op Fl h Ar height
 .Op Fl w Ar width
@@ -22,6 +23,10 @@ for the Linux framebuffer.
 The arguments are as follows:
 .
 .Bl -tag -width Ds
+.It Fl H Ar height
+Modify the height of an existing font.
+Only increasing the height is allowed.
+.
 .It Fl g Ar glyphs
 Set the number of glyphs in a new font.
 The default number of glyphs is 256.
diff --git a/bin/psfed.c b/bin/psfed.c
index b51da092..307e32b4 100644
--- a/bin/psfed.c
+++ b/bin/psfed.c
@@ -504,10 +504,12 @@ int main(int argc, char *argv[]) {
 	uint32_t newLen = 256;
 	uint32_t newWidth = 8;
 	uint32_t newHeight = 16;
+	uint32_t setHeight = 0;
 
 	int opt;
-	while (0 < (opt = getopt(argc, argv, "g:h:w:"))) {
+	while (0 < (opt = getopt(argc, argv, "H:g:h:w:"))) {
 		switch (opt) {
+			break; case 'H': setHeight = strtoul(optarg, NULL, 0);
 			break; case 'g': newLen = strtoul(optarg, NULL, 0);
 			break; case 'h': newHeight = strtoul(optarg, NULL, 0);
 			break; case 'w': newWidth = strtoul(optarg, NULL, 0);
@@ -520,6 +522,24 @@ int main(int argc, char *argv[]) {
 	path = strdup(argv[optind]);
 	fileRead(newLen, newWidth, newHeight);
 
+	if (setHeight) {
+		if (setHeight < header.glyph.height) {
+			errx(EX_CONFIG, "cannot decrease height");
+		}
+
+		uint32_t setSize = bytes(header.glyph.width) * setHeight;
+		uint8_t *setGlyphs = calloc(header.glyph.len, setSize);
+		for (uint32_t i = 0; i < header.glyph.len; ++i) {
+			memcpy(&setGlyphs[setSize * i], glyph(i), header.glyph.size);
+		}
+		free(glyphs);
+		glyphs = setGlyphs;
+
+		header.glyph.height = setHeight;
+		header.glyph.size = setSize;
+		normal.modified = true;
+	}
+
 	frameOpen();
 	frameClear();