shithub: riscv

Download patch

ref: 9e0913fa71697863f3e9ca155e3b1f67a69bdb7c
parent: a1015612231e511ef11ecda9c48179a47a1ba980
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;
--