Module Name:    src
Committed By:   macallan
Date:           Thu Apr 27 23:17:21 UTC 2017

Modified Files:
        src/sys/arch/sparc64/dev: ffb.c

Log Message:
- don't blindly copy attribute bits which we don't support or which make no
  sense in the attribute buffer
- support WSATTR_UNDERLINE
- remove unused function


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/sparc64/dev/ffb.c

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

Modified files:

Index: src/sys/arch/sparc64/dev/ffb.c
diff -u src/sys/arch/sparc64/dev/ffb.c:1.59 src/sys/arch/sparc64/dev/ffb.c:1.60
--- src/sys/arch/sparc64/dev/ffb.c:1.59	Sat Apr 22 15:07:49 2017
+++ src/sys/arch/sparc64/dev/ffb.c	Thu Apr 27 23:17:21 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffb.c,v 1.59 2017/04/22 15:07:49 macallan Exp $	*/
+/*	$NetBSD: ffb.c,v 1.60 2017/04/27 23:17:21 macallan Exp $	*/
 /*	$OpenBSD: creator.c,v 1.20 2002/07/30 19:48:15 jason Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.59 2017/04/22 15:07:49 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.60 2017/04/27 23:17:21 macallan Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -125,7 +125,6 @@ void	ffb_ras_init(struct ffb_softc *);
 void	ffb_ras_copyrows(void *, int, int, int);
 void	ffb_ras_erasecols(void *, int, int, int, long int);
 void	ffb_ras_eraserows(void *, int, int, long int);
-void	ffb_ras_do_cursor(struct rasops_info *);
 void	ffb_ras_fill(struct ffb_softc *);
 void	ffb_ras_invert(struct ffb_softc *);
 static void	ffb_ras_setfg(struct ffb_softc *, int32_t);
@@ -1087,20 +1086,44 @@ ffb_putchar_mono(void *cookie, int row, 
 		case 1: {
 			uint8_t *data8 = data;
 			uint32_t reg;
-			for (i = 0; i < he; i++) {
+			if (attr & WSATTR_UNDERLINE) {				
+				for (i = 0; i < he - 2; i++) {
+					reg = *data8;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 24);
+					data8++;
+				}
+				FBC_WRITE(sc, FFB_FBC_FONT, 0xff000000);
+				data8++;
 				reg = *data8;
 				FBC_WRITE(sc, FFB_FBC_FONT, reg << 24);
-				data8++;
+			} else {
+				for (i = 0; i < he; i++) {
+					reg = *data8;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 24);
+					data8++;
+				}
 			}
 			break;
 		}
 		case 2: {
 			uint16_t *data16 = data;
 			uint32_t reg;
-			for (i = 0; i < he; i++) {
+			if (attr & WSATTR_UNDERLINE) {				
+				for (i = 0; i < he - 2; i++) {
+					reg = *data16;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 16);
+					data16++;
+				}
+				FBC_WRITE(sc, FFB_FBC_FONT, 0xffff0000);
+				data16++;
 				reg = *data16;
 				FBC_WRITE(sc, FFB_FBC_FONT, reg << 16);
-				data16++;
+			} else {
+				for (i = 0; i < he; i++) {
+					reg = *data16;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 16);
+					data16++;
+				}
 			}
 			break;
 		}
@@ -1149,7 +1172,7 @@ ffb_putchar_aa(void *cookie, int row, in
 	FBC_WRITE(sc, FFB_FBC_BW, wi);
 
 	/* if we draw a space we're done */
-	if (c == ' ') return;
+	if (c == ' ') goto out;
 
 	/* now enable alpha blending */
 	ffb_ras_setfg(sc, fg);
@@ -1186,7 +1209,16 @@ ffb_putchar_aa(void *cookie, int row, in
 			ddest++;
 		}
 		dest += 2048;
-	} 
+	}
+out:
+	/* check if we need to draw an underline */
+	if (attr & WSATTR_UNDERLINE) {
+		dest =  sc->sc_sfb32 + ((y + he - 2) << 11) + x;
+		for (i = 0; i < wi; i++) {
+			*dest = 0xa0000000;
+			dest++;
+		}
+	}
 }
 
 int
@@ -1198,11 +1230,11 @@ ffb_allocattr(void *cookie, int fg, int 
 		bg = WS_DEFAULT_BG;
 	}
 	if (flags & WSATTR_REVERSE) {
-		*attrp = (bg & 0xff) << 24 | (fg & 0xff) << 16 | 
-		    (flags & 0xff);
+		*attrp = (bg & 0xff) << 24 | (fg & 0xff) << 16;
 	} else
-		*attrp = (fg & 0xff) << 24 | (bg & 0xff) << 16 | 
-		    (flags & 0xff);
+		*attrp = (fg & 0xff) << 24 | (bg & 0xff) << 16;
+	if (flags & WSATTR_UNDERLINE)
+		*attrp |= WSATTR_UNDERLINE;
 	return 0;
 }
 
@@ -1217,8 +1249,7 @@ ffb_init_screen(void *cookie, struct vco
 	ri->ri_width = sc->sc_width;
 	ri->ri_height = sc->sc_height;
 	ri->ri_stride = sc->sc_linebytes;
-	ri->ri_flg = RI_CENTER | RI_ENABLE_ALPHA | RI_PREFER_ALPHA |
-		     RI_FULLCLEAR;
+	ri->ri_flg = RI_CENTER | RI_ENABLE_ALPHA | RI_PREFER_ALPHA;
 
 	/*
 	 * we can't accelerate copycols() so instead of falling back to
@@ -1239,7 +1270,7 @@ ffb_init_screen(void *cookie, struct vco
 	ri->ri_bpos = 16;
 
 	rasops_init(ri, 0, 0);
-	ri->ri_caps = WSSCREEN_WSCOLORS;
+	ri->ri_caps = WSSCREEN_WSCOLORS | WSSCREEN_UNDERLINE | WSSCREEN_REVERSE;
 	rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight,
 		    sc->sc_width / ri->ri_font->fontwidth);
 

Reply via email to