Module Name:    src
Committed By:   mlelstv
Date:           Sat Apr 18 11:23:58 UTC 2015

Modified Files:
        src/sys/dev/rasops: rasops.c
        src/sys/dev/wsfont: wsfont.c wsfont.h

Log Message:
add "best match" algorithm to wsfont and use this instead of a private
function in rasops.


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.73 src/sys/dev/rasops/rasops.c
cvs rdiff -u -r1.57 -r1.58 src/sys/dev/wsfont/wsfont.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/wsfont/wsfont.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/rasops/rasops.c
diff -u src/sys/dev/rasops/rasops.c:1.72 src/sys/dev/rasops/rasops.c:1.73
--- src/sys/dev/rasops/rasops.c:1.72	Mon Aug 18 03:59:27 2014
+++ src/sys/dev/rasops/rasops.c	Sat Apr 18 11:23:58 2015
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops.c,v 1.72 2014/08/18 03:59:27 riastradh Exp $	*/
+/*	 $NetBSD: rasops.c,v 1.73 2015/04/18 11:23:58 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.72 2014/08/18 03:59:27 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.73 2015/04/18 11:23:58 mlelstv Exp $");
 
 #include "opt_rasops.h"
 #include "rasops_glue.h"
@@ -181,57 +181,6 @@ void	rasops_make_box_chars_alpha(struct 
 extern int cold;
 
 /*
- * Rate a font based on how many character cells we would get out of it in the
- * current video mode. Lower is better.
- */
-static void
-rasops_matches(struct wsdisplay_font *font, void *cookie, int ident)
-{
-	struct rasops_matchdata *md = cookie;
-	struct rasops_info *ri = md->ri;
-	int cols, score = 1;
-
-	/* first weed out fonts the caller doesn't claim support for */
-	if (FONT_IS_ALPHA(font)) {
-		/*
-		 * If we end up with a bitmap font and an alpha font with
-		 * otherwise identical scores, prefer alpha
-		 */
-		score = 0;
-		if ((ri->ri_flg & RI_ENABLE_ALPHA) == 0)
-			return;
-	}
-	cols = ri->ri_width / font->fontwidth;
-	/*
-	 * if the font is too small to allow 80 columns give those closer to
-	 * 80 a better score but with a huge penalty compared to fonts that
-	 * give us 80 columns or more
-	 */ 
-	if (cols < md->wantcols) {
-		score += 100000 + 2 * (md->wantcols - cols);
-	} else 
-		score += 2 * cols;
-	DPRINTF("%s: %d\n", font->name, score);
-	if (score < md->bestscore) {
-		md->bestscore = score;
-		md->pick = font;
-		md->ident = ident;
-	}
-}
-
-static int
-rasops_find(struct rasops_info *ri, int wantrows, int wantcols)
-{
-	struct rasops_matchdata md =
-	    { ri, wantcols, wantrows, 1000000, NULL, 0};
-
-	wsfont_walk(rasops_matches, &md);
-	if (md.pick == NULL)
-		return -1;
-	return (wsfont_make_cookie(md.ident, WSDISPLAY_FONTORDER_L2R,
-			    WSDISPLAY_FONTORDER_L2R));
-}
-/*
  * Initialize a 'rasops_info' descriptor.
  */
 int
@@ -243,6 +192,7 @@ rasops_init(struct rasops_info *ri, int 
 	/* Select a font if the caller doesn't care */
 	if (ri->ri_font == NULL) {
 		int cookie = -1;
+		int flags;
 
 		wsfont_init();
 
@@ -254,7 +204,18 @@ rasops_init(struct rasops_info *ri, int 
 			wantrows = RASOPS_DEFAULT_HEIGHT;
 		if (wantcols == 0)
 			wantcols = RASOPS_DEFAULT_WIDTH;
-		cookie = rasops_find(ri, wantrows, wantcols);
+
+		flags = WSFONT_FIND_BESTWIDTH | WSFONT_FIND_BITMAP;
+		if ((ri->ri_flg & RI_ENABLE_ALPHA) != 0)
+			flags |= WSFONT_FIND_ALPHA;
+
+		cookie = wsfont_find(NULL,
+			ri->ri_width / wantcols,
+			0,
+			0,
+			WSDISPLAY_FONTORDER_L2R,
+			WSDISPLAY_FONTORDER_L2R,
+			flags);
 
 		/*
 		 * this means there is no supported font in the list

Index: src/sys/dev/wsfont/wsfont.c
diff -u src/sys/dev/wsfont/wsfont.c:1.57 src/sys/dev/wsfont/wsfont.c:1.58
--- src/sys/dev/wsfont/wsfont.c:1.57	Sun Jan 25 20:09:42 2015
+++ src/sys/dev/wsfont/wsfont.c	Sat Apr 18 11:23:58 2015
@@ -1,4 +1,4 @@
-/* 	$NetBSD: wsfont.c,v 1.57 2015/01/25 20:09:42 christos Exp $	*/
+/* 	$NetBSD: wsfont.c,v 1.58 2015/04/18 11:23:58 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.57 2015/01/25 20:09:42 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.58 2015/04/18 11:23:58 mlelstv Exp $");
 
 #include "opt_wsfont.h"
 
@@ -570,6 +570,7 @@ int
 wsfont_matches(struct wsdisplay_font *font, const char *name,
 	       int width, int height, int stride, int flags)
 {
+	int score = 10000;
 
 	/* first weed out fonts the caller doesn't claim support for */
 	if (FONT_IS_ALPHA(font)) {
@@ -583,8 +584,16 @@ wsfont_matches(struct wsdisplay_font *fo
 	if (height != 0 && font->fontheight != height)
 		return (0);
 
-	if (width != 0 && font->fontwidth != width)
-		return (0);
+	if (width != 0) {
+		if ((flags & WSFONT_FIND_BESTWIDTH) == 0) {
+			if (font->fontwidth != width)
+				return (0);
+		} else {
+			if (font->fontwidth > width)
+				return (0);
+			score -= min(width - font->fontwidth, 9999);
+		}
+	}
 
 	if (stride != 0 && font->stride != stride)
 		return (0);
@@ -592,19 +601,27 @@ wsfont_matches(struct wsdisplay_font *fo
 	if (name != NULL && strcmp(font->name, name) != 0)
 		return (0);
 
-	return (1);
+	return (score);
 }
 
 int
 wsfont_find(const char *name, int width, int height, int stride, int bito, int byteo, int flags)
 {
-	struct font *ent;
+	struct font *ent, *bestent = NULL;
+	int score, bestscore = 0;
 
 	TAILQ_FOREACH(ent, &list, chain) {
-		if (wsfont_matches(ent->font, name, width, height, stride, flags))
-			return (wsfont_make_cookie(ent->cookie, bito, byteo));
+		score = wsfont_matches(ent->font, name,
+				width, height, stride, flags);
+		if (score > bestscore) {
+			bestscore = score;
+			bestent = ent;
+		}
 	}
 
+	if (bestent != NULL)
+		return (wsfont_make_cookie(bestent->cookie, bito, byteo));
+
 	return (-1);
 }
 

Index: src/sys/dev/wsfont/wsfont.h
diff -u src/sys/dev/wsfont/wsfont.h:1.24 src/sys/dev/wsfont/wsfont.h:1.25
--- src/sys/dev/wsfont/wsfont.h:1.24	Wed Jan 11 15:52:32 2012
+++ src/sys/dev/wsfont/wsfont.h	Sat Apr 18 11:23:58 2015
@@ -1,4 +1,4 @@
-/* 	$NetBSD: wsfont.h,v 1.24 2012/01/11 15:52:32 macallan Exp $	*/
+/* 	$NetBSD: wsfont.h,v 1.25 2015/04/18 11:23:58 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002 The NetBSD Foundation, Inc.
@@ -62,9 +62,10 @@ struct wsdisplay_font;
 void	wsfont_init(void);
 int	wsfont_matches(struct wsdisplay_font *, const char *, int, int, int, int);
 int	wsfont_find(const char *, int, int, int, int, int, int);
-#define WSFONT_FIND_BITMAP	1
-#define WSFONT_FIND_ALPHA	2
+#define WSFONT_FIND_BITMAP	0x01
+#define WSFONT_FIND_ALPHA	0x02
 #define WSFONT_FIND_ALL		0xff
+#define WSFONT_FIND_BESTWIDTH	0x1000
 void	wsfont_walk(void (*)(struct wsdisplay_font *, void *, int), void *);
 
 int	wsfont_add(struct wsdisplay_font *, int);

Reply via email to