git: 9front

Download patch

ref: 540f13f2494300be335b04bf53f821133335f597
parent: aa5e70e555d9cf046c9b3128563d3748b22a284b
author: Jacob Moody <moody@posixcafe.org>
date: Thu Jan 2 19:51:43 EST 2025

libmemdraw: change openmemsubfont() to accept rune minimum as argument

Subfonts for non ascii characters are offset by some minimum rune,
typically specified within the parent font file.  Because libmemdraw
only deals in subfonts, if we want to have it draw non ascii runes we
need some method of providing that base offset.

This function is only used in one place, so update the function
signature and fix the only caller.

--- a/sys/include/memdraw.h
+++ b/sys/include/memdraw.h
@@ -80,6 +80,7 @@
 	short	n;		/* number of chars in font */
 	uchar	height;		/* height of bitmap */
 	char	ascent;		/* top of bitmap to baseline */
+	Rune	min;		/* rune offset for first glyph in subfont */
 	Fontchar *info;		/* n+1 character descriptors */
 	Memimage	*bits;		/* of font */
 };
@@ -156,7 +157,7 @@
  * Subfont management
  */
 extern Memsubfont*	allocmemsubfont(char*, int, int, int, Fontchar*, Memimage*);
-extern Memsubfont*	openmemsubfont(char*);
+extern Memsubfont*	openmemsubfont(char*, Rune);
 extern void	freememsubfont(Memsubfont*);
 extern Point	memsubfontwidth(Memsubfont*, char*);
 extern Memsubfont*	getmemdefont(void);
--- a/sys/man/2/memdraw
+++ b/sys/man/2/memdraw
@@ -150,7 +150,7 @@
 .nf
 Memsubfont*	allocmemsubfont(char *name, int n, int height,
 	   int ascent, Fontchar *info, Memimage *i)
-Memsubfont*	openmemsubfont(char *name)
+Memsubfont*	openmemsubfont(char *name, Rune min)
 void	freememsubfont(Memsubfont *f)
 Point	memsubfontwidth(Memsubfont *f, char *s)
 Memsubfont*	getmemdefont(void)
--- a/sys/src/cmd/venti/srv/graph.c
+++ b/sys/src/cmd/venti/srv/graph.c
@@ -58,7 +58,7 @@
 #ifdef PLAN9PORT
 	smallfont = openmemsubfont(unsharp("#9/font/lucsans/lstr.10"));
 #else
-	smallfont = openmemsubfont("/lib/font/bit/lucidasans/lstr.10");
+	smallfont = openmemsubfont("/lib/font/bit/lucidasans/lstr.10", 0);
 #endif
 	black = memblack;
 	blue = allocrepl(DBlue);
--- a/sys/src/libmemdraw/openmemsubfont.c
+++ b/sys/src/libmemdraw/openmemsubfont.c
@@ -4,7 +4,7 @@
 #include <memdraw.h>
 
 Memsubfont*
-openmemsubfont(char *name)
+openmemsubfont(char *name, Rune min)
 {
 	Memsubfont *sf;
 	Memimage *i;
@@ -45,6 +45,7 @@
 		free(fc);
 		goto Err;
 	}
+	sf->min = min;
 	close(fd);
 	free(p);
 	return sf;
--- a/sys/src/libmemdraw/string.c
+++ b/sys/src/libmemdraw/string.c
@@ -25,6 +25,7 @@
 			}
 			s += w;
 		}
+		c -= f->min;
 		if(c >= f->n)
 			continue;
 		i = f->info+c;
@@ -58,6 +59,7 @@
 			}
 			s += w;
 		}
+		c -= f->min;
 		if(c >= f->n)
 			continue;
 		i = f->info+c;
--